spring里使用了很多设计模式,也遵循着软件设计里的‘开闭’原则:
- 保证对修改关闭,外部无法修改spring的整体运行流程
- 保证对扩展开放,spring提供了指定的扩展点,以适应特定场景需求
spring提供的扩展点有:
InitializingBean和DisposableBean - InitializingBean是一个接口,提供了一个唯一的方法afterPropertiesSet()。这个方法是在Bean属性都设置完毕后调用afterPropertiesSet()方法做一些初始化的工作
- DisposableBean也是一个接口,提供了一个唯一的方法destory()。这个方法是在Bean的生命周期结束后执行
两接口可以配合init-method、destory-method使用,接口执行顺序优先于配置
BeanNameAware、ApplicationContextAware和BeanFactoryAware - 实现BeanNameAware接口的Bean,在Bean加载的过程中可以获取到该Bean的id
- 实现ApplicationContextAware接口的Bean,在Bean加载的过程中可以获取到Spring的ApplicationContext,这个尤其重要,ApplicationContext是Spring应用上下文,从ApplicationContext中可以获取包括任意的Bean在内的大量Spring容器内容和信息
- 实现BeanFactoryAware接口的Bean,在Bean加载的过程中可以获取到加载该Bean的BeanFactory
FactoryBean - 可以个性化地定制自己想要实例化出来的Bean,方法就是实现FactoryBean接口。
BeanPostProcessor
之前的InitializingBean、DisposableBean、FactoryBean包括init-method和destory-method,针对的都是某个Bean控制其初始化的操作,而BeanPostProcessor可以针对每个Bean的生成前后做一些逻辑操作,这个接口里有两个方法: - postProcessBeforeInitialization:在初始化Bean之前
- postProcessAfterInitialization:在初始化Bean之后
BeanFactoryPostProcessor
Spring允许在Bean创建之前,读取Bean的元属性,并根据自己的需求对元属性进行改变,比如将Bean的scope从singleton改变为prototype,最典型的应用应当是PropertyPlaceholderConfigurer,替换xml文件中的占位符,替换为properties文件中相应的key对应的value
InstantiationAwareBeanPostProcessor - 上面的BeanPostProcessor是对bean进行初始化。初始化的过程是一个赋值的过程,即调用Bean的
setter,设置Bean的属性 - InstantiationAwareBeanPostProcessor是对bean进行实例化。实例化的过程是一个创建Bean的过程,即调用Bean的构造函数,单例的Bean放入单例池中
一般会继承InstantiationAwareBeanPostProcessorAdapter这个抽象类来实现