Spring Bean 生命周期
bean 生命周期 执行流程

- 推断构造方法(实例化)
-
实例化时,会根据构造方法 参数的 byType、byName去寻找单例bean
-
当只有一个构造方法时
可以是无参构造 可以是有参构造,根据byType寻找单例bean 当找到的单例bean有多个时,判断是否有和byName相同的bean对象,有则使用,没有则报错(不知道选哪个bean) 当找到的单例bean只有一个时,无论byName是否相同,直接使用该bean对象 当有多个构造方法时 判断有没有无参构造方法 有则使用该构造方法 没有则报错(不知道用哪个构造方法)
- 属性填充(依赖注入)
- 实例化后的对象被封装在BeanWrapper对象中
- Spring根据BeanDefinition中的信息 以及 通过BeanWrapper提供的设置属性的接口完成依赖注入
- 处理Aware接口
-
Spring会检测该对象是否实现了xxxAware接口,并将相关的xxxAware实例注入给Bean
如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,此处传递的就是Spring配置文件中Bean的id值 如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory()方法,传递的是Spring工厂自身 如果这个Bean已经实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文
- postProcessBeforeInitialization
- 如果想对Bean进行一些自定义的处理,那么可以让Bean实现了BeanPostProcessor接口,并重写postProcessBeforeInitialization(Object obj, String s)方法
- InitializingBean 与 init-method
- 如果实例化的Bean实现了InitializingBean接口,则会自动调用其配置的初始化方法
- 如果Bean在Spring配置文件中配置了 init-method 属性,则会自动调用其配置的初始化方法
- postProcessAfterInitialization(AOP)
-
如果Bean实现了BeanPostProcessor接口,并重写了postProcessAfterInitialization(Object obj, String s)方法,则spring会调用该方法
-
同时会进行AOP相关操作
找出所有的切面 判断有没有切点是当前bean,有则进行动态代理,返回代理对象
- DisposableBean 与 destroy-method
- 当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用其实现的destroy()方法
- 如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法
验证
- 手动定义一个bean,并进行上述各个方法的调用,验证上述bean的执行流程
@Component
public class UserService implements BeanNameAware, InitializingBean, DisposableBean {
private UserService() {
// 111
System.out.println("111");
}
// 222
@Autowired
private OrderService orderService;
@Override
public void setBeanName(String s) {
// 333
System.out.println("333");
}
@Override
public void afterPropertiesSet() throws Exception {
// 555
System.out.println("555");
}
@Override
public void destroy() throws Exception {
// 777
System.out.println("777");
}
}
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if ("userService".equals(beanName)) {
// 444
System.out.println("444");
}
return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if ("userService".equals(beanName)) {
// 666
System.out.println("666");
}
return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
}
}
本文详细介绍了Spring框架中Bean的生命周期,包括Bean的实例化过程、属性填充、依赖注入、Aware接口处理、初始化前后处理、AOP操作及销毁过程。通过一个具体的例子展示了Bean生命周期中的关键步骤。
1798

被折叠的 条评论
为什么被折叠?



