spring中@Bean及@Autowired自動裝配
spring中@Bean及@Autowired自動裝配
Bean及自動裝配
本篇文章是關於我對Bean相關知識的學習和理解。學習過程中參考了很多資料,文末有詳細地址。(這裡只說明@註解方式,在xml中配置Bean道理相同)
Bean是什麼?
bean在spring中可以理解為一個物件。理解這個物件需要換一種角度,即可將spring看做一門程式語言,@Bean是spring語言宣告物件的標識。
spring啟動過程中會自動掃描註解,當遇到能產生Bean
一般為需要的類都添加註解。
能產生Bean的註解有:
(這些註解產生的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未初始化。
參考資料:
https://www.cnblogs.com/weknow619/p/6673667.html
https://www.cnblogs.com/bossen/p/5824067.html
https://www.cnblogs.com/wuchanming/p/5426746.html
https://blog.csdn.net/u013257679/article/details/52295106
https://www.cnblogs.com/wuchanming/p/5426746.html
https://blog.csdn.net/u012260707/article/details/52021265
https://www.cnblogs.com/duanxz/p/7493276.html
https://zhidao.baidu.com/question/265797284911663645.html
https://www.cnblogs.com/zhuwoyao88/p/6596295.html