基於注解的形式配置Bean


基於注解的方式配置Bean:也就說我們在每個Bean的類名前面注解一下,Spring會自動幫我們掃描Bean放進IOC容器中


I基於注解的方式配置Bean(沒有依賴關系的Bean)有兩個步驟:

1組件掃描(component scanning):
     Spring 能夠從 classpath( 類路徑下,也就是Src文件夾下)下自動掃描, 偵測和實例化具有特定注解的組件.
     特定組件包括: @Component: 基本注解, 標識了一個受 Spring 管理的組件
             @Respository: 建議標識在持久層組件(Model)
             @Service: 建議標識在服務層(業務層)組件
             @Controller: 建議標識在表現層組件(就是控制層) 對於掃描到的組件,
Spring 有默認的命名策略:使用非限定類名,第一個字母小寫(UserService-->userService
            也可以在注解中通過 value 屬性值標識組件的名稱 例如@Component("userService"),指定組件的名為userService

2在Spring配置文件里配置掃描組件<component-scan>

  <component-scan>的屬性:1base-package 屬性指定一個需要掃描的基類包,Spring 容器將會掃描這個基類包里及其子包中的所有類. 當需要掃描多個包時, 可以使用逗號分隔.
                  2resource-pattern: 屬性指定掃描特定的類(可以使用通配符),
                  3user-default-Filter:指定是否使用默認的過濾器。默認為TRUE
  <component-scan>的子節點:1<context:include-filter>(過濾器) 子節點表示要包含的目標類,與user-default-Filter配合使用
                  2
<context:exclude-filter>(過濾器) 子節點表示要排除指定的目標類(也就是說指定的目標類將不被掃描)


具體實現步奏:
    1導入Spring的AOP的jar包:spring-aop-4.0.0.RELEASE.jar

    2在Bean的類名前面添加注解:

    3在Spring的配置文件里配置掃描組件:<context:component-scan>

II基於注解的方式配置Bean(具有依賴關系的Bean)
  實現原理:

  實際上<context:component-scan> 元素還會自動注冊 AutowiredAnnotationBeanPostProcessor 實例,
  該實例可以自動裝配具有 @Autowired 和 @Resource 、@Inject注解的屬性.(就是利用這個特點裝配依賴的Bean)
    屬性講解
        
@Autowired 注解:1自動裝配具有兼容類型的單個 Bean屬性
                   2構造器, 普通字段(即使是非 public), 一切具有參數的方法都可以應用@Authwired 注解(自動去IOC容器去找,如果找到和注解類型兼容(相同)的Bean就自動加載).
                   3 當 Spring 找不到匹配的 Bean 裝配屬性時, 會拋出異常,  可以設置 @Authwired 注解的 required 屬性為 false(required=falses時當IOC容器沒有注解的Bean,                    也一樣運行。不拋異常)
                   4 默認情況下, 當 IOC 容器里存在多個類型兼容的 Bean 時, 通過類型的自動裝配將無法工作. 此時可以在 @Qualifier 注解里提供 Bean 的名稱.
                   5 @Authwired 注解也可以應用在數組類型的屬性上, 此時 Spring 將會把所有匹配的 Bean 進行自動裝配.
                   6@Authwired 注解也可以應用在集合屬性上, 此時 Spring 讀取該集合的類型信息, 然后自動裝配所有與之兼容的 Bean.
                   7 @Authwired 注解用在 java.util.Map 上時, 若該 Map 的鍵值為 String, 那么 Spring 將自動裝配與之 Map 值類型兼容的 Bean, 此時 Bean 的名稱作為鍵值
       
         @Resource :
注解要求提供一個 Bean 名稱的屬性,若該屬性為空,則自動采用標注處的變量或方法名作為 Bean 的名稱
        
            @Inject    :
@Inject 和 @Autowired 注解一樣也是按類型匹配注入的 Bean, 但沒有 reqired 屬性
所以一般建議使用@autowired

具體的實現流程:

    1新建有依賴關系Bean
     例如person依賴Eat,Eat依賴eatType

    2在引用依賴Bean的前面添加@Authwired注解
    例如person依賴Eat:

package control;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import model.Eat;
@Component
public class person {
    @Autowired private Eat eat;

    public Eat getEat() {
        return eat;
    }

    public void setEat(Eat eat) {
        this.eat = eat;
    }
    public void showPerson() {
        System.out.println("Person................");
        eat.eat(this);
    }
}

    3配置掃描組件:<context:component-scan>(默認值掃描一個包的,若想掃描多個包,用逗號分隔開):代碼示例

<context:component-scan base-package="view,control,model"></context:component-scan>

 

 


    

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM