1. 程式人生 > >Spring——容器,注入(配置和註解兩種方式)

Spring——容器,注入(配置和註解兩種方式)

一、Spring的容器:

1.什麼是控制反轉:傳統的方法,當某個java物件A需要呼叫物件B時,是由呼叫者(物件A)通過new關鍵字來建立物件B的,而在Spring中,則是由spring完成建立的,所以“控制反轉”了。

2.容器:

Spring容器是Spring的核心。

例項化一個spring容器,容器會自動預初始化所有Bean例項。

ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml"); //例項化一個Spring容器,
Boss boss = (Boss) ac.getBean("boss"); //取得物件boss

二、裝配(注入):

1.設定注入:屬性必須寫setter方法格式為:

<bean id=" " class=" ">

    <property name=" " value=" " />

    <property name=" " value=" " />

</bean>

 	
    <bean id="boss" class="wang.spring.Boss">
        <property name="car" ref="car"/>
        <property name="office" ref="office" />
    </bean>
    <bean id="office" class="wang.spring.Office">
        <property name="officeNo" value="002"/>
    </bean>
    <bean id="car" class="wang.spring.Car" scope="singleton">
        <property name="brand" value=" 紅旗 CA72"/>
        <property name="price" value="2000"/>
    </bean>

2.構造注入:必須寫有參的建構函式。

<bean id="car" class="wang.spring.Car ">

  <constructor-arg  index=" 0" type=“int” value=" 001” />

  <constructor-arg  index=" 1" type=“String” value=" baoma” />

</bean>

利用上面程式碼,可以新建一個例項car,並給它的屬性賦值。

3.依賴注入:當引用了其他類的物件時。

<property name=" " ref=" ">

或者

<constructor-arg ref=" ">

<beans>  
       <bean id=”bean1” class=”……”>  
              <property name=”屬性1” value=”……”/>  
       </bean>  
<bean id=”bean2” class=”……”>  
              <property name=”bean1” ref=”bean1”/>  
       </bean>  
</beans>  

4.集合的注入:

Set集合注入:

<bean id=”……” class=”……”>  
<set>  
              <value>value1</value>  
              <value>value2</value>  
              ……  
       </set>  
</bean>  

Lsit集合注入:

<bean id=”……” class=”……”>  
   <list>  
        <value>value1</value>  
        <value>value2</value>  
              ……  
    </list>  
</bean> 

Map集合注入:

<bean id=”……” class=”……”>  
<map>  
              <entry key=”key1” value=”value1”>  
              <entry key=”key2” value=”value2”>  
              ……  
       </map>  
</bean> 

Properties注入

<bean id=”……” class=”……”>
<props>
              <prop key=”key1”>value1</prop>
              <prop key=”key2”>value2</prop>
              ……
       </props>
</bean>


5.自動注入:

通過bean裡的屬性autowire可以自動注入例項。

no:不使用自動裝配。這是預設配置。 byName:根據屬性自動裝配,BeanFactory會查詢容器中所有的Bean,找出id屬性與屬性名同名的Bean來完成注入。如果沒有找到匹配的Bean,Spring則不會進行任何注入。 byType:根據屬性型別自動裝配,BeanFactroy會查詢容器中所有的 Bean,如果一個正好與依賴屬性型別相同的Bean,就會自動注入這個屬性。 如果有多個這樣的Bean則會丟擲異常。如果沒有這樣 的Bean則什麼也不會發生,屬性不會被設定。
	
	<bean class="dao.OrderDaoImpl" autowire="byName"></bean>
	<bean class="dao.ItemDaoImpl"></bean>
	<bean id="storeService" class="service.StoreServiceImpl"></bean>
	
</beans>

三、通過註解自動裝配:

註解可以分為兩大類。JSR-250規範註解方式 Spring自帶的註解方式。

通過註解的方式裝配時,必須在配置檔案中新增一個bean,它其實是一個註解處理器,用於解析註解。

JSR-250規範註解方式的處理器:

<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/>

Spring自帶的註解方式的處理器:

<bean class="org.sprinframework.beans.factory.annotation. AutowiredAnnotationBeanPostProcessor"/>

當然,我們有更方便的方法,兩種註解方式都可以用下面的方式隱式得註冊註解處理器:

  <context:annotation-config>

1.JSR-250規範註解方式:

@Resource

預設是按照名稱匹配(byName),但它有兩個屬性,name和type。分別可以指定自動匹配的型別。

標註在成員變數,setter方法,建構函式上都可以。

public class Boss {
    // 自動注入型別為 Car 的 Bean
    @Resource
    private Car car;

    // 自動注入 bean 名稱為 office 的 Bean
    @Resource(name = "office")
    private Office office;
}
 

2.Spring自帶的註解方式:

@Autowired

按照型別匹配(byType)

標註在成員變數,setter方法,建構函式上都可以。

因為這種註解是按照型別注入的,所以要有多個同類型的物件,則會出現異常。此時我們可以用@Qualifier指定物件的名稱,兩者結合使用,便可以確定一個物件。

public class Boss {
 
    @Autowired
    @Qualifier("office")
    private Office office;
    //當在成員變數上標註時,不需要寫setter方法…
}
 
@Qualifier的標註物件是成員變數、方法入參、建構函式入參。正是由於註釋物件的不同,所以 Spring 不將 @Autowired@Qualifier 統一成一個註釋類。(@Qualifier只能結合@Autowired使用,不能單獨使用)


四、實現零配置:

我們可以通過上面兩種註解方式,在bean中實現自動注入。但是bean還得在xml檔案中通過<bean>進行定義。那我們能不能也通過註解方式定義bean,實現零配置呢。答案是肯定的。

Spring提供如下幾個Annotation來標註Spring Bean: @Component標註一個普通的Spring Bean; @Controller:標註一個控制器元件類; @Service:標註一個業務邏輯元件類; @Repository:標註一個Dao元件; 目前Component可在各層通用。
@Component
public class Boss {
    @Autowired
    private Car car;

    @Autowired
    private Office office;
    …
}

這時,bean.xml檔案中就不必用<bean>來定義bean了。只需新增一行<context:component-scan base-package="com.baobaotao"/>用來指定這些類所在的包。 
<context:component-scan base-package="com.baobaotao"/>