spring 初始化和销毁的三种方法

  • spring 中初始化和销毁有三种办法

1、实现接口 DisposableBean ,initilzingBean
2、使用注解 @PostConstructor, @PreDestory
3、@Bean(initMethod = "",destroyMethod="")

 

复制代码
package com.shanjiancaofu.ad.service.impl;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {
       // initMethod  指定类的初始化方法, destroyMethod 指定类的销毁方法
    @Bean(initMethod = "init", destroyMethod = "destroyMethod")
    User user() {
        return new User();
    }
}
复制代码

User 类

复制代码
package com.shanjiancaofu.ad.service.impl;

import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;


class User implements InitializingBean, DisposableBean {
    public String userName;

    public User() {
        System.out.println("User constructor");
    }

    public void init() {
        this.userName = "initName";
        System.out.println(" user init. ....");
    }

    public void destroyMethod() {
        this.userName = "destroyName";
        System.out.println(" user destroy. ....");
    }

    @PreDestroy
    public void preDestroy() {
        System.out.println("@PreDestroy ...");
    }

    @PostConstruct
    public void postConstruct() {
        System.out.println(" @PostConstruct. ....");
    }

    @Override
    public String toString() {
        return "user:" + this.userName;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("InitializingBean afterPropertiesSet");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("DisposableBean destroy");
    }
}
复制代码

启动spring 应用 控制台输出:

User constructor
@PostConstruct. ....
InitializingBean afterPropertiesSet
user init. ....

关闭spring 应用 控制台输出:

@PreDestroy ...
DisposableBean destroy
user destroy. ....
  •  获取spring 容器中的bean
复制代码
@Service
@Lazy(false)
public class SpringContextHolder implements ApplicationContextAware, DisposableBean {
    private static ApplicationContext applicationContext = null;

    private static Logger logger = LoggerFactory.getLogger(SpringContextHolder.class);

    /**
     * 取得存储在静态变量中的ApplicationContext.
     */
    public static ApplicationContext getApplicationContext() {
        assertContextInjected();
        return applicationContext;
    }

    /**
     * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.
     */
    @SuppressWarnings("unchecked")
    public static <T> T getBean(String name) {
        assertContextInjected();
        return (T) applicationContext.getBean(name);
    }

    /**
     * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.
     */
    public static <T> T getBean(Class<T> requiredType) {
        assertContextInjected();
        return applicationContext.getBean(requiredType);
    }

    /**
     * 清除SpringContextHolder中的ApplicationContext为Null.
     */
    public static void clearHolder() {
        applicationContext = null;
    }

    /**
     * 实现ApplicationContextAware接口, 注入Context到静态变量中.
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) {
        SpringContextHolder.applicationContext = applicationContext;
    }

    /**
     * 实现DisposableBean接口, 在Context关闭时清理静态变量.
     */
    @Override
    public void destroy() throws Exception {
        SpringContextHolder.clearHolder();
    }

    /**
     * 检查ApplicationContext不为空.
     */
    private static void assertContextInjected() {
        Validate.validState(applicationContext != null, "applicaitonContext属性未注入, 请在applicationContext.xml中定义SpringContextHolder.");
    }
}
View Code
复制代码

 

posted @   Bonnie_ξ  阅读(216)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示