從 Spring 2.5 開始就可使用註解來配置依賴注入。而不是採用 XML 來描述一個 bean 連線,你可使用相關類,方法或字段聲明的註解,將 bean 配置移動到組件類自己。java
<context:annotation-config/>spring
@Required | bean類的 setter 方法(bean必須寫這個屬性)ide |
@Autowired | 註解能夠應用到 bean 屬性的 setter 方法(bytype),非 setter 方法,構造函數(自動調用構造函數並匹配參數)和屬性(能夠省略setter方法)。 |
@Qualifier | 經過指定確切的將被連線的 bean,@Autowired 和 @Qualifier 註解能夠用來刪除混亂。函數 |
JSR-250 | Spring 支持 JSR-250 的基礎的註解,其中包括了 @Resource,@PostConstruct 和 @PreDestroy 註解。ui |
@Required 註釋應用於 bean 屬性的 setter 方法,它代表受影響的 bean 屬性在配置時必須放在 XML 配置文件中,不然容器就會拋出一個 BeanInitializationException 異常。下面顯示的是一個使用 @Required 註釋的示例。this
@Required public void setAge(Integer age) { this.age = age; }
@Required 註釋應用於 bean 屬性的 setter 方法,它代表受影響的 bean 屬性在配置時必須放在 XML 配置文件中,不然容器就會拋出一個 BeanInitializationException 異常。spa
@Autowired 註釋對在哪裏和如何完成自動鏈接提供了更多的細微的控制。prototype
@Autowired 註釋能夠在 setter 方法中被用於自動鏈接 beancode
當 Spring遇到一個在 setter 方法中使用的 @Autowired 註釋,它會在方法中視圖執行 byType 自動鏈接。xml
@Autowired public void setSpellChecker( SpellChecker spellChecker ){ this.spellChecker = spellChecker; }
你能夠在屬性中使用 @Autowired 註釋來除去 setter 方法。當使用 爲自動鏈接屬性傳遞的時候,Spring 會將這些傳遞過來的值或者引用自動分配給那些屬性。因此利用在屬性中 @Autowired 的用法,你的TextEditor.java 文件將變成以下所示:
package com.tutorialspoint; import org.springframework.beans.factory.annotation.Autowired; public class TextEditor { @Autowired private SpellChecker spellChecker; public TextEditor() { System.out.println("Inside TextEditor constructor." ); } public SpellChecker getSpellChecker( ){ return spellChecker; } public void spellCheck(){ spellChecker.checkSpelling(); } }
<bean id="textEditor" class="com.tutorialspoint.TextEditor"> </bean> <bean id="spellChecker" class="com.tutorialspoint.SpellChecker"> </bean>
你也能夠在構造函數中使用 @Autowired。一個構造函數 @Autowired 說明當建立 bean 時,即便在 XML 文件中沒有使用 元素配置 bean ,構造函數也會被自動鏈接。讓咱們檢查一下下面的示例。
即便bean配置是沒說明使用的是構造方法,可是構造函數也會自動鏈接,進行匹配參數注入
默認狀況下,@Autowired 註釋意味着依賴是必須的,它相似於 @Required 註釋,然而,你可使用 @Autowired 的 (required=false) 選項關閉默認行爲。
即便你不爲 age 屬性傳遞任何參數,下面的示例也會成功運行,可是對於 name 屬性則須要一個參數。你能夠本身嘗試一下這個示例,由於除了只有 Student.java 文件被修改之外,它和 @Required 註釋示例是類似的。
@Autowired(required=false) public void setAge(Integer age) { this.age = age; } @Autowired public void setName(String name) { this.name = name; }
可能會有這樣一種狀況,當你建立多個具備相同類型的 bean 時,而且想要用一個屬性只爲它們其中的一個進行裝配,在這種狀況下,你可使用 @Qualifier 註釋和 @Autowired 註釋經過指定哪個真正的 bean 將會被裝配來消除混亂。下面顯示的是使用 @Qualifier 註釋的一個示例。
@Autowired @Qualifier("student1") private Student student;
到目前爲止,你已經看到如何使用 XML 配置文件來配置 Spring bean。若是你熟悉使用 XML 配置。
基於 Java 的配置選項,可使你在不用配置 XML 的狀況下編寫大多數的 Spring,可是一些有幫助的基於 Java 的註解,解釋以下:
帶有 @Configuration 的註解類表示這個類可使用 Spring IoC 容器做爲 bean 定義的來源。@Bean 註解告訴 Spring,一個帶有 @Bean 的註解方法將返回一個對象,該對象應該被註冊爲在 Spring 應用程序上下文中的 bean。最簡單可行的 @Configuration 類以下所示:
@Configuration public class HelloWorldConfig { @Bean public HelloWorld helloWorld(){ return new HelloWorld(); } }
帶有 @Bean 註解的方法名稱做爲 bean 的 ID,建立並返回實際的 bean。配置類能夠聲明多個 @Bean。一旦定義了配置類,你就可使用 AnnotationConfigApplicationContext 來加載並把他們提供給 Spring 容器,以下所示:
public static void main(String[] args) { ApplicationContext ctx = new AnnotationConfigApplicationContext(HelloWorldConfig.class); HelloWorld helloWorld = ctx.getBean(HelloWorld.class); helloWorld.setMessage("Hello World!"); helloWorld.getMessage(); }
你能夠加載各類配置類,以下所示:
public static void main(String[] args) { AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); ctx.register(AppConfig.class, OtherConfig.class); ctx.register(AdditionalConfig.class); ctx.refresh(); MyService myService = ctx.getBean(MyService.class); myService.doStuff(); }
@import 註解容許從另外一個配置類中加載 @Bean 定義。考慮 ConfigA 類,以下所示:
@Configurationpublic class ConfigA { @Bean public A a() { return new A(); } }
能夠在另外一個 Bean 聲明中導入上述 Bean 聲明,以下所示:
@Configuration@Import(ConfigA.class)public class ConfigB { @Bean public B a() { return new A(); } }
如今,當實例化上下文時,不須要同時指定 ConfigA.class 和 ConfigB.class,只有 ConfigB 類須要提供,以下所示:
public static void main(String[] args) { ApplicationContext ctx = new AnnotationConfigApplicationContext(ConfigB.class); // now both beans A and B will be available... A a = ctx.getBean(A.class); B b = ctx.getBean(B.class); }
@Bean 註解支持指定任意的初始化和銷燬的回調方法,就像在 bean 元素中 Spring 的 XML 的初始化方法和銷燬方法的屬性:
@Configuration public class AppConfig { @Bean(initMethod = "init", destroyMethod = "cleanup" ) public Foo foo() { return new Foo(); }
指定 Bean 的範圍:
默認範圍是單實例,可是你能夠重寫帶有 @Scope 註解的該方法,以下所示:
@Configuration public class AppConfig { @Bean @Scope("prototype") public Foo foo() { return new Foo(); } }