介入Spring Bean的生命周期

BeanPostProcessor 接口

public interface BeanPostProcessor {
    @Nullable
    default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }

    @Nullable
    default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }
}

实现BeanPostProcessor接口,并注册这个bean之后。
spring会在bean初始化前调用postProcessBeforeInitialization ,在初始化后调用postProcessAfterInitialization。
比如输出一下
在这里插入图片描述

InitializingBean接口 和 @PostConstruct注解

public interface InitializingBean {
    void afterPropertiesSet() throws Exception;
}

实现了InitializingBean接口的bean,会在bean初始化完成后调用afterPropertiesSet方法

@PostConstruct 能够实现与InitializingBean接口同样的效果
在这里插入图片描述
效果会对实现了InitializingBean接口的bean生效。可以完成一些bean初始化的后续工作。
从打印的日志来看,此时bean的属性都已经初始化完成了。

DisposableBean 接口 和@PreDestroy 注解

public interface DisposableBean {
    void destroy() throws Exception;
}

这组接口注解类似前面的 InitializingBean接口 和 @PostConstruct注解,只是触发的时机不一样。这里是在bean被销毁之前被调用。可以用于释放资源等。

ApplicationContextAware

public interface ApplicationContextAware extends Aware {
    void setApplicationContext(ApplicationContext var1) throws BeansException;
}

在实现了ApplicationContextAware 接口的bean被初始化的时候被调用,方法中Spring会传一个ApplicationContext给我们使用。
在这里插入图片描述
目前的使用场景比较典型的是自定义Spring工具了。通过applicationContext获取bean。或者通过applicationContext发布事件。

SpringApplicationRunListener 、ApplicationContextInitalizer

这两个接口涉及到SpringBoot中对IOC的初始化。

1、

/**
 * @author tangzq
 * @date 2020/5/10 22:10
 */
@Slf4j
public class MyApplicationContextInitalizer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
    @Override
    public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
      log.info("{}:初始化","configurableApplicationContext");
    }
}

/**
 * @author tangzq
 * @date 2020/5/10 22:08
 */
@Slf4j
public class MySpringApplicationRunListener implements SpringApplicationRunListener {

    public MySpringApplicationRunListener(SpringApplication application, String[] args) {
        log.info("{}构造", "MySpringApplicationRunListener");
    }

    @Override
    public void starting() {
        log.info("SPRING BOOT STARTING");
    }

    @Override
    public void environmentPrepared(ConfigurableEnvironment environment) {
        log.info("ENVIRONMENT PREPARED");
    }

    @Override
    public void contextPrepared(ConfigurableApplicationContext context) {
        log.info("CONTEXT PAREPARED");
    }

    @Override
    public void contextLoaded(ConfigurableApplicationContext context) {
        log.info("CONTEXT LOADED");
    }

    @Override
    public void started(ConfigurableApplicationContext context) {
        log.info("STARTED");
    }

    @Override
    public void running(ConfigurableApplicationContext context) {
        log.info("RUNNING");
    }
}

在这里插入图片描述

#spring.factories 的定义需要初始化的类。写法是springboot固定写法
# Application Context Initializers
org.springframework.context.ApplicationContextInitializer=\
com.example.demo.listener.MyApplicationContextInitalizer

# Application Listeners
org.springframework.boot.SpringApplicationRunListener=\
com.example.demo.listener.MySpringApplicationRunListener

SpringBoot初始化的时候会执行相应的生命周期中的监听。
在这里插入图片描述
感觉需要对SpringBoot 的初始化原理有深入了解才好,加深研究SpringBoot原理好点

SmartLifecycle

最近看到的接口,还有个父类叫LifeCycle
简单试了下,直接实现LifeCycle不会进入生命周期。
实现SmartLiftCycle会进入声明周期。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值