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会进入声明周期。