1、BeanPostProcessor
在bean生命周期中介绍过此接口,它包含两个方法
- postProcessBeforeInitialization触发的时机:before container initialization methods,在InitializingBean.afterPropertiesSet() 或 init方法之前。
- postProcessAfterInitialization:bean初始化之后,bean销毁之前。
beanPostProcessor生效,需要将接口的实现类注入到IOC容器中。配置文件方式下定义bean标签,必须在所有bean之前。注解方式下使用@Component注解即可,并把类所在的包添加到IOC扫描路径中。
2、PropertyPlaceHolderConfigurer
这个接口对应原著中的1.8.2,它主要负责将占位符替换为实际的值。默认情况下,它会在IOC容器中查找变量,顺序是
- 命令行参数,如果是Web项目,查找context-param和context-config
- JVM系统变量,操作系统变量
- 配置文件,例如spring.properties
- 自定义变量,自定义的Property文件。
也可以直接在该类上配置Property文件和自定义变量,这样会改变查找的顺序。这些自定义变量和自定义Property文件具有最高优先级
<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"> <!-- 引入自定义的jdbc配置文件 --> <property name="locations" value="classpath:resources/jdbc.properties"/> <!-- 自定义变量 --> <property name="properties"> <value>message=Hello World</value> </property> </bean>
也可以配置systemPropertiesMode指定变量的查找顺序。它的值有三种
- Never(0):忽略系统变量,不在查找JVM系统变量和操作系统变量
- Fallback(1):先查找配置文件,之后查找系统环境变量。默认值
- Override(2):先查找系统环境变量,后查找配置文件。
<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"> <!-- 配置systemPropertiesMode属性 --> <property name="systemPropertiesMode" value="1"> </bean>
它的功能类似@PropertySource注解,在IOC容器中引入Property变量。
3、PropertyOverrideConfigurer
与PropertyPlaceHolderConfigurer功能类似,唯一区别是前者找到变量即返回,后者找到变量之后继续查找,后续的同名变量会覆盖之前的变量。
4、FactoryBean
这个接口对应原著中的1.8.3小节,它主要负责创建对象的具体逻辑。包含三个方法
- getObject:返回被创建的对象
- isSingleton:创建bean的作用域是否是singleton,是返回true,否返回false。
- getObjectType:返回被创建对象的类型,方法的返回值为Class。
5、BeanFactory
在介绍applicationContext接口时,它抽象的代表IOC容器,它本身并不提供任何的功能,所有的功能都是委托给它继承的接口,例如加载资源文件是ResourcePatternResolver,国际化是MessageSource,发布事件是ApplicationEventPublisher,核心功能bean的注入,配置,获取等功能是BeanFactory。
applicationContext实现了BeanFactory其中两个子接口ListableBeanFactory和HierarchicalBeanFactory。
其中ListableBeanFacotry代表bean的容器,获取bean,查询bean是否存在,统计bean的数量等等都在此接口中定义,
HierarchicalBeanFactory代表容器的树形结构,即IOC容器也有父容器,子容器等概念。
applicationContext整合了许多接口的功能。原著中BeanFactory与applicationContext的对比。
功能描述 |
BeanFactory |
applicationContext |
实体类的自动注入和创建 |
是 |
是 |
管理实体类的生命周期 |
否 |
否 |
自动注入BeanPostProcessor 和 BeanFactoryPostProcessor |
否 |
是 |
支持国际化 |
否 |
是 |
事件发布机制 |
否 |
是 |
在原著的最后介绍如果没有applicationContext,如何使用BeanFactory实现IOC容器的功能,可以看到其实较为繁琐。具体参考1.16小节