一、BeanFactory与ApplicationContext
BeanFactory是ApplicationContext的父接口,是spring的核心容器。spring中的控制反转,依赖注入,以及bean的生命周期的管理都由BeanFactory的实现类提供。
ApplicationContext组合了BeanFactory的功能:
1、MessageSource接口:提供了处理国际化资源的能力
2、ResourcePatternResolver接口:提供了通配符匹配资源的能力
3、ApplicationEventPublisher:提供了事件发布的能力(解耦)
4、EnvironmentCapable:提供了读取环境信息的能力
ApplicationContext的四种实现:
1、ClassPathXmlApplicationContext :通过读取类路径下的xml配置文件实现
2、FileSystemXmlApplicationContext :通过读取磁盘路径下的xml配置文件实现
3、AnnotationConfigApplicationContext :非web环境下基于配置类的实现
4、AnnotationConfigServletWebServerApplicationContext :web环境下基于配置类的实现
二、Bean的生命周期及Bean的后处理器
Bean生命周期的分为四个阶段:
创建、依赖注入、初始化、销毁
Bean的后处理器:
AutowiredAnnotationBeanPostProcessor :解析@Autowired、@Value注解
CommonAnnotationBeanPostProcessor : 解析@Resource、@PostConstruct、@PreDestroy注解
ConfigurationPropertiesBindingPostProcessor :解析@ConfigurationProperties注解
BeanFactory的后处理器:
ConfigurationClassPostProcessor :解析@ComponentScan、@Bean、@Import、@ImportResource注解
MapperScannerConfigurer :解析@MapperScanner注解
@Override
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException{
log.debug("实例化之前执行,这里返回的对象会替换掉原本的 bean");
return null;
}
@Override
public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException{
log.debug("实例化之后执行,这里如果返回false,会跳过依赖注入阶段");
return true;
}
@override
public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException{
log.debug("依赖注入阶段执行");
return pvs;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException{
log.debug("初始化之前执行,这里返回的对象会替换掉原本的 bean");
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException{
log.debug("初始化之后执行,这里返回的对象会替换掉原本的 bean");
return bean;
}
@Override
public void postProcessBeforeDestruction(Object bean, String beanName) throws BeansException{
log.debug("销毁之前执行");
}
三、Aware接口和InitializingBean接口
Aware接口提供了一种内置的注入手段,可以注入BeanFactory,ApplicationContext。
InitializingBean提供了一种内置的初始化手段,用来初始化Bean。
两者都是容器的内置功能,不需要借助后处理器就可完成注入,扩展功能会失效,而内置功能不会。
四、@Autowired失效分析
java配置类中不包含BeanFactoryPostProcessor的情况
此时容器会先执行BeanFactoryPostProcessor,再注册BeanPostProcessor,然后创建和初始化单例。在创建和初始化单例的过程中会调用Bean的后处理器来解析@Autowired、@Value、@PostConstruct等注解。最后执行容器内置的Aware和InitializingBean接口,单例创建成功。
java配置类中包含BeanFactoryPostProcessor的情况
此时如果BeanFctoryPostProcessor要被执行必须提前创建java配置类,而这时Bean的后处理器并没有被注册,因此会执行容器内置的Aware和InitializingBean进行创建和初始化。单例创建成功后才会执行BeanFactoryPostProcessor,最后注册Bean的后处理器,就会导致@Autowired等注解失效。
五、Spring的初始化和销毁手段及其运行顺序
三种初始化手段及顺序:
1、通过Bean的后处理器解析@PostConstruct
2、实现InitailizingBean接口重写afterPropertiesSet方法
3、在Bean的定义中指定初始化方法
三种销毁手段及顺序:
1、通过Bean的后处理器解析@PreDestroy
2、实现DisposableBean接口重写destroy方法
3、在Bean的定义中指定销毁方法