1. 程式人生 > >@Bean及@Autowired自動裝配

@Bean及@Autowired自動裝配

Bean及自動裝配

本篇文章是關於我對Bean相關知識的學習和理解。學習過程中參考了很多資料,文末有詳細地址。(這裡只說明@註解方式,在xml中配置道理相同)

Bean是什麼?

bean在spring中可以理解為一個物件。理解這個物件需要換一種角度,即可將spring看做一門程式語言,@Bean是spring語言宣告物件的標識。

spring啟動過程中會自動掃描註解,當遇到能產生Bean的註解(見下方列表)後,會將註解的類自動例項化(自動掃描及例項化只進行一次),之後將這個類的例項放到spring框架的容器中,當需要使用時(自動裝配)會從容器中呼叫這個例項。

一般為需要的類都添加註解。 能產生Bean的註解有:

(這些註解產生的Bean各有不同,可參考文末資料。)

  1. @Component
  2. @Repository
  3. @Controller
  4. @Service
  5. @Configration 前五種只能對類使用。
  6. @Bean (特殊,可對方法註解。@Bean註解需在上方五個註解的類中才生效,例如下:)
// Class B
// 此處用一個任意Bean類註解
@Component 
public class B {
	int testValue;
}
// Class A
// 此處用一個任意Bean類註解
@Component
public class A {

	@Bean
    public B b(){
    	B b =
new B(); // b的自定義處理程式碼 b.testValue = 123; return b; } }

(類C中程式碼涉及到自動裝配,見下文解釋)

// Class C
// 此處用一個任意Bean類註解
@Service 
public class C {

	public static B b; // 宣告為static

    @Autowired // 自動裝配方式1
    public void setB(B b) {
        System.out.println("B自動裝配");
        TestController.b =
b; System.out.println("b.testValue" + b.testValue); // 此處列印結果為 123 TestController.b.testValue = 456; System.out.println("b.testValue" + b.testValue); // 此處列印結果為 456 // 此處,b為經過在A類中@Bean註解的方法b()中初始化處理過的例項 } }

自動裝配是什麼?

建立應用物件之間協作關係的行為稱為裝配。也就是說當一個類A的屬性中聲明瞭另一個類B的物件,A例項化時,需要為A的屬性B進行例項化。這就是裝配。 自動轉配會自動將物件屬性例項化。 在A類中宣告屬性B時加上註解@Autowired,A例項化時spring會自動從容器中調動B的例項。為了讓spring能從容器中呼叫B的例項,需在B的類宣告上能產生Bean的註解。 自動裝配的註解有: (這些註解裝配功能各有不同,可參考文末資料。)

  1. @Autowired (通過類裝配,一般用這個)
  2. @Resource (通過自命名裝配) (兩者區別見:https://baijiahao.baidu.com/s?id=1608114169828948852&wfr=spider&for=pc) @Autowired自動裝配有兩種方式: 一種是重寫set方法,可對物件自定義操作,B中屬性testValue可自行初始化,見上方類C中程式碼。 另一種直接使用@Autowired註解宣告,不能對宣告物件自定義操作,即B中屬性testValue未初始化,方式如下:
// Class A
public class A {
	@Autowired
	private B b; // 不能宣告為static
} 
// Class B
// 此處用一個任意Bean類註解
@Service 
public class B {
	int testValue;
}

這樣,當在某處例項化A時,spring會自動從容器中為A裝配物件b,但是b.testValue未初始化。