Bean的创建到销毁的过程中,我们会经常在Bean创建之后对他做一些初始化的操作,在Bean销毁之前我们也会经常对他进行一些操作。spring 提供了两种方式对Bean进行操作。一种方式是通过标签initMethod和destoryMethod指定bean在初始化和销毁前的个性化的操作方法。 @Bean(initMethod ="init",destroyMethod ="destory")
还有使用依赖JSR250注解@PostConstruct和@PreDestroy来进行初始化bean和销毁之前的操作。使用@PostConstruct注解标注的初始化方法会在bean的构造方法执行完后执行,使用@PreDestroy标注的方法会在bean销毁之前执行。使用JSR250我们需要引入依赖
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>jsr250-api</artifactId>
<version>1.0</version>
</dependency>
使用第一种方式的代码:
/**
* Created by lengshan on 2018/3/13 0013.
*/
@Configuration
@ComponentScan("com.example.demo")
public class MyConfig {
/**
*
* initMethod、destroyMethod指定bean在构造方法之后和销毁之前执行init和destory方法
*/
@Bean(initMethod ="init",destroyMethod ="destory")
DemoBean demoBean(){
return new DemoBean();
}
}
使用第二种方式的代码:
/**
* Created by lengshan on 2018/3/13 0013.
*/
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
/**
* 这里借助JSR250来配置实现对bean的初始化和销毁前的操作
*/
@Service
public class JsrDemoBean {
/**
* 标签@PostConstruct标注的方法在构造方法之后执行,@PreDestroy标注的方法在bean销毁之前执行
*/
@PostConstruct
public void init(){
System.out.println("初始化JSRDemoBean");
}
public JsrDemoBean(){
System.out.println("JsrDemoBean的构造方法");
}
@PreDestroy
public void destroyJsrBean(){
System.out.println("销毁JsrDemoBean");
}
}
main方法是:
@SpringBootApplication
public class DemoSpringbeanlifeApplication {
public static void main(String[] args) {
SpringApplication.run(DemoSpringbeanlifeApplication.class, args);
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
DemoBean demoBean = context.getBean(DemoBean.class);
JsrDemoBean jsrDemoBean = context.getBean(JsrDemoBean.class);
context.close();
}
}
运行结果是:
bean的初始化的时候有时候我们切换不同的数据库进行操作,spring提供了@Profile让工程在不同环境下使用不同的配置
配置类:
@Configuration
@ComponentScan("com.example.demo")
public class MyConfig {
/**
*
* profile为dev时实例化devBean
*/
@Bean
@Profile("dev")
DemoBean devBean(){
return new DemoBean("dev");
}
/**
*
* profile为prod时实例化prodBean
*/
@Bean
@Profile("prod")
DemoBean prodBean(){
return new DemoBean("prod");
}
main函数
@SpringBootApplication
public class DemoMyprofileApplication {
public static void main(String[] args) {
SpringApplication.run(DemoMyprofileApplication.class, args);
//AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.getEnvironment().setActiveProfiles("dev");
context.register(MyConfig.class);
context.refresh();
/**
* 先将活动的profile设置为dev
* 然后注册Bean的配置类,不然会报Bean未定义的错误
* 刷新容器
*/
DemoBean bean = context.getBean(DemoBean.class);
System.out.println(bean.getContent());
context.close();
}
}
运行结果:
参考资料:
《JavaEE开发的颠覆者 Spring Boot实战》第二章