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"/>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章