beanfactory篇-(九)BeanDefinitionRegistryPostProcessor接口的使用-九零后大叔的技术博客

沙海
沙海
沙海
1017
文章
2
评论
2021年4月24日09:20:06
评论
2 2574字阅读8分34秒
摘要

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

beanfactory篇-(九)BeanDefinitionRegistryPostProcessor接口的使用-九零后大叔的技术博客

更多知识请关注公众号

继续阅读
weinxin
资源分享QQ群
本站是一个IT技术分享社区, 会经常分享资源和教程; 分享的时代, 请别再沉默!
沙海
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: