如果想在 bean 创建出来之前和销毁之前做一些自定义操作可以怎么来实现呢?
使用生命周期扩展接口(最灵活)
创建前拦截可以通过实现 InstantiationAwareBeanPostProcessor 接口的 postProcessBeforeInstantiation 方法,在Bean实例化前执行逻辑
在销毁前拦截可以通过实现 DestructionAwareBean 接口的 postProcessBeforeDestruction 方法,在Bean销毁前执行逻辑
@Component
public class MyInstantiationInterceptor implements InstantiationAwareBeanPostProcessor {
@Override
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) {
if (beanClass == TargetBean.class) {
System.out.println("【拦截】Bean实例化前操作:" + beanName);
}
return null; // 返回null表示继续默认实例化流程
}
}
@Component
public class MyDestructionInterceptor implements DestructionAwareBeanPostProcessor {
@Override
public void postProcessBeforeDestruction(Object bean, String beanName) {
if (bean instanceof MyResourceBean) {
System.out.println("【拦截】Bean销毁前释放资源:" + beanName);
((MyResourceBean) bean).release();
}
}
}
使用标准注解
通过 @PostConstruct 注解标记方法,在 Bean 属性注入完成后执行逻辑,通过 @PreDestroy 注解标记方法,在容器关闭时触发
@Component
public class MyBean {
@PostConstruct
public void init() {
System.out.println("Bean初始化完成,执行自定义逻辑");
}
@PreDestroy
public void cleanup() {
System.out.println("Bean销毁前关闭数据库连接");
}
}
我推荐使用这个,解耦还简洁
通过 XML 文件配置元数据
指定init-method和destroy-method:
<bean id="myBean" class="com.example.MyBean"
init-method="customInit"
destroy-method="customDestroy"/>
然后对使用 @Bean 注解的属性指定方法
@Configuration
public class App {
@Bean(initMethod = "customInit", destroyMethod = "customDestroy")
public MyBean myBean() {
return new MyBean();
}
}
使用 Spring 原生接口
初始化拦截
实现 InitializingBean 接口的 afterPropertiesSet 方法:
@Component
public class MyBean implements InitializingBean {
@Override
public void afterPropertiesSet() {
System.out.println("Spring接口实现的初始化逻辑");
}
}
销毁拦截实现 DisposableBean 接口的 destroy 方法:
@Component
public class MyBean implements DisposableBean {
@Override
public void destroy() {
System.out.println("Spring接口实现的销毁逻辑");
}
}
小总结,使用第二种方法可以实现解耦,并且代码简洁,使用第三种方法可以实现对原有项目的兼容,具体使用哪种方法大家可以根据实际需求去选择