標籤:style blog color io os 使用 ar java strong
基於註解的方式配置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 進行自動裝配.
[email protected] 註解也可以應用在集合屬性上, 此時 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;@Componentpublic 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>
基於註解的形式配置Bean