Spring底层原理--第一篇容器接口及其扩展

一、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的定义中指定销毁方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值