天天看點

飛5的Spring Boot2(6)- 導入外部配置

飛5的Spring Boot2(6)- 導入外部配置

@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")      

總結