Spring接口简单使用

Spring接口简单使用

ApplicationContextAware

ApplicationContextAware 是一个 Spring 接口,用于在 Spring 应用程序中获取 ApplicationContext 对象。ApplicationContext 是 Spring 框架对 Bean 的管理容器,它负责加载、配置和管理应用程序中的 Bean。

使用 ApplicationContextAware 接口,你可以在任何实现了该接口的类中获取到当前的 ApplicationContext 对象,从而可以访问 Spring 容器中的其他 Bean。

要使用 ApplicationContextAware,请遵循以下步骤:

  1. 创建一个类并实现 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;
    }
}
  1. 在实现类中,创建一个静态的 ApplicationContext 变量,并实现 setApplicationContext() 方法。在该方法中,将传入的 ApplicationContext 赋值给静态变量。
  2. 在实现类中,创建一个静态的 getApplicationContext() 方法,用于获取 ApplicationContext 对象。
  3. 注册实现类为 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,请遵循以下步骤:

  1. 创建一个类并实现 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...");
    }
}
  1. 在实现类中,实现 destroy() 方法。在该方法中,编写你需要在 Bean 销毁前执行的清理任务。
  2. 注册实现类为 Spring 组件,可以使用 @Component 或其他适当的注解。

现在,当 Spring 容器关闭时,会自动调用 MyDisposableBeandestroy() 方法,并执行你编写的清理任务。

注意事项:

  • 实现 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;
    }
}
posted @   不凡34  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
点击右上角即可分享
微信分享提示