spring中bean初始化的方法以及生命周期

bean初始化有三种方法:

  1. 使用方法上加@PostConstruct
  2. 类实现InitializingBean接口,重写AfterPropertiesSet方法
  3. 通过 元素的 init-method属性配置

且顺序依次是1->2->3

示例:
public class InitSequenceDemoBean implements InitializingBean {

public InitSequenceDemoBean() {  
   System.out.println("InitSequenceBean: constructor");  
}  
 
@PostConstruct  
public void postConstruct() {  
   System.out.println("InitSequenceBean: postConstruct");  
}  
 
public void initMethod() {  
   System.out.println("InitSequenceBean: init-method");  
}  
 
@Override  
public void afterPropertiesSet() throws Exception {  
   System.out.println("InitSequenceBean: afterPropertiesSet");  
}  

}
配置文件中添加如下Bean定义:

<bean class="InitSequenceDemoBean"
       init-method="initMethod"></bean>

输出结果:
InitSequenceBean: constructor
InitSequenceBean: postConstruct
InitSequenceBean: afterPropertiesSet
InitSequenceBean: init-method

通过上述输出结果,说明三种初始化的顺序是:
Constructor > @PostConstruct > InitializingBean > init-method
ps:@Autowired标注的方法在构造器之后,且在初始化方法之前执行,即Constructor >@Autowired标注的方法> @PostConstruct > InitializingBean > init-method
此处,给你留一个问题,详见注释1

bean的生命周期如下:
1)设置属性值;
2)如果该Bean实现了BeanNameAware接口,调用Bean中的BeanNameAware.setBeanName()方法
3)如果该Bean实现了BeanFactoryAware接口,调用Bean中的BeanFactoryAware.setBeanFactory()方法
4)如果该Bean实现了ApplicationContextAware接口,
调用bean中setApplicationContext()方法
5)如果该Bean实现了BeanPostProcessor接口,调用BeanPostProcessors.postProcessBeforeInitialization()方法;@PostConstruct注解后的方法就是在这里被执行的
6)如果该Bean实现了InitializingBean接口,调用Bean中的afterPropertiesSet方法
7)如果在配置bean的时候指定了init-method,例如: 调用Bean中的init-method
8)如果该Bean实现了BeanPostProcessor接口,调用BeanPostProcessors.postProcessAfterInitialization()方法;
9)如果该Bean是单例的,则当容器销毁并且该Bean实现了DisposableBean接口的时候,调用destory方法;如果该Bean是prototype,则将准备好的Bean提交给调用者,后续不再管理该Bean的生命周期。

注释

  1. 下面这段代码会有问题吗?如果有问题如何修正
 @Component
public class LightMgrService {
  @Autowired
  private LightService lightService;
  public LightMgrService() {
    lightService.check();
  }
}
我们在 LightMgrService 的默认构造器中调用了通过 @Autoware 注入的成员变量 LightService 的 check 方法:
@Service
public class LightService {
    public void start() {
        System.out.println("turn on all lights");
    }
    public void shutdown() {
        System.out.println("turn off all lights");
    }
    public void check() {
        System.out.println("check all lights");
    }
}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值