@Bean下管理bean的生命周期
可以使用基于 Java 的配置來管理 bean 的生命周期。@Bean 支援兩種屬性,即 initMethod 和destroyMethod,這些屬性可用于定義生命周期方法。在執行個體化 bean 或即将銷毀它時,容器便可調用生命周期方法。生命周期方法也稱為回調方法,因為它将由容器調用。使用 @Bean 注釋注冊的 bean 也支援 JSR-250 規定的标準 @PostConstruct 和 @PreDestroy 注釋。如果您正在使用 XML 方法來定義 bean,那麼就應該使用 bean 元素來定義生命周期回調方法。以下代碼顯示了在 XML 配置中通常使用 bean 元素定義回調的方法。
建立測試類TestConfiguration
1@Configuration
2@ComponentScan(basePackages = "com.cloud.skyme")
3public class TestConfiguration {
4 public TestConfiguration() {
5 System.out.println("TestConfiguration容器啟動初始化。。。");
6 }
7 // @Bean注解注冊bean,同時可以指定初始化和銷毀方法
8 @Bean(name = "testBean", initMethod = "start", destroyMethod = "cleanUp")
9 @Scope("prototype")
10 public TestBean testBean() {
11 return new TestBean();
12 }
13}
編寫測試類,代碼如下:
1public class TestMain {
2 public static void main(String[] args) {
3 ApplicationContext context = new AnnotationConfigApplicationContext(TestConfiguration.class);
4 TestBean tb = (TestBean) context.getBean("testBean");
5 tb.sayHello();
6 System.out.println(tb);
7 TestBean tb2 = (TestBean) context.getBean("testBean");
8 tb2.sayHello();
9 System.out.println(tb2);
10 }
11}
運作得到結果輸出:
115:00:14.503 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Invoking init method 'start' on bean with name 'testBean'
2TestBean 初始化。。。
315:00:14.503 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Finished creating instance of bean 'testBean'
4TestBean sayHello...
5username:null,url:null,password:null
615:00:14.504 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating instance of bean 'testBean'
715:00:14.504 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'testConfiguration'
815:00:14.504 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Invoking init method 'start' on bean with name 'testBean'
9TestBean 初始化。。。
1015:00:14.504 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Finished creating instance of bean 'testBean'
11TestBean sayHello...
12username:null,url:null,password:null
導入xml配置
在一些老的工程中,很多配置都是基于xml的方式進行配置的,那麼有沒有什麼好的辦法使用這些檔案呢?
使用@ImportResource和@Value進行資源檔案讀取。
來看一個示例:
1@Configuration
2@ImportResource("classpath:/com/cloud/skyme/properties-config.xml")
3public class AppConfig{
4 @Value("${jdbc.url}")
5 private String url;
6 @Value("${jdbc.username}")
7 private String username;
8 @Value("${jdbc.password}")
9 private String password;
10 @Bean
11 public DataSource dataSource() {
12 return new DriverManagerDataSource(url,username,password);
13 }
14}
使用@Configuration,把這個類作為一個配置來使用。@ImportResource就是引入一個這種資源,然後資源對應一個xml檔案。
用@Value這個注解從資源檔案中取出它的key指派給成員變量,包括username、password等。然後再使用@Bean這個注解去建立DriverManagerDataSource的一個對象,也就是和第一種的方式一樣,去建立這個Bean的對象,同時把url、username、password傳入DriverManagerDataSource的構造器。
這樣就達到了從資源檔案中去加載資源檔案的配置,并應用到bean的建立中。
1@ImportResource("classpath:config.xml")