加载过程
-
加载配置文件
spring在启动的时候会先创建BeanFactory的示例,BeanFactory是一个接口具体实现主要使用的是:ApplicationContext。它会读取XML的bean配置或者使用注解配置的类,将这个bean配置为BeanDefinition对象
-
实例化bean
解析完成bean的定义后,会调用createBeanInstance() 方法创建bean的实例,相当于操作符 new
-
设置bean的属性
在populateBean()方法中,Spring会使用AurowiredAnnotationBeanPostPrecessor等后置处理器,进行依赖注入,将bean的属性设置到Bean的实例中。
-
调用初始化方法
这里会调用initializeBean()方法初始化。如果Bean实现了InitializingBean接口或配置了init-method,则会在这一步调用初始化方法。
-
注册bean
完成初始化后,Spring会将Bean注册到BeanFactory的容器中,以便后续能够根据Bean的名称或类型获取到Bean实例。
-
bean的后置处理器
在Bean创建过程中,Spring会应用注册的BeanPostProcessor,如CommonAnnotationBeanPostProcessor等,来对Bean进行增强处理,例如AOP代理、事件发布等。
-
完成bean的创建
Bean已经被实例化、属性注入、初始化,并且注册到容器中,可以被其他Bean或应用程序使用。
实际使用
-
实现了InstantiationAwareBeanPostProcessor 对Bean的创建过程进行定制
@Component
public class MyBeanPostProcessor implements InstantiationAwareBeanPostProcessor, DestructionAwareBeanPostProcessor {
private static final Logger log = LoggerFactory.getLogger(MyBeanPostProcessor.class);
// 实例化之前
@Override
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
if (beanName.equals("lifeCycleBean")) {
log.info("初始化之前执行, 这里返回的bean会替换原版本的bean");
}
return null;
}
// 实例化之后
@Override
public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
if (beanName.equals("lifeCycleBean")) {
log.info("实例化之后执行, 这里返回false会跳过依赖注入阶段");
//return false;
}
return true;
}
// 依赖注入阶段执行
@Override
public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {
if(beanName.equals("lifeCycleBean")){
log.info("依赖注入阶段执行, 如@Autowired, @Value, @Resource");
}
return pvs;
}
// 初始化之前
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if(beanName.equals("lifeCycleBean")){
log.info("初始化之前执行, 这里返回的对象会替换原本的bean, 如@PostConstruct, @ConfigurationProperties");
}
return bean;
}
// 初始化之后执行
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (beanName.equals("lifeCycleBean")) {
log.info("初始化之后执行, 这里返回的对象会替换原本的bean, 如代理增强");
}
return bean;
}
// 销毁之前
@Override
public void postProcessBeforeDestruction(Object bean, String beanName) throws BeansException {
if(beanName.equals("lifeCycleBean")){
log.info("销毁之前执行, 如 @PreDestroy");
}
}
}