Spring接口简单使用
ApplicationContextAware
ApplicationContextAware
是一个 Spring 接口,用于在 Spring 应用程序中获取 ApplicationContext 对象。ApplicationContext 是 Spring 框架对 Bean 的管理容器,它负责加载、配置和管理应用程序中的 Bean。
使用 ApplicationContextAware
接口,你可以在任何实现了该接口的类中获取到当前的 ApplicationContext 对象,从而可以访问 Spring 容器中的其他 Bean。
要使用 ApplicationContextAware
,请遵循以下步骤:
- 创建一个类并实现
ApplicationContextAware
接口。例如:
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class MyApplicationContextAware implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) {
MyApplicationContextAware.applicationContext = applicationContext;
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
}
- 在实现类中,创建一个静态的 ApplicationContext 变量,并实现
setApplicationContext()
方法。在该方法中,将传入的 ApplicationContext 赋值给静态变量。 - 在实现类中,创建一个静态的
getApplicationContext()
方法,用于获取 ApplicationContext 对象。 - 注册实现类为 Spring 组件,可以使用
@Component
或其他适当的注解。
现在,你可以在任何需要获取 ApplicationContext 的地方使用 MyApplicationContextAware.getApplicationContext()
方法来获取实例化的 ApplicationContext 对象。
注意事项:
- 当应用程序上下文初始化时,Spring 框架将自动检测并调用实现了
ApplicationContextAware
接口的类的setApplicationContext()
方法,并将 ApplicationContext 对象传递给该方法。 - 你可以在多个类中实现
ApplicationContextAware
接口来获得相同的 ApplicationContext 对象。 - 如果你的类需要在初始化之前就能够访问 ApplicationContext,你可以考虑实现
BeanFactoryAware
接口代替ApplicationContextAware
接口,它提供了访问 BeanFactory 的方法。
通过使用 ApplicationContextAware
接口,你可以在 Spring 应用程序中方便地获取 ApplicationContext 对象,以进一步访问和管理容器中的其他 Bean。
DisposableBean
DisposableBean
是 Spring 的一个接口,用于在 Spring 容器销毁时执行一些清理任务。当 Spring 容器关闭时,会调用实现了 DisposableBean
接口的 Bean 的 destroy()
方法。
使用 DisposableBean
接口,你可以在 Bean 销毁前进行一些额外的清理工作,例如关闭打开的数据库连接、释放资源等。
要使用 DisposableBean
,请遵循以下步骤:
- 创建一个类并实现
DisposableBean
接口。例如:
java
复制
import org.springframework.beans.factory.DisposableBean;
import org.springframework.stereotype.Component;
@Component
public class MyDisposableBean implements DisposableBean {
@Override
public void destroy() throws Exception {
// 执行清理任务
System.out.println("Cleaning up resources...");
}
}
- 在实现类中,实现
destroy()
方法。在该方法中,编写你需要在 Bean 销毁前执行的清理任务。 - 注册实现类为 Spring 组件,可以使用
@Component
或其他适当的注解。
现在,当 Spring 容器关闭时,会自动调用 MyDisposableBean
的 destroy()
方法,并执行你编写的清理任务。
注意事项:
- 实现
DisposableBean
接口的 Bean 可能会与其他生命周期回调方法(例如@PreDestroy
注解或自定义的init()
方法)发生冲突。如果你的 Bean 已经使用了其他方式来定义销毁方法,那么实现DisposableBean
可能不是必需的。 - 如果你使用 XML 配置文件来定义 Bean,你可以使用
<destroy-method>
元素来指定销毁方法,而无需显式实现DisposableBean
接口。 - 与实现
DisposableBean
接口相比,使用@PreDestroy
注解来标记销毁方法更加推荐。@PreDestroy
注解提供了更好的可读性和灵活性,并且不依赖于 Spring 框架特定的接口。
通过使用 DisposableBean
接口,你可以在 Spring 容器销毁时执行一些清理任务,确保应用程序资源的正确释放和关闭。
我们可以使用ApplicationContextAware和DisposableBean接口来创建一个工具类从而获取或销毁容器中的Bean对象。
@Slf4j
public class SpringContextHolder implements ApplicationContextAware, DisposableBean {
private static ApplicationContext applicationContext = null;
/**
* 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.
*/
public static <T> T getBean(Class<T> requiredType) {
assertContextInjected();
return applicationContext.getBean(requiredType);
}
/**
* 检查ApplicationContext不为空.
*/
private static void assertContextInjected() {
if (applicationContext == null) {
throw new IllegalStateException("applicaitonContext属性未注入, 请在applicationContext" +
".xml中定义SpringContextHolder或在SpringBoot启动类中注册SpringContextHolder.");
}
}
/**
* 清除SpringContextHolder中的ApplicationContext为Null.
*/
private static void clearHolder() {
log.debug("清除SpringContextHolder中的ApplicationContext:"
+ applicationContext);
applicationContext = null;
}
@Override
public void destroy(){
SpringContextHolder.clearHolder();
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if (SpringContextHolder.applicationContext != null) {
log.warn("SpringContextHolder中的ApplicationContext被覆盖, 原有ApplicationContext为:" + SpringContextHolder.applicationContext);
}
SpringContextHolder.applicationContext = applicationContext;
}
}
标签:ApplicationContextAware,ApplicationContext,applicationContext,Spring,接口,简单,Dispo
From: https://www.cnblogs.com/zzprogram/p/17501359.html