1. 程式人生 > >spring的裝配

spring的裝配

for 註解 不想 exceptio int ali base his posit

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中進行顯示配置用的不多。

spring的裝配