Spring裝配有三種方式: 基於XML的顯式配置 基於註解的自動裝配 在java中進行顯示配置 1、基於註解的自動裝配 Spring從組件掃描和自動裝配兩個角度實現自動轉配 組件掃描:Spring會自動發現應用上下文中所創建的bean,配置時需要指定掃描的包 組件掃描會將標記了以下註解的類實例化交 ...
Spring裝配有三種方式:
- 基於XML的顯式配置
- 基於註解的自動裝配
- 在java中進行顯示配置
1、基於註解的自動裝配
Spring從組件掃描和自動裝配兩個角度實現自動轉配
- 組件掃描:Spring會自動發現應用上下文中所創建的bean,配置時需要指定掃描的包
<context:component-scan base-package="com.cn"></context:component-scan>
組件掃描會將標記了以下註解的類實例化交給Spring容器管理
@Controller、@Service、@Repository、@Component
- 自動裝配:Spring自動滿足bean之間的依賴
在組件掃描時候,創建bean之後,容器會儘可能的去滿足bean的依賴。自動裝配通過註解@Autowired實現,該註解定義如下:
@Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Autowired { boolean required() default true; }
a、屬性required的值預設為true,表明在創建bean後,一定要被@Autowired註解的類型裝配上匹配的bean,否則,容器啟動會拋出異常:
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.cn.pojo.Person] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
b、將required的值設置為false,spring會嘗試執行自動裝配,但如果沒有匹配的bean,spring會讓這個bean處於未裝配狀態。這時,會有隱患,通常需要進行null檢查,否則拋出NullPointerException異常
c、無論是否設置required的值,當容器中存在有多個bean滿足依賴關係,spring將會拋出一個異常,表明沒有明確指出要選擇哪個bean進行自動裝配。
Spring提供了多種可選方案解決這樣的歧義:
1)將可選bean中的某一個設為首選,當裝配遇到這樣的歧義時候,spring將會使用首選bean。
@Primary註解配置,常與@Controller、@Service、@Repository、@Component使用:
package com.cn.pojo; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Component; @Primary @Component public class Person { //... }
或者xml配置:
<bean id="person" class="com.cn.pojo.Person" primary="true"></bean>
註:如果配置了兩個或者兩個以上的首選bean,那麼它就無法正常工作了,同樣還是有歧義。
2)使用限定符指定spring裝配的bean
@Qualifier註解是使用限定符的主要方式,常與@Autowired使用
package com.cn.controller; import com.cn.pojo.Person1; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Controller; @Controller public class HelloController { @Autowired @Qualifier("person1") private Person1 person1; public void print(){ System.out.println(person1.toString()); } }
限定符:
實例化一個bean時候,預設限定符為首字母小寫的類名。與預設的bean的ID規則一致,如果bean不想使用預設id,可以在@Controller、@Service、@Repository、@Component上指定id的值。
可以在實例化對象時候,使用 @Qualifier註解指定類的限定符
package com.cn.pojo; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Component; @Component @Qualifier("person100") public class Person1 { //... }
2、基於XML的顯式配置
- 使用構造器初始化bean
a、裝配字面量
b、裝配bean
c、裝配集合
d、c命名空間
- 設置屬性初始化bean
a、裝配字面量
b、裝配bean
c、裝配集合
d、p命名空間
- util命名空間:用於定義獨立於bean之外的集合,可被引用裝配bean
小結:通常項目中將基於註解的自動裝配和基於XML的顯示配置結合使用,在java中進行顯示配置用的不多。