九零后大叔
技术人的点点滴滴

beanfactory篇-(九)BeanDefinitionRegistryPostProcessor接口的使用

回顾:通过前面一个章节的了解,我们学会了InstantiationAwareBeanPostProcessor接口的基本用法。实现这个接口,可以使得开发者在创建某个bean的前前后后的各个环节都有机会介入进来,对该bean做各种定制处理。这种处理有可能是替换,有可能是包装,有可能是进一步的初始化。总之spring提供了强大的扩展功能给开发者,方便他们的实现自己的定制需求。本章节,我们学习一个新的接口,就是BeanDefinitionRegistryPostProcessor接口。


1. BeanDefinitionRegistryPostProcessor接口的基本概念介绍

BeanDefinitionRegistryPostProcessor接口继承至BeanFactoryPostProcessor接口,并在其基础上扩展了功能,我们看看具体的使用。


2. BeanDefinitionRegistryPostProcessor接口的基本使用

第一步:创建一个User实体类

@Data
@NoArgsConstructor
@ToString
@EqualsAndHashCode
public class User implements Serializable {

    private static final long serialVersionUID = 4800166777883697833L;

    private Long id;
    private String name;
    private String identity;
    private String mobile;
    private String bankcard;
    private Integer age;
    private Integer gender;

}

第二步:我们创建一个接口和接口实现类

public interface UserService {

    User findUserById(Long id);

}

public class UserServiceImpl implements UserService {

    @Override
    public User findUserById(Long id) {

        User user = new User();
        user.setId(id);
        user.setName("张山");
        user.setIdentity("张山");
        user.setBankcard("36457736355363");
        user.setMobile("16752652625");
        user.setGender(2);
        user.setAge(18);

        return user;
    }

}

第三步:创建BeanDefinitionRegistryPostProcessor接口的实现类如下:

@Component
public class GlobalBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {

    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        System.out.println("Execute postProcessBeanDefinitionRegistry.");

        //除了xml配置,@Service外,这里是第三种注册bean信息的方式,也就是代码中做注册
        GenericBeanDefinition gbd = new GenericBeanDefinition();
        gbd.setBeanClass(UserServiceImpl.class);
        gbd.setScope(BeanDefinition.SCOPE_SINGLETON);
        gbd.setAutowireCandidate(true);
        registry.registerBeanDefinition("userService", gbd);
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        System.out.println("Execute postProcessBeanFactory.");
    }
}

第四步:我们在applicationContext.xml文件中配置相应的信息

<context:component-scan base-package="com.minesoft.tutorial" />

完成上述的步骤之后,我们运行一下下面的代码片段

XmlBeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
UserService userService = beanFactory.getBean(UserService.class);
User user = userService.findUserById(100L);
System.out.println(JSONObject.toJSONString(user));

控制台成功的输出了User信息,本接口功能和BeanFactoryPostProcessor接口基本类似。如果业务中创建两个类GlobalBeanDefinitionRegistryPostProcessor和GlobalBeanFactoryPostProcessor分别实现
BeanDefinitionRegistryPostProcessor接口和BeanFactoryPostProcessor接口,那么GlobalBeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry和postProcessBeanFactory方法会被先调用,而GlobalBeanFactoryPostProcessor类的postProcessBeanFactory方法会被后调用。


更多知识请关注公众号

赞(0) 赏一下
未经允许不得转载:九零后大叔的技术博客 » beanfactory篇-(九)BeanDefinitionRegistryPostProcessor接口的使用
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

九零后大叔的技术博客

联系我们联系我们

感谢您的支持

支付宝扫一扫打赏

微信扫一扫打赏