《Spring實戰》第二章 — 裝配Bean

2.1 Spring裝配Bean的可選方案

  • 在XML中進行顯示配置;
  • 在Java中進行顯示配置;
  • 隱式的Bean發現機制和自動裝配;

2.2 自動化裝配Bean

  • 掃面組件(component scanning):Spring會自動發現應用程序上下文中所建立的Bean;
  • 自動裝配(autowiring):Spring自動知足Bean之間的依賴;

2.1.1 建立可被發現的Bean

    須要在類上使用@Component註解:java

@Component
public class Car ...

    而後在Java配置類中開啓組件掃描:函數

@Configuration
@ComponentScan
public class AppConfig ...

    若是使用XML來自用組件掃描的話:ui

<context:component-scan base-package="你的包" />

    自動裝配被@Component修飾的Bean:this

@ContextConfiguration(classes=AppConfig.class)
public class CarTest {
    @Autowired
    private Car car;

    ...
}

2.2.2 爲組件掃描的Bean命名

    Spring應用上下文中全部的Bean都會有一個ID。若是沒有明確設置Bean的ID,那麼ID就是將類名的第一個字母變爲小寫,例如Car對象的ID就是car。spa

    若是須要自定義Bean的ID:code

@Component("miniCar")
public class Car ...

    還可使用Java依賴注入規範中所提供的@Named註解來設置:component

@Named("miniCar")
public class Car ...

2.2.3 設置組件掃描的基礎包

    若是使用@ComponentScan來打開自動掃描Bean,若是不設置指定掃描的包名的話,它會按照默認規則,以配置類所在的包做爲基礎包來掃描。xml

    但也能夠手動設置:對象

@Configuration
@ComponentScan("你的包名")
public class AppConfig ...

    還能夠設置多個包:接口

@Configuration
@ComponentScan(basePackages={"包1", "包2"})
public class AppConfig ...

    另外,能夠指定包中所包含的類或接口:

@Configuration
@ComponentScan(basePackageClasses={Car.class, Xxx.Class})
public class AppConfig ...

2.2.4 爲Bean添加註解實現自動裝配

    爲了聲明要進行自動裝配,可使用@Autowired註解。

@Component
public class Driver {
    private Car car;
    
    @Autowired
    public Driver(Car car) {
        this.car = car;
    }
}

    上面是經過構造函數注入,還能夠經過setter方法注入:

@Autowired
public void setCar(Car car) {
    this.car = car;
}

    實際上,setCar()方法沒有任何特殊之處,@Autowired註解能夠用在類的任何方法上,例如:

@Autowired
public void insertCar(Car car) {
    this.car = car;
}

    若是沒有匹配到Bean,那麼在應用上下文建立的時候,Spring會拋出一個異常,爲了不異常的出現,能夠將@Autowired的required屬性設置爲false:

@Autowired(required=false)
public void setCar(Car car) {
    this.car = car;
}

    在設置required等於false時,若是在代碼中沒有進行null檢查,而使用這個未匹配到的Bean對象的話,可能會出現NullPointerException異常。

    Java依賴注入規範也提供了@Inject替代@Autowired:

@Named
public class Driver {
    private Car car;
    
    @Inject
    public Driver(Car car) {
        this.car = car;
    }
}

2.3 經過Java代碼裝配Bean

    儘管在不少場景下經過組件掃描和自動裝配實現Spring的自動化配置是更爲推薦的方式,可是有時候自動裝配的方案行不通,所以須要明確配置Spring。好比說,要將第三方庫中的組件裝配到你的應用中,是沒有辦法在它的類上添加@Component和@Autowired註解的,所以就不能使用自動化裝配方案了。

2.3.1 聲明簡單的Bean

    在配置類中,編寫一個方法建立所需類型的實例,而後給這個方法添加@Bean註解:

@Configuration
public class AppConfig {
    @Bean
    public Car car() {
        return new Car();
    }    
}

    也能夠給這個Bean重命名:

@Configuration
public class AppConfig {
    @Bean(name="miniCar")
    public Car car() {
        return new Car();
    }    
}

2.3.2 注入聲明的Bean

    在配置中最簡單的方式就是引用建立的bean方法,例如:

@Configuration
public class AppConfig {
    @Bean
    public Car car() {
        return new Car();
    }

    @Bean
    public Driver driver() {
        return new Driver(car());
    }
}

    上面的代碼中,給每一個司機一輛新的車,若是想讓全部司機使用同一輛車的話,能夠這麼作:

@Configuration
public class AppConfig {
    @Bean
    public Car car() {
        return new Car();
    }

    @Bean
    public Driver driver(Car car) {
        return new Driver(car);
    }
}

    driver()方法請求一個car做爲參數。當Spring調用driver()方法建立driver的時候,它會自動裝配一個car到配置方法中。

2.4 經過XML裝配Bean

    使用XML聲明Bean:

<bean id="car" class="package.Car" />

    經過構造器注入初始化Bean有兩個方案:

  • <constructor-age>元素;
  • Spring3.0提供的c-命名空間;
<bean id="driver" class="package.Driver">
    <constructor-arg ref="car" />
</bean>
<bean id="driver" class="package.Driver" c:car-ref="car" />

    裝配集合:

<constructor-age>
    <list>
        <value>item1</value>
        <value>item2</value>
        <value>item3</value>
    </list>
</constructor-age>
<constructor-age>
    <list>
        <ref bean="car1" />
        <ref bean="car2" />
        <ref bean="car3" />
    </list>
</constructor-age>
<constructor-age>
    <set>
        <value>item1</value>
        <value>item2</value>
        <value>item3</value>
    </set>
</constructor-age>

    設置屬性:

<bean id="driver" class="backage.Driver">
    <property name="car" ref="Car" />
</bean>
<bean id="driver" class="backage.Driver" p:car-ref="car" />

2.5 導入混合配置

2.5.1 在JavaConfig中引入XML配置

    假設咱們如今有DriverConfig和CarConfig兩個Java代碼配置類,和一個XML配置文件,咱們須要一種方法將這兩個Java配置類和一個XML配置文件組合在一塊兒,可使用@Import和@ImportResource這兩個註解:

@Configuration
@Import(CarConfig.class)
@Import("classpath:xml-config.xml")
public class DriverConfig ...

2.5.2 在XML配置中引入JavaConfig

    可使用<import>元素來拆分XML配置,並經過bean導入JavaConfig配置類:

<import resoune="car-config.xml" />
<bean class="package.CarConfig" />
相關文章
相關標籤/搜索