1. 程式人生 > >9.Spring——基於註解的配置

9.Spring——基於註解的配置

元素 5.1 註解註入 視圖 col result ins ini llc

1.簡介

2.@Required 註釋

3.@Autowired 註釋

4.@Qualifier 註釋

5.JSR-250 註釋

  5.1@PostConstruct 和 @PreDestroy 註釋

   5.2@Resource註釋

1.簡介

基於註解的配置

從 Spring 2.5 開始就可以使用註解來配置依賴註入。而不是采用 XML 來描述一個 bean 連線,你可以使用相關類,方法或字段聲明的註解,將 bean 配置移動到組件類本身。

在 XML 註入之前進行註解註入,因此後者的配置將通過兩種方式的屬性連線被前者重寫。

註解連線在默認情況下在 Spring 容器中不打開。因此,在可以使用基於註解的連線之前,我們將需要在我們的 Spring 配置文件中啟用它。所以如果你想在 Spring 應用程序中使用的任何註解,可以考慮到下面的配置文件。

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd"
> <context:annotation-config/> <!-- bean definitions go here --> </beans>

一旦 被配置後,你就可以開始註解你的代碼,表明 Spring 應該自動連接值到屬性,方法和構造函數。讓我們來看看幾個重要的註解,並且了解它們是如何工作的:

序號註解 & 描述
1 @Required

@Required 註解應用於 bean 屬性的 setter 方法。

2 @Autowired

@Autowired 註解可以應用到 bean 屬性的 setter 方法,非 setter 方法,構造函數和屬性。

3 @Qualifier

通過指定確切的將被連線的 bean,@Autowired 和 @Qualifier 註解可以用來刪除混亂。

4 JSR-250 Annotations

Spring 支持 JSR-250 的基礎的註解,其中包括了 @Resource,@PostConstruct 和 @PreDestroy 註解。

2.@Required 註釋

Spring @Required 註釋

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

package com.tutorialspoint;
import org.springframework.beans.factory.annotation.Required;
public class Student {
   private Integer age;
   private String name;
   @Required
   public void setAge(Integer age) {
      this.age = age;
   }
   public Integer getAge() {
      return age;
   }
   @Required
   public void setName(String name) {
      this.name = name;
   }
   public String getName() {
      return name;
   }
}
<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd">

   <context:annotation-config/>

   <!-- Definition for student bean -->
   <bean id="student" class="com.tutorialspoint.Student">
      <property name="name"  value="Zara" />

      <!-- try without passing age and check the result -->
      <!-- property name="age"  value="11"-->
   </bean>

</beans>

一旦你已經完成的創建了源文件和 bean 配置文件,讓我們運行一下應用程序。如果你的應用程序一切都正常的話,這將引起 BeanInitializationException 異常,並且會輸出一下錯誤信息和其他日誌消息:

Property ‘age‘ is required for bean ‘student‘

3.@Autowired 註釋

Spring @Autowired 註釋

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

@Autowired 註釋可以在 setter 方法中被用於自動連接 bean,就像 @Autowired 註釋,容器,一個屬性或者任意命名的可能帶有多個參數的方法。

Setter 方法中的 @Autowired

你可以在 XML 文件中的 setter 方法中使用 @Autowired 註釋來除去 元素。當 Spring遇到一個在 setter 方法中使用的 @Autowired 註釋,它會在方法中視圖執行 byType 自動連接。

屬性中的 @Autowired

你可以在屬性中使用 @Autowired 註釋來除去 setter 方法。當時使用 為自動連接屬性傳遞的時候,Spring 會將這些傳遞過來的值或者引用自動分配給那些屬性。所以利用在屬性中 @Autowired 的用法,你的 TextEditor.java 文件將變成如下所示:

構造函數中的 @Autowired

你也可以在構造函數中使用 @Autowired。一個構造函數 @Autowired 說明當創建 bean 時,即使在 XML 文件中沒有使用 元素配置 bean ,構造函數也會被自動連接。讓我們檢查一下下面的示例。

這裏是 TextEditor.java 文件的內容:

構造函數中的 @Autowired

你也可以在構造函數中使用 @Autowired。一個構造函數 @Autowired 說明當創建 bean 時,即使在 XML 文件中沒有使用 元素配置 bean ,構造函數也會被自動連接。讓我們檢查一下下面的示例。

這裏是 TextEditor.java 文件的內容:

package com.tutorialspoint;
import org.springframework.beans.factory.annotation.Autowired;
public class TextEditor {
   private SpellChecker spellChecker;
   @Autowired
   public TextEditor(SpellChecker spellChecker){
      System.out.println("Inside TextEditor constructor." );
      this.spellChecker = spellChecker;
   }
   public void spellCheck(){
      spellChecker.checkSpelling();
   }
}

下面是配置文件 Beans.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd">

   <context:annotation-config/>

   <!-- Definition for textEditor bean without constructor-arg  -->
   <bean id="textEditor" class="com.tutorialspoint.TextEditor">
   </bean>

   <!-- Definition for spellChecker bean -->
   <bean id="spellChecker" class="com.tutorialspoint.SpellChecker">
   </bean>

</beans>

4.@Qualifier 註釋

Spring @Qualifier 註釋

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

這裏是 Student.java 文件的內容:

package com.tutorialspoint;
public class Student {
   private Integer age;
   private String name;
   public void setAge(Integer age) {
      this.age = age;
   }   
   public Integer getAge() {
      return age;
   }
   public void setName(String name) {
      this.name = name;
   }  
   public String getName() {
      return name;
   }
}

這裏是 Profile.java 文件的內容:

package com.tutorialspoint;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
public class Profile {
   @Autowired
   @Qualifier("student1")
   private Student student;
   public Profile(){
      System.out.println("Inside Profile constructor." );
   }
   public void printAge() {
      System.out.println("Age : " + student.getAge() );
   }
   public void printName() {
      System.out.println("Name : " + student.getName() );
   }
}

下面是 MainApp.java 文件的內容:

package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
      Profile profile = (Profile) context.getBean("profile");
      profile.printAge();
      profile.printName();
   }
}

考慮下面配置文件 Beans.xml 的示例:

?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd">

   <context:annotation-config/>

   <!-- Definition for profile bean -->
   <bean id="profile" class="com.tutorialspoint.Profile">
   </bean>

   <!-- Definition for student1 bean -->
   <bean id="student1" class="com.tutorialspoint.Student">
      <property name="name"  value="Zara" />
      <property name="age"  value="11"/>
   </bean>

   <!-- Definition for student2 bean -->
   <bean id="student2" class="com.tutorialspoint.Student">
      <property name="name"  value="Nuha" />
      <property name="age"  value="2"/>
   </bean>

</beans>

5. JSR-250 註釋

Spring JSR-250 註釋

Spring還使用基於 JSR-250 註釋,它包括 @PostConstruct, @PreDestroy 和 @Resource 註釋。因為你已經有了其他的選擇,盡管這些註釋並不是真正所需要的,但是關於它們仍然讓我給出一個簡短的介紹。

5.1@PostConstruct 和 @PreDestroy 註釋:

為了定義一個 bean 的安裝和卸載,我們使用 init-method 和/或 destroy-method 參數簡單的聲明一下 。init-method 屬性指定了一個方法,該方法在 bean 的實例化階段會立即被調用。同樣地,destroy-method 指定了一個方法,該方法只在一個 bean 從容器中刪除之前被調用。

詳見:https://www.cnblogs.com/lukelook/p/9609775.html 5.bean的生命周期

5.2@Resource註釋

@Resource 註釋:

你可以在字段中或者 setter 方法中使用 @Resource 註釋,它和在 Java EE 5 中的運作是一樣的。@Resource 註釋使用一個 ‘name’ 屬性,該屬性以一個 bean 名稱的形式被註入。你可以說,它遵循 by-name 自動連接語義,如下面的示例所示:

package com.tutorialspoint;
import javax.annotation.Resource;
public class TextEditor {
   private SpellChecker spellChecker;
   @Resource(name= "spellChecker")
   public void setSpellChecker( SpellChecker spellChecker ){
      this.spellChecker = spellChecker;
   }
   public SpellChecker getSpellChecker(){
      return spellChecker;
   }
   public void spellCheck(){
      spellChecker.checkSpelling();
   }
}

如果沒有明確地指定一個 ‘name’,默認名稱源於字段名或者 setter 方法。在字段的情況下,它使用的是字段名;在一個 setter 方法情況下,它使用的是 bean 屬性名稱。

9.Spring——基於註解的配置