spring中提供了很多扩展点,用来给程序员自己去扩展,从而达到插手bean的实例化过程,那么接下来就简单的介绍几个spring自己提供的几个扩展类,并概述他们的作用;
有兴趣的同学,建议通读spring源码,让你从一个萌新提升为一个技术大牛;从而摆脱重复搬砖的工作;好了,废话少说,上菜:
- beanPostProsessor
插手bean的实例化过程,在bean还没有被spring的bean管理器管理之前做一些事情;
经典案例:a: @PostConstruct,postConstruct可以处理我们bean的生命周期回调;
b: AOP,我们的AOP也是依据beanPostProcessor原理来实现的;
2. BeanFactoryPostProcessor
springBean容器中任意的一个bean被实例化之前执行,它有参与我们bean工厂的建设过程功能,其中这里面包括spring自有的以及我们我们自己定义的(我们自己定义的不是加了注解的,而是我们手动添加的,你可以实现BeanFactoryPostProcessor,也可以实现它的子类BeanDefinitionRegistryPostProcessor,它的执行顺序是先执行程序员自己定义的然后再执行spring的,先执行实现BeanDefinitionRegistryPostProcessor的,后执行实现BeanFactoryPostProcessor,不要问我为什么,spring源码就是这样写的)这个类里面的这个方法PostProcessBeanFactory(...)这个方法就可以实现在配置类上加上cglib动态代理。;
附上一段我自己定义的代码,看下什么是手动添加:
//测试自定义的BeanFactoryPostProcessor
// BeanFactoryPostProcessor beanFactoryPostProcessor = new MyBeanFactoryPostProcessor();
// annotationConfigApplicationContext.addBeanFactoryPostProcessor(beanFactoryPostProcessor);
//测试我们自己定义的BeanDefinitionRegistryPostProcessor
// BeanFactoryPostProcessor beanFactoryPostProcessor1 = new MyBeanDefinitionRegistryPostProcessor();
// annotationConfigApplicationContext.addBeanFactoryPostProcessor(beanFactoryPostProcessor1);
3.BeanDefinitionRegistryPostProcessor
上面已经提到过,是BeanFactoryPostProcessor的子类,其中有个经典的就是我们spring自带的一个类 ConfigurationClassPostProcessor,这个类是实现了BeanDefinitionRegistryPostProcessor接口,它可以完成对我们bean的扫描,以及3种import的处理,以及@Bean的扫描,还有判断我们的配置类是否是一个完整的配置类,也就是是否有@Configuration注解,来判断是否使用cglib代理;
4.ImportSelector
看下这个接口的方法
String[] selectImports(AnnotationMetadata importingClassMetadata);
实际上它可以返回一个我们bd的数组,它可以对bd层面进行一些操作;
5.ImportBeanDefinitionRegistrar
这个接口其实是对ImportSelector这个接口的功能扩展,来看下它里面的方法
public void registerBeanDefinitions( AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry);
这里我们可以拿到BeanDefinitionRegistry,有了这个类我们可以把对bean做一些处理,其实mybatis就是实现了这个接口来进行它的一系列操作的;
新手,写博客很随意,不喜勿喷!!!!!