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)