一、前言
1、Spring框架运用了非常多的设计模式,从整体上看,它的设计严格遵循了OCP---开闭原则,即
【1】保证对修改关闭,即外部无法修改Spring整个运作的流程
【2】提供对扩展开放,即可以通过继承、实现Spring提供的众多抽象类与接口来改变类加载的行为
二、BeanNameAware、ApplicationContextAware和BeanFactoryAware
1、实现BeanNameAware接口,在加载过程中可以获取到该Bean的ID
2、实现ApplicationContextAware接口,在加载过程中可以获取到ApplicationContext上下文
3、实现BeanFactroyAware接口,在加载过程中可以获取到该Bean的BeanFactory
三、InitialingBean和DisposableBean -- 举例ExtConsumerConfig
1、initialingBean是一个接口,提供了唯一的方法afterpropertiesSet()
2、DisposibleBean也是一个接口,提供了唯一的方法destory()
【1】执行顺序:接口优先于配置,即 initialingBean>init-method; DisposibleBean>destroy-method
【2】执行机制: initialingBean和 DisposibleBean底层使用类型强转.方法名()进行直接调用; init-method和 destroy-method使用反射
四、FactoryBean
1、传统Spring容器加载一个Bean的整个过程都是由Spring控制的,开发者除了设置Bean的相关属性外,没有太多自主权
2、FactoryBean改变了这一点,开发者可以个性化的定制自己想要实例化出来的Bean
IAnimal接口:
Cat实现类:
Dog实现类:
FactoryBean实现类:
JunitTest(XML中配置省略,把 FactoryBeanTest配置到Bean即可 || 或者用@Service注解 ):
五、BeanPostProcessor -- 举例:AnnotationBeanProcessor
单个Bean控制其初始化的操作
每个(所有Bean加载前后都会调下面方法)Bean生成前后执行一些逻辑;有两个接口:
【1】postProcessorBeforeInitializing:在初始化Bean之前执行
【2】postProcessorAfterInitializing:在初始化Bean之后执行
单个Bean生命周期如下(从下面打印日志可以看出BeanTest类的执行顺序):
六、BeanFactoryPostProcessor
1、实现自BeanFactoryPostProcessor,即可以在Spring创建Bean之前,读取Bean的元属性,并根据需要对元属性进行修改,比如将Bean的scope从singleton改变为prototype
高于BeanPostProcessor
一次
七、InstantiationAwareBeanPostProcessor
实例化
2、实例化 --- 实例化的过程是一个创建Bean的过程,即调用Bean的构造函数,单例的Bean放入单例池中
初始化 --- 初始化的过程是一个赋值的过程,即调用Bean的setter,设置Bean的属性
3、之前的BeanPostProcessor作用于2过程,现在这个类则作用于1过程