Spring Lifecycle Callbacks

本文深入探讨Spring框架中Bean的生命周期,包括@PostConstruct、InitializingBean接口及init-method三种初始化方式的执行顺序与原理,以及对应的销毁回调方法。通过具体代码示例,帮助读者理解不同初始化方法的使用场景。
摘要由CSDN通过智能技术生成

官方文档:https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans-factory-lifecycle

三种方式(如果三种方式同时修饰一个方法,则按照如下顺序):

  1. Methods annotated with @PostConstruct
  2. afterPropertiesSet() as defined by the InitializingBean callback interface
  3. A custom configured init() method
    测试代码:
  • 通过InitializingBean
@Service
public class EatServiceImpl implements EatService, InitializingBean {
    public void afterPropertiesSet() {
        System.out.println("afterPropertiesSet");
    }
}
  • 通过@PostConstruct
@Service
public class SleepServiceImpl implements SleepService {

    @PostConstruct
    public void postFunction(){
        System.out.println("PostConstruct....");
    }
}

  • 通过自定义方法
public class DrinkServiceImpl implements DrinkService {
    public void init(){
        System.out.println("drink init...");
    }
}
@Configuration
@ComponentScan("com.good.demo3") // 为了引入AnimalService
public class AppConfig3 {

    @Bean(initMethod = "init")
    public DrinkServiceImpl eatService(){
        return new DrinkServiceImpl();
    }
	
	// 这个是为了下面三个同事修饰
    @Bean(initMethod = "init")
    public ActionServiceImpl actionService(){
        return new ActionServiceImpl();
    }

    @Bean(initMethod = "afterPropertiesSet")
    public ShitServiceImpl shitService(){
        return new ShitServiceImpl();
    }
}

  • 三种同时定义给同一个bean,而且用了不同的方法
public class ActionServiceImpl implements ActionService, InitializingBean {

    @PostConstruct
    public void postFunction(){
        System.out.println("Action PostConstruct....");
    }

    public void afterPropertiesSet() {
        System.out.println("Action afterPropertiesSet");
    }

    public void init(){
        System.out.println("Action init...");
    }
}

三种方式同时定义一个bean,而且在一个方法上

public class ShitServiceImpl implements ShitService, InitializingBean {
    @PostConstruct
    public void afterPropertiesSet() {
        System.out.println("Shit afterPropertiesSet...");
    }
}

测试方法:

public class TestDemo3 {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context =
                new AnnotationConfigApplicationContext(AppConfig3.class);
        context.getBean(EatService.class);
        context.getBean(DrinkService.class);
        context.getBean(SleepService.class);
        context.getBean(ActionService.class);
    }
}

测试结果:

afterPropertiesSet...
PostConstruct....
drink init...
Action PostConstruct....
Action afterPropertiesSet...
Action init...
Shit afterPropertiesSet...
  • 总结下上面三个生命周期回调方法init-methodInitializingBean接口、@PostConstruct注解
    1. 都是针对单个类的实例化后处理
    2. 执行时间都是在类实例化完成,且成员变量完成注入之后调用的
    3. 对于init-method,还可以在Spring配置文件的beans元素下配置默认初始化方法,配置项为default-init-method
    4. 若以上三种方式配置的初始化方法都不一样,则执行顺序为:@PostConstruct注解方法 –> InitializingBean的afterPropertiesSet –> init-method方法 ;若三种方式配置的方法一样,则方法只执行一次 (参照:Spring官方文档beans-factory-lifecycle-combined-effect)
    5. 有初始化回调方法,对应的也有销毁的回调方法。@PostConstruct注解方法 –> InitializingBean的afterPropertiesSet –> init-method方法 分别对应 @PreDestroy注解方法 –> DisposableBean的destroy –> destroy-method方法

参考:https://blog.csdn.net/liuxigiant/article/details/54296578

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值