IOC容器中的依賴注入(一)

基於Spring官網總結html

IOC文檔:https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beansjava

1、配置元數據

org.springframework.context.ApplicationContext接口表明Spring IoC容器,並負責實例化,配置和組裝Bean。spring

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="..." class="...">  
        <!-- 此bean的協做者和配置在這裏 -->
    </bean>
	<!--	該id屬性是標識單個bean定義的字符串。
			該class屬性定義Bean的類型,並使用徹底限定的類名-->
</beans>

有關在Spring容器中使用其餘形式的元數據的信息,請參見:編程

  • 基於註釋的配置:Spring 2.5引入了對基於註釋的配置元數據的支持。
  • 基於Java的配置:從Spring 3.0開始,Spring JavaConfig項目提供的許多功能成爲核心Spring Framework的一部分。所以,您能夠使用Java而不是XML文件來定義應用程序類外部的bean。要使用這些新功能,請參閱 @Configuration@Bean@Import,和@DependsOn註釋。

Spring配置由容器必須管理的至少一個(一般是一個以上)bean定義組成。基於XML的配置元數據將這些bean配置爲<bean/>頂級元素內的<beans/>元素。Java配置一般@Bean@Configuration類中使用帶註釋的方法api


2、實例化容器

容器其實就至關於"bean.xml"此類文件函數

ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");

3、組成基於XML的配置元數據

一般,每一個單獨的XML配置文件都表明體系結構中的邏輯層或模塊,這樣能夠使bean定義跨越多個XML文件可能會頗有用。spa

<beans>
    <import resource="services.xml"/>
    <import resource="resources/messageSource.xml"/>
    <import resource="/resources/themeSource.xml"/>

    <bean id="bean1" class="..."/>
    <bean id="bean2" class="..."/>
</beans>

官方建議:code

能夠但不建議使用相對的「 ../」路徑引用父目錄中的文件。這樣作會建立對當前應用程序外部文件的依賴關係。特別是,對於運行時解析過程選擇「最近的」類路徑根目錄而後查看其父目錄的classpath:URL,不建議使用此引用(例如classpath:../services.xml)。類路徑配置的更改可能會致使選擇其餘錯誤的目錄。您始終能夠使用標準資源位置而不是相對路徑:例如file:C:/config/services.xmlclasspath:/config/services.xml。可是,請注意,您正在將應用程序的配置耦合到特定的絕對位置。一般最好爲這樣的絕對位置保留一個間接尋址-例如,經過在運行時針對JVM系統屬性解析的「 $ {…}」佔位符xml


4、使用容器

// 建立和配置bean
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");

// 檢索配置實例
PetStoreService service = context.getBean("petStore", PetStoreService.class);

// 使用配置實例
List<String> userList = service.getUsernameList();

5、依賴注入

    • 依賴:bean 對象的建立依賴於容器!
    • 注入:bean 對象中的全部屬性,由容器來注入!

官方解釋:htm

依賴注入(DI)是一個過程,經過該過程,對象只能經過構造函數參數,工廠方法的參數或在構造或建立對象實例後在對象實例上設置的屬性來定義其依賴關係(即,與它們一塊兒工做的其餘對象),從工廠方法返回,而後,容器在建立bean時注入那些依賴項。

從根本上講,此過程是經過使用類的直接構造或服務定位器模式來控制其依賴項的實例化或位置的Bean自己的逆過程

DI存在兩個主要變體基於構造函數的依賴注入基於Setter的依賴注入

1.基於構造函數的依賴注入

構造函數參數類型匹配

<bean id="exampleBean" class="examples.ExampleBean">
    <constructor-arg type="int" value="7500000"/>
    <constructor-arg type="java.lang.String" value="42"/>
</bean>

構造函數參數索引

<bean id="exampleBean" class="examples.ExampleBean">
    <constructor-arg index="0" value="7500000"/>
    <constructor-arg index="1" value="42"/>
</bean>
<!--注意索引從0開始-->

構造函數參數名稱

<bean id="exampleBean" class="examples.ExampleBean">
    <constructor-arg name="years" value="7500000"/>
    <constructor-arg name="ultimateAnswer" value="42"/>
</bean>

注意:當配置文件開始加載的時候,容器(至關於Bean)中管理的對象就已經開始初始化了。

2.基於Setter的依賴注入

bean注入

<!-- 在父上下文中-->
<bean id="accountService" <!-- bean名稱與父bean相同 -->
    class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="target">
        <ref parent="accountService"/> <!-- 注意咱們是如何引用父bean的 -->
    </property>
    <!-- 在這裏按須要插入其餘配置和依賴項 -->
</bean>

普通值注入

<bean id="theTargetBean" class="..." />
<bean id="client" class="...">
    <property name="targetName" value="theTargetBean"/>
</bean>

集合:

<list/><set/><map/>,和<props/>元件設置Java的屬性和參數Collection類型ListSetMap,和Properties,分別。如下示例顯示瞭如何使用它們

<bean id="moreComplexObject" class="example.ComplexObject">
    <!-- results in a setAdminEmails(java.util.Properties) call -->
    <property name="adminEmails">
        <props>
            <prop key="administrator">administrator@example.org</prop>
            <prop key="support">support@example.org</prop>
            <prop key="development">development@example.org</prop>
        </props>
    </property>
    <!-- results in a setSomeList(java.util.List) call -->
    <property name="someList">
        <list>
            <value>a list element followed by a reference</value>
            <ref bean="myDataSource" />
        </list>
    </property>
    <!-- results in a setSomeMap(java.util.Map) call -->
    <property name="someMap">
        <map>
            <entry key="an entry" value="just some string"/>
            <entry key ="a ref" value-ref="myDataSource"/>
        </map>
    </property>
    <!-- results in a setSomeSet(java.util.Set) call -->
    <property name="someSet">
        <set>
            <value>just some string</value>
            <ref bean="myDataSource" />
        </set>
    </property>
</bean>

映射鍵或值的值或設置值也能夠是如下任意元素:

bean | ref | idref | list | set | map | props | value | null

關於IOC控制反轉

控制:誰來控制對象的建立,傳統應用程序的對象是由程序自己控制建立的,使用 Spring 後,對象是由 Spring 來建立的。

反轉:程序自己不建立對象,而變成被動的接收對象。

依賴注入:就是利用 set 方法來進行注入的。

IOC 是一種編程思想,由主動的編程變成被動的接收。

能夠經過 new ClassPathXmlApplicationContext 去瀏覽一下底層源碼。

到了如今,咱們完全不用在程序中去改動了,要實現不一樣的操做,只須要在 xml 配置文件中進行修改,所謂的 IOC,一句話搞定:對象由 Spring 來建立,管理,裝配

相關文章
相關標籤/搜索