@Bean及@Autowired自動裝配
阿新 • • 發佈:2018-12-14
Bean及自動裝配
本篇文章是關於我對Bean相關知識的學習和理解。學習過程中參考了很多資料,文末有詳細地址。(這裡只說明@註解方式,在xml中配置道理相同)
Bean是什麼?
bean在spring中可以理解為一個物件。理解這個物件需要換一種角度,即可將spring看做一門程式語言,@Bean是spring語言宣告物件的標識。
spring啟動過程中會自動掃描註解,當遇到能產生Bean的註解(見下方列表)後,會將註解的類自動例項化(自動掃描及例項化只進行一次),之後將這個類的例項放到spring框架的容器中,當需要使用時(自動裝配)會從容器中呼叫這個例項。
一般為需要的類都添加註解。 能產生Bean的註解有:
- @Component
- @Repository
- @Controller
- @Service
- @Configration 前五種只能對類使用。
- @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的註解。 自動裝配的註解有: (這些註解裝配功能各有不同,可參考文末資料。)
- @Autowired (通過類裝配,一般用這個)
- @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未初始化。