Spring裝配Bean(一)

z1340954953發表於2018-05-21

三種bean的裝配機制

* xml中配置

* java中進行顯式配置

* 隱式的bean發現機制和自動裝配

自動化裝配bean

Spring從兩個角度來實現自動化裝配:

* 元件掃描(component scanning) : Spring 會自動發現應用上下文中建立的bean

* 自動裝配(autowiring): Spring自動滿足bean之間的依賴

1. 建立可以被發現的bean

舉個例子:建立一個類,Spring會發現它並加其建立為一個bean,然後建立另一個bean,並注入到前面bean中 。

package com.erong.interface_;

public interface CompactDisc {
	void play();
}
package com.erong.service;

import org.springframework.stereotype.Component;

import com.erong.interface_.CompactDisc;
@Component
public class SgtPeppers implements CompactDisc {
	private String title = "Sgt.Pepper's Hearts Club Band ";
	private String artist = "The Beatles";
	@Override
	public void play() {
		System.out.println("Playin "+title+" by "+artist);
	}

}

@Component註解,表示該類作為元件類,並告知Spring要為這個類建立bean

package com.erong.service;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan
public class CDPlayerConfig {

}

@ComponentScan註解,能夠在Spring中啟用元件掃描,沒有其他配置的話,預設掃描和配置類相同的包,找到@Component的類,並建立一個bean。

如果使用xml來啟用元件掃描的話,使用Spring context名稱空間的<context:component-scan basepackage="com.long">元素,basepackage設定掃描的路徑

package com.erong.service;

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.erong.interface_.CompactDisc;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=CDPlayerConfig.class)
public class CDPlayerTest {
	@Autowired
	private CompactDisc cpd;
	@Test
	public void test(){
		Assert.assertNotNull(cpd);
	}
}

CDPlayerTest 使用了Spring的SpringJUnit4ClassRunner,以便在測試開始的時候自動建立Spring應用的上下文

註解@ContextConfiguration會告訴需要在CDPlayerConfig中載入配置,從而找到@Component的bean,並建立。

2. 為元件掃描的bean命名

Spring上下文中所有的bean都會給定義一個id,如果給掃描的bean也定義一個唯一id

@Component(value="sgtp") 或者使用Java依賴注入規範@Named註解來為bean設定id

Note:Spring支援@Named作為@Component替換,只有細微查詢,大多數情況可以互換

3. 設定元件掃描的基礎包

@ComponentScan的value屬性中指定包的名稱

@ComponentScan(value="com.test")

如果需要配置多個基礎包,basePackages配置

@ComponentScan(basePackages={"com.erong","com.test"})

除了將包設定為簡單的String型別之外,@ComponentScan指定為包中包含的類或者介面

@ComponentScan(basePackageClasses={com.erong.service.SgtPeppers.class})

4. 通過為bean新增註解實現自動裝配

自動裝配:在Spring上下文中尋找匹配某個bean需求的其他bean。

* Autowire註解

1> 構造器上新增了@Autowired註解,表示建立物件的時候,自動傳入一個bean

@Autowired
public CDPlayer(CompactDisc cd){
	this.cd = cd;
}

2> 用在屬性的setter方法上

@Autowired
public void setCd(CompactDisc cd) {
	this.cd = cd;
}

實際上,如果存在一個insertDisc方法,也可以使用@Autowire將bean注入

Note:

1> 不管是構造器、setter方法還是其他的方法,對於Autowire Spring都會嘗試滿足方法引數上宣告的依賴.

2> 對於Autowire註解,假如只有一個bean,就會注入一個,存在多個就會拋異常

3> Spring上下文中不存在匹配的bean,那麼在建立Spring上下文的時候,Spring將丟擲異常,為了避免異常的出現,將@Autowire的 required屬性設定為false

4> @Inject註解替換@Autowire,大多數場景可以互換。

相關文章