1. 程式人生 > >[學習筆記]Spring註解實現Bean

[學習筆記]Spring註解實現Bean

12.4  基於Java類定義Bean配置元資料

12.4.1  概述

基於Java類定義Bean配置元資料,其實就是通過Java類定義Spring配置元資料,且直接消除XML配置檔案。

基於Java類定義Bean配置元資料中的@Configuration註解的類等價於XML配置檔案,@Bean註解的方法等價於XML配置檔案中的Bean定義。

基於Java類定義Bean配置元資料需要通過AnnotationConfigApplicationContext載入配置類及初始化容器,類似於XML配置檔案需要使用ClassPathXmlApplicationContext載入配置檔案及初始化容器。

基於Java類定義Bean配置元資料需要CGLIB的支援,因此要保證類路徑中包括CGLIB的jar包。

12.4.2  Hello World

首先讓我們看一下基於Java類如何定義Bean配置元資料,具體步驟如下:

1、  通過@Configuration註解需要作為配置的類,表示該類將定義Bean配置元資料;

2、  通過@Bean註解相應的方法,該方法名預設就是Bean名,該方法返回值就是Bean物件;

3、  通過AnnotationConfigApplicationContext或子類載入基於Java類的配置。

接下來讓我們先來學習一下如何通過Java類定義Bean配置元資料吧:

1、定義配置元資料的Java類如下所示:

java程式碼: Java程式碼 複製程式碼 收藏程式碼
  1. package cn.javass.spring.chapter12.configuration;   
  2. import org.springframework.context.annotation.Bean;   
  3. import org.springframework.context.annotation.Configuration;   
  4. @Configuration
  5. publicclass ApplicationContextConfig {   
  6. @Bean
  7. public String message() {   
  8. return"hello";   
  9.     }   
  10. }  
  1. package cn.javass.spring.chapter12.configuration;  
  2. import org.springframework.context.annotation.Bean;  
  3. import org.springframework.context.annotation.Configuration;  
  4. @Configuration
  5. publicclass ApplicationContextConfig {  
  6.     @Bean
  7.     public String message() {  
  8.         return"hello";  
  9.     }  
  10. }  

2、定義測試類,測試一下Java配置類是否工作:

java程式碼: Java程式碼 複製程式碼 收藏程式碼
  1. package cn.javass.spring.chapter12.configuration;   
  2. //省略import 
  3. publicclass ConfigurationTest {   
  4. @Test
  5. publicvoid testHelloworld () {   
  6.         AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ApplicationContextConfig.class);   
  7.         Assert.assertEquals("hello", ctx.getBean("message"));   
  8.     }   
  9. }  
  1. package cn.javass.spring.chapter12.configuration;  
  2. //省略import
  3. publicclass ConfigurationTest {  
  4.     @Test
  5.     publicvoid testHelloworld () {  
  6.         AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ApplicationContextConfig.class);  
  7.         Assert.assertEquals("hello", ctx.getBean("message"));  
  8.     }  
  9. }  

    測試沒有報錯說明測試通過了,那AnnotationConfigApplicationContext是如何工作的呢,接下來讓我們分析一下:

  • 使用@Configuration註解配置類,該配置類定義了Bean配置元資料;
  • 使用@Bean註解配置類中的方法,該方法名就是Bean的名字,該方法返回值就是Bean物件。
  • 使用new AnnotationConfigApplicationContext(ApplicationContextConfig.class)建立應用上下文,構造器引數為使用@Configuration註解的配置類,讀取配置類進行例項化相應的Bean。

知道如何使用了,接下來就詳細介紹每個部分吧。

12.4.3  @Configuration

通過@Configuration註解的類將被作為配置類使用,表示在該類中將定義Bean配置元資料,且使用@Configuration註解的類本身也是一個Bean,使用方式如下所示:

java程式碼: Java程式碼 複製程式碼 收藏程式碼
  1. import org.springframework.context.annotation.Configuration;   
  2. @Configuration("ctxConfig")   
  3. publicclass ApplicationContextConfig {   
  4. //定義Bean配置元資料
  5. }  
  1. import org.springframework.context.annotation.Configuration;  
  2. @Configuration("ctxConfig")  
  3. publicclass ApplicationContextConfig {  
  4.     //定義Bean配置元資料
  5. }  

       因為使用@Configuration註解的類本身也是一個Bean,因為@Configuration被@Component註解了,因此@Configuration註解可以指定value屬性值,如“ctxConfig”就是該Bean的名字,如使用“ctx.getBean("ctxConfig")”將返回該Bean。

使用@Configuration註解的類不能是final的,且應該有一個預設無參構造器。

12.4.4  @Bean

通過@Bean註解配置類中的相應方法,則該方法名預設就是Bean名,該方法返回值就是Bean物件,並定義了Spring IoC容器如何例項化、自動裝配、初始化Bean邏輯,具體使用方法如下:

java程式碼: Java程式碼 複製程式碼 收藏程式碼
  1. @Bean(name={},   
  2.       autowire=Autowire.NO,   
  3.       initMethod="",   
  4.       destroyMethod="")  
  1. @Bean(name={},  
  2.       autowire=Autowire.NO,  
  3.       initMethod="",  
  4.       destroyMethod="")  
  • name:指定Bean的名字,可有多個,第一個作為Id,其他作為別名;
  • autowire:自動裝配,預設no表示不自動裝配該Bean,另外還有Autowire.BY_NAME表示根據名字自動裝配,Autowire.BY_TYPE表示根據型別自動裝配;
  • initMethod和destroyMethod:指定Bean的初始化和銷燬方法。

示例如下所示(ApplicationContextConfig.java)

java程式碼: Java程式碼 複製程式碼 收藏程式碼
  1. @Bean
  2. public String message() {   
  3. returnnew String("hello");   
  4. }  
  1. @Bean
  2. public String message() {  
  3.     returnnew String("hello");  
  4. }  

如上使用方式等價於如下基於XML配置方式

java程式碼: Java程式碼 複製程式碼 收藏程式碼
  1. <bean id="message"class="java.lang.String">   
  2.     <constructor-arg index="0" value="hello"/>   
  3. </bean>  
  1. <bean id="message"class="java.lang.String">  
  2.     <constructor-arg index=