基於注解的方式配置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>