学妹问的Spring Bean常用配置,我用最通俗易懂的讲解让她学会了 (4)

新建一个 InitDestroyService 类,内容如下:

public class InitDestroyService {
    public InitDestroyService() {
        System.out.println("构造方法");
    }

    @PostConstruct
    public void init() {
        System.out.println("初始化");
    }

    @PreDestroy
    public void destroy() {
        System.out.println("销毁");
    }
}

@PostConstruct 注解的作用和 @Bean 注解中 init-method 作用相同,用于指定 Bean 初始化后执行的方法。

@PreDestroy 注解的作用和 @Bean 注解中 destroyMethod 作用相同,用于指定 Bean 被容器销毁后执行的方法。

新建 InitDestroyConfig 类,内容如下:

@Configuration
public class InitDestroyConfig {
    @Bean
    public InitDestroyService initDestroyService() {
        return new InitDestroyService();
    }
}

@Bean 注解中不需要再指定 init-method 和 destroyMethod 参数了。

新建 InitDestroyMain 类,内容如下:

public class InitDestroyMain {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(InitDestroyConfig.class);
        InitDestroyService service = context.getBean(InitDestroyService.class);
        System.out.println("准备关闭容器");
        context.close();
    }
}

程序运行结果如下:

构造方法
初始化
准备关闭容器
销毁

结果符合我们的预期。

04、为 Bean 配置不同的环境

“二哥,据说 Spring 开发中经常需要将 Bean 切换到不同的环境,比如说开发环境、测试环境、正式生产环境,你能给我具体说说怎么实现的吗?”

“没问题啊。”

来考虑这样一个常见的场景,我们需要为开发环境和正式生产环境配置不同的数据源。

新建 Datasource 类,内容如下:

public class Datasource {
    private String dburl;

    public Datasource(String dburl) {
        this.dburl = dburl;
    }

    // getter/setter
}

dbname 用于指定不同环境下数据库的连接地址。

新建 Config 类,内容如下:

@Configuration
public class Config {
    @Bean
    @Profile("dev")
    public Datasource devDatasource() {
        return new Datasource("开发环境");
    }

    @Bean
    @Profile("prod")
    public Datasource prodDatasource() {
        return new Datasource("正式生产环境");
    }
}

@Profile 注解用于标识不同环境下要实例化的 Bean。

新建 Main 类,内容如下:

public class Main {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        ConfigurableEnvironment environment = context.getEnvironment();
        environment.setActiveProfiles("prod");
        context.register(Config.class);
        context.refresh();

        Datasource datasource = context.getBean(Datasource.class);
        System.out.println(datasource.getDburl());
        context.close();
    }
}

新建 AnnotationConfigApplicationContext 对象的时候不要指定配置类,等到调用 setActiveProfiles("prod") 方法将环境设置为正式生产环境后再通过 register(Config.class) 方法将配置类注册到容器当中,同时记得刷新容器。

运行程序,输出以下内容:

正式生产环境

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwzyg.html