1. Spring IOC
1.1.Spring IOC的基本概念
概念列表:
- 控制反转(Inversion of Control, IOC)
- 依赖注入(DI)
- Spring IOC容器
- Bean
-
控制反转(Inversion of Control, IOC):是Spring框架的核心,用来消减计算机程序的耦合问题。
简单的说,就是将对象的创建权交给Spring IOC容器来管理。
-
Spring的依赖注入(DI):是IOC的另外一种说法。
从Spring容器角度来看, Spring容器负责将被依赖对象赋值给调用者的成员变量,相当于为调用者注入它所依赖的实例, 这就是依赖注入。
-
Spring IOC容器:实现控制反转的就是Spring IOC容器。
-
Bean:在Spring中,构成应用程序主干,并由Spring IOC容器管理的对象称为bean。Bean及其之间的依赖 关系反映在容器使用的配置元数据中。
下面给出一个简单的反应Bean之间的关系的配置文件
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="myDao" class="com.tao.MyDao"> <!-- collaborators and configuration for this bean go here --> </bean> <bean id="myService" class="com.tao.MyService"> <!-- 给构造方法传递引用类型的参数myDao(从这里可以看出,myService依赖myDao)--> <constructor-arg index="0" ref="myDao"/> </bean> <!-- more bean definitions go here --> </beans>
1.2. Spring IOC容器
上面说过,实现控制反转的是Spring IOC容器。这里会介绍Spring IOC容器以及几个和IOC容器相关的接口和类,如BeanFactory接口、ApplicationContext接口和ClassPathXmlApplicationContext类等。
Spring IOC容器:是控制反转的实现。负责实例化、配置和组装bean。容器通过读取配置文件来获取有关要实例化、配置和组装bean对象的信息。(Bean的配置可以是XML配置文件也可以是注解)。
对于Spring IOC容器, Spring提供两个主要接口:BeanFactory(org.springframework.beans.factory.BeanFactory)
和ApplicationContext(org.springframework.context.ApplicationContext)
。
BeanFactory
提供了完整的Ioc服务支持。这个接口实际开发并不多见。我们主要使用他的子接口ApplicationContext
。ApplicationContext
代表Spring IOC容器,负责配置、组装和实例化Bean。容器通过读取相应的配置元数据(常见的配置形式有xml文件、注解等)来获取和实例化、配置和组装Bean对象的有关信息。
Spring工作方式如下图所示:
Spring IOC容器就通过应用程序类与配置文件中的配置元数据来创建和管理Bean对象。
1.2.1.配置元数据
在讲实例化IOC容器前我们先简单的介绍一下配置Spring。
问:配置元素的作用是什么?
答:我们可以通过配置元数据告诉Spring容器如何实例化,配置和组装应用程序中的对象。
Spring的配置方式有很多, 其中常见的XML文件的形式和注解的形式。
XML配置方式是由一个根元素<beans>
以及多个子元素<bean>
组成。其中<bean>
标签就是配置Bean对象的。
以下示例显示了基于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
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions go here -->
</beans>
该id
属性是bean的唯一表示。class`属性定义Bean的类型,并使用完全限定的类名。
1.2.2. 实例化IOC容器
Spring提供了几个IOC容器接口的实现类如ClassPathXmlApplicationContext、FileSystemAppplicationContext类。
-
通过ClassPathXmlApplicationContext实例化IOC容器
ClassPathXmlApplicationContext将从类路径目录(src目录)中寻找XML配置文件。
public static void main(String[] args){ //①加载配置文件,初始化Spring容器 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //②通过容器获取Bean的实例 MyDao myDao = (MyDao)context.getBean("myDao"); MyService myService = (MyService)context.getBean("myService"); }
-
通过FileSystemXmlApplicationContext实例化IOC容器
FileSystemXmlApplicationContext将从指定文件的绝对路径中寻找XML配置文件。
public static void main(String[] args){ //①加载配置文件,初始化Spring容器 ApplicationContext context = new ClassPathXmlApplicationContext("D:/applicationContext.xml"); //②通过容器获取Bean的实例 MyDao myDao = (MyDao)context.getBean("myDao"); MyService myService = (MyService)context.getBean("myService"); }
注:
采用绝对路径的加载方式将导致程序的灵活性变差,一般不推荐使用。因此Java应用程序通常采用ClassPathXmlApplicationContext类来实例化IOC容器。而在Web应用中,IOC容器的实例化工作将交给Web服务器完成
-
通过Web服务器实例化IOC容器
在Web服务器中,实例化IOC容器时,一般使用基于
org.springframework.web.context.ContextLoaderListener
的实现方式(需要jar包:spring-web-5.0.2RELEASE.jar
),在web.xml中的代码如下:<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!-- 指定以ContextLoaderListener 方式启动Spring容器--> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>