1. 程式人生 > >Spring框架註解掃描開啟之配置細節

Spring框架註解掃描開啟之配置細節

前言

Spring框架對Bean進行裝配提供了很靈活的方式,下面歸納一下主要的方式:
• 在XML中進行顯示配置
• 在Java中進行顯示配置
• 隱式的bean發現機制和自動裝配

而自動裝配實現就需要註解掃描,這時發現了兩種開啟註解掃描的方式,即<context:annotation-config/><context:component-scan>
下面歸納一下這兩種方式的異同點:

<context:annotation-config>:註解掃描是針對已經在Spring容器裡註冊過的Bean

<context:component-scan>

:不僅具備<context:annotation-config>的所有功能,還可以在指定的package下面掃描對應的bean

Demo:

Demo:XML註冊Bean方式

下面給出兩個類,類A和類B

package com.test;
pubic class B{

    public B(){
        System.out.println("B類");
    }
}
package com.test;
public class A {
    private B bClass;

    public void setBClass(B bClass){
        this
.bClass = bClass; System.out.println("通過set的方式注入B類"); } public A(){ System.out.println("A類"); } }

如何我們這時可以通過傳統的xml配置在Application.xml裡進行bean註冊

<bean id="bBean"class="com.test.B"/>
<bean id="aBean"class="com.test.A">
  <property name="bClass" ref="bBean"
/> </bean>

啟動載入Application.xml

輸出:
類B
類A
通過set的方式注入B類

Demo:annotation配置註解開啟方式

package com.test;
pubic class B{

    public B(){
        System.out.println("B類");
    }
}
package com.test;
public class A {
    private B bClass;

    @Autowired 
    public void setBClass(B bClass){
        this.bClass = bClass;
        System.out.println("通過set的方式注入B類");
    }

    public A(){
        System.out.println("A類");
    }
}

然後我們需要在Application.xml裡註冊Bean,假如我們先這樣配置,僅僅註冊Bean,不開啟掃描

<bean id="bBean"class="com.test.B"/>
<bean id="aBean"class="com.test.A"/>

或者僅僅開啟掃描,不註冊Bean

<context:annotation-config/>

這時載入Application.xml配置

輸出:
類B
類A

我們會發現下面的@Autowired的方法是不能被載入的

@Autowired 
    public void setBClass(B bClass){
        this.bClass = bClass;
        System.out.println("通過set的方式注入B類");
    }

解決方法:
修改Application.xml配置檔案

<context:annotation-config/>
<bean id="bBean"class="com.test.B"/>
<bean id="aBean"class="com.test.A"/>

重新載入配置檔案,輸出正常了

輸出:
類B
類A
通過set的方式注入B類

歸納:<context:annotation-config>:註解掃描是針對已經在Spring容器裡註冊過的Bean

Demo:component配置註解開啟方式

package com.test;
pubic class B{

    public B(){
        System.out.println("B類");
    }
}
package com.test;
@Component
public class A {
    private B bClass;

    @Autowired 
    public void setBClass(B bClass){
        this.bClass = bClass;
        System.out.println("通過set的方式注入B類");
    }

    public A(){
        System.out.println("A類");
    }
}

然後我們配置一下application.xml,開啟annotaion-config掃描

<context:annotation-config />

載入配置檔案:

輸出:
類B
類A

原因:<context:annotation-config>:註解掃描是針對已經在Spring容器裡註冊過的Bean,Bean並沒有註冊過,所以即使開啟了@Autowired、@Component註解 和配置開啟了annotaion-config掃描還是載入不到

修改配置檔案:

<context:component-scan base-package="com.test"/>

重新載入配置檔案:

輸出:
類B
類A
通過set的方式注入B類

歸納:

<context:annotation-config>:註解掃描是針對已經在Spring容器裡註冊過的Bean

<context:component-scan>:不僅具備<context:annotation-config>的所有功能,還可以在指定的package下面掃描對應的bean

<context:annotation-config /><context:component-scan>同時存在的時候,前者會被忽略。

即使註冊Bean,同時開啟<context:annotation-config />掃描,@autowire,@resource等注入註解只會被注入一次,也即只加載一次