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

spring中@Bean及@Autowired自動裝配

spring中@Bean及@Autowired自動裝配

Bean及自動裝配

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

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未初始化。

參考資料:
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