IoC也稱爲依賴注入(dependency injection, DI)。這是一個過程,在這個過程當中,對象僅經過構造函數參數、工廠方法的參數或對象實例構造或從工廠方法返回後在該對象實例上設置的屬性來定義它們的依賴關係(即與它們一塊兒工做的其餘對象)。而後容器在建立bean時注入這些依賴項。這個過程本質上與bean自己相反(所以稱爲控制反轉),bean自己經過直接構造類或一種機制(如服務定位器模式)來控制依賴項的實例化或位置。html
org.springframework.beans
和 org.springframework.context
包是Spring Framework的IoC容器的基礎。BeanFactory接口提供了可以管理任何類型對象的高級配置機制。ApplicationContext是BeanFactory的子接口。簡而言之,BeanFactory提供了配置框架和基本功能,而ApplicationContext添加了更多企業特定的功能。ApplicationContext是BeanFactory的一個完整超集。java
在Spring中,構成應用程序主幹並由Spring IoC容器管理的對象稱爲bean。bean是由Spring IoC容器實例化、組裝和管理的對象。不然,bean只是應用程序中的許多對象之一。bean及其之間的依賴關係反映在容器使用的配置元數據中。spring
org.springframework.context.ApplicationContext
接口表示Spring IoC容器,負責實例化、配置和組裝bean。容器經過讀取配置元數據獲取關於要實例化、配置和組裝哪些對象的指令。配置元數據用XML、Java註釋或Java代碼表示。它容許您表達組成應用程序的對象以及這些對象之間豐富的相互依賴關係。api
Spring提供了ApplicationContext接口的幾個實現。在獨立應用程序中,一般建立ClassPathXmlApplicationContext或FileSystemXmlApplicationContext的實例。雖然XML一直是定義配置元數據的傳統格式,但能夠經過提供少許XML配置來聲明支持這些額外的元數據格式,從而指示容器使用Java註釋或代碼做爲元數據格式。框架
下圖顯示了Spring如何工做的高級視圖函數
傳統上,配置元數據以簡單直觀的XML格式提供,不過基於XML的元數據不是惟一容許的配置元數據形式。Spring IoC容器自己徹底與實際編寫此配置元數據的格式分離。如今,許多開發都是基於Java的配置。this
@Configuration
, @Bean
, @Import
,和@DependsOn
註釋。Spring配置包含容器必須管理的至少一個且一般不止一個bean定義。基於XML的配置元數據將這些bean配置爲<bean/>
頂級元素內的<beans/>
元素。Java配置一般@Bean
在@Configuration
類中使用註釋方法。spa
這些bean定義對應於組成應用程序的實際對象。一般,定義服務層對象、數據訪問對象(DAOs)、表示對象(如Struts操做實例)、基礎設施對象(如Hibernate SessionFactories)、JMS隊列等等。一般,不會在容器中配置細粒度域對象,由於一般由dao和業務邏輯負責建立和加載域對象。不過,可使用Spring與AspectJ的集成來配置在IoC容器控制以外建立的對象。.net
如下示例顯示了基於XML的配置元數據的基本結構:code
<?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="teacher" class="com.example.spring.beans.Admin"> <!-- collaborators and configuration for this bean go here --> <property name="name" value="小明"/> <property name="sex" value="男"/> <property name="age" value="22"/> </bean> <!-- more bean definitions go here --> </beans>
id
屬性是一個標識單個bean定義的字符串。class
屬性定義bean的類型並使用徹底限定的類名。提供給ApplicationContext
構造函數的位置路徑是資源字符串,它容許容器從各類外部資源(如本地文件系統,Java等)加載配置元數據CLASSPATH
。
ApplicationContext context = new ClassPathXmlApplicationContext("user.xml");
簡單示例以下
項目結構:
Admin對象:
package com.example.spring.beans; import lombok.Data; /** * @author * @version 2019/4/16 上午 10:40 */ @Data public class Admin { private String name; private String sex; private Integer age; }
User對象:
package com.example.spring.beans; import lombok.Data; /** * @author * @version 2019/4/16 上午 10:40 */ @Data public class User { private Integer type; private Admin admin; @Data public static class Child { private String name; } }
content.xml配置文件:
<?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="admin" class="com.example.spring.beans.Admin"> <!-- collaborators and configuration for this bean go here --> <property name="name" value="小明"/> <property name="sex" value="男"/> <property name="age" value="22"/> </bean> <!-- more bean definitions go here --> </beans>
user.xml配置文件:
<?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"> <import resource="content.xml"/> <alias name="user2" alias="user3"/> <bean id="user" name="user2" class="com.example.spring.beans.User"> <!-- collaborators and configuration for this bean go here --> <property name="type" value="1"/> <property name="admin" ref="admin"/> </bean> <bean id="a" class="com.example.spring.beans.User$Child"> <!-- collaborators and configuration for this bean go here --> <property name="name" value="123"/> </bean> <!-- more bean definitions go here --> </beans>
main方法:
package com.example.spring; import com.example.spring.beans.Admin; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * @author * @version 2019/4/16 上午 10:47 */ public class Main { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("classpath:/user.xml"); System.out.println(context); System.out.println(context.getBean("user")); System.out.println(context.getBean("user2")); System.out.println(context.getBean("user3")); System.out.println(context.getBean(Admin.class)); System.out.println(context.getBean("a")); } }
運行結果:
18:33:19.614 [main] DEBUG org.springframework.context.support.ClassPathXmlApplicationContext - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@73a28541 18:33:19.738 [main] DEBUG org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loaded 1 bean definitions from class path resource [content.xml] 18:33:19.739 [main] DEBUG org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loaded 3 bean definitions from class path resource [user.xml] 18:33:19.762 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'teacher' 18:33:19.804 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'user' 18:33:19.806 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'a' org.springframework.context.support.ClassPathXmlApplicationContext@73a28541, started on Wed Apr 17 18:33:19 CST 2019 User(type=1, admin=Admin(name=小明, sex=男, age=22)) User(type=1, admin=Admin(name=小明, sex=男, age=22)) User(type=1, admin=Admin(name=小明, sex=男, age=22)) Admin(name=小明, sex=男, age=22) User.Child(name=123)