spring--基於註解實現依賴注入

從 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

Spring @Required 註釋

@Required 註釋應用於 bean 屬性的 setter 方法,它代表受影響的 bean 屬性在配置時必須放在 XML 配置文件中,不然容器就會拋出一個 BeanInitializationException 異常。下面顯示的是一個使用 @Required 註釋的示例。this

@Required 

public void setAge(Integer age) { this.age = age; }

@Required 註釋應用於 bean 屬性的 setter 方法,它代表受影響的 bean 屬性在配置時必須放在 XML 配置文件中,不然容器就會拋出一個 BeanInitializationException 異常。spa

Spring @Autowired 註釋

@Autowired 註釋對在哪裏和如何完成自動鏈接提供了更多的細微的控制。prototype

@Autowired 註釋能夠在 setter 方法中被用於自動鏈接 beancode

當 Spring遇到一個在 setter 方法中使用的 @Autowired 註釋,它會在方法中視圖執行 byType 自動鏈接。xml

@Autowired 

public void setSpellChecker( SpellChecker spellChecker ){ this.spellChecker = spellChecker; }

屬性中的 @Autowired

你能夠在屬性中使用 @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。一個構造函數 @Autowired 說明當建立 bean 時,即便在 XML 文件中沒有使用 元素配置 bean ,構造函數也會被自動鏈接。讓咱們檢查一下下面的示例。

即便bean配置是沒說明使用的是構造方法,可是構造函數也會自動鏈接,進行匹配參數注入

@Autowired 的(required=false)選項

默認狀況下,@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; }

Spring @Qualifier 註釋

可能會有這樣一種狀況,當你建立多個具備相同類型的 bean 時,而且想要用一個屬性只爲它們其中的一個進行裝配,在這種狀況下,你可使用 @Qualifier 註釋和 @Autowired 註釋經過指定哪個真正的 bean 將會被裝配來消除混亂。下面顯示的是使用 @Qualifier 註釋的一個示例。

@Autowired 
@Qualifier("student1")
private Student student;

基於 Java 的配置

到目前爲止,你已經看到如何使用 XML 配置文件來配置 Spring bean。若是你熟悉使用 XML 配置

基於 Java 的配置選項,可使你在不用配置 XML 的狀況下編寫大多數的 Spring,可是一些有幫助的基於 Java 的註解,解釋以下:

@Configuration 和 @Bean 註解

帶有 @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 註解:

@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();
   }
}
相關文章
相關標籤/搜索