新建一个 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 类,内容如下:
@Configurationpublic 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 类,内容如下:
@Configurationpublic 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) 方法将配置类注册到容器当中,同时记得刷新容器。
运行程序,输出以下内容:
正式生产环境