[學習筆記]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程式碼- package cn.javass.spring.chapter12.configuration;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- @Configuration
-
publicclass ApplicationContextConfig {
- @Bean
- public String message() {
- return"hello";
- }
- }
- package cn.javass.spring.chapter12.configuration;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- @Configuration
- publicclass ApplicationContextConfig {
- @Bean
- public String message() {
- return"hello";
- }
- }
2、定義測試類,測試一下Java配置類是否工作:
java程式碼: Java程式碼- package cn.javass.spring.chapter12.configuration;
- //省略import
- publicclass ConfigurationTest {
- @Test
- publicvoid testHelloworld () {
- AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ApplicationContextConfig.class);
- Assert.assertEquals("hello", ctx.getBean("message"));
- }
- }
- package cn.javass.spring.chapter12.configuration;
- //省略import
- publicclass ConfigurationTest {
- @Test
- publicvoid testHelloworld () {
- AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ApplicationContextConfig.class);
- Assert.assertEquals("hello", ctx.getBean("message"));
- }
- }
測試沒有報錯說明測試通過了,那AnnotationConfigApplicationContext是如何工作的呢,接下來讓我們分析一下:
- 使用@Configuration註解配置類,該配置類定義了Bean配置元資料;
- 使用@Bean註解配置類中的方法,該方法名就是Bean的名字,該方法返回值就是Bean物件。
- 使用new AnnotationConfigApplicationContext(ApplicationContextConfig.class)建立應用上下文,構造器引數為使用@Configuration註解的配置類,讀取配置類進行例項化相應的Bean。
知道如何使用了,接下來就詳細介紹每個部分吧。
12.4.3 @Configuration
通過@Configuration註解的類將被作為配置類使用,表示在該類中將定義Bean配置元資料,且使用@Configuration註解的類本身也是一個Bean,使用方式如下所示:
java程式碼: Java程式碼- import org.springframework.context.annotation.Configuration;
- @Configuration("ctxConfig")
- publicclass ApplicationContextConfig {
- //定義Bean配置元資料
- }
- import org.springframework.context.annotation.Configuration;
- @Configuration("ctxConfig")
- publicclass ApplicationContextConfig {
- //定義Bean配置元資料
- }
因為使用@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程式碼- @Bean(name={},
- autowire=Autowire.NO,
- initMethod="",
- destroyMethod="")
- @Bean(name={},
- autowire=Autowire.NO,
- initMethod="",
- destroyMethod="")
- name:指定Bean的名字,可有多個,第一個作為Id,其他作為別名;
- autowire:自動裝配,預設no表示不自動裝配該Bean,另外還有Autowire.BY_NAME表示根據名字自動裝配,Autowire.BY_TYPE表示根據型別自動裝配;
- initMethod和destroyMethod:指定Bean的初始化和銷燬方法。
示例如下所示(ApplicationContextConfig.java)
java程式碼: Java程式碼- @Bean
- public String message() {
- returnnew String("hello");
- }
- @Bean
- public String message() {
- returnnew String("hello");
- }
如上使用方式等價於如下基於XML配置方式
java程式碼: Java程式碼- <bean id="message"class="java.lang.String">
- <constructor-arg index="0" value="hello"/>
- </bean>
- <bean id="message"class="java.lang.String">
-
<constructor-arg index=