一、前言


    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过程