Spring的IOC介绍
Spring的IOC思想
Spring的核心思想之一:IOC(Inversion Of Control)控制反转。
控制反转(Inversion Of Control,即IOC):把对象的创建、初始化、销毁等工作交给框架,是框架的重要特征
。并非面向对象编程的术语。控制反转包括依赖注入
和依赖查找
。
-
控制反转表达的意思是什么?
把对象的创建交给外部的容器完成,这个就是控制反转。
- Spring使用控制反转来实现对象的使用(使该部分程序不用在程序中写死)。
-
那么对象和对象之间的依赖关系Spring中的是如何处理的?
依赖注入(Dependency injection)
。- Spring中使用依赖注入来实现对象之间的依赖关系。
- 在创建对象之后,对象的关系处理就是依赖注入。
控制反转是通过外部容器完成的,而Spring中提供了一个容器,称该容器为:IOC容器
。无论对象的创建,处理对象之间的依赖关系,对象创建的时间,对象创建的数量,都是在Spring索提供的IOC的容器上来配置对象的信息。
IOC的思想的核心在于:资源不在是使用资源方来管理,而是将资源交给第三方管理(IOC容器),这样来处理带来很多好处:
- 资源的集中管理,实现资源的可配置和易管理。
- 降低了使用资源双方的依赖程度,也就是耦合度问题。
Spring使用IOC容器管理对象
Spring的IOC容器如何管理对象的?下面来看看Spring的操作步骤。
1、导入依赖
<!--Spring核心依赖jar包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<!--log4j日志-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--注解相关jar包-->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
2、编写配置文件
- Spring的配置文件(applicationContect.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-3.0.xsd">
</beans>
3、创建实体类
- 创建资源(User.java)。
public class User {
private String id;
private String name;
//getter和setter方法省略
}
4、IOC容器管理对象
- 以前我们通过
new User
的方法创建对象。如:User user = new User();
- 现在使用IOC的容器。可以让IOC容器帮创建对象,在
applicationContext.xml
文件中添加User的对应信息。
<?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-3.0.xsd">
<!--使用bean节点来创建对象 id属性表示对象 class属性表示要交给容器管理的对象的全路径-->
<bean id="user" class="com.tulun.bean.User"/>
</beans>
5、通过容器来获取User对象
public class App {
public static void main(String[] args) {
//获取IOC的容器
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//通过容器来获取当前的对象
User user = (User) applicationContext.getBean("user");
System.out.println(user);
}
}
- 执行结果:
Spring的IOC容器介绍
Spring中的core模块:IOC容器,解决对象的创建和对象之间的依赖关系。
- 那么如何得到IOC容器?
上图是Spring IOC容器中接口的继承关系,其中ApplicationContext是BeanFactory的子接口之一,换句话说,Beanfactory是IOC容器中最底层的接口,而ApplicationContext是其高级接口之一,在于对BeanFactory做了许多的功能上的扩展。在大部分的应用场景下,都是使用ApplicationConext作为Spring IOC的容器。
ApplicationContext的常见的实现类
ApplicationContext的常见的实现类 | 说明 |
---|---|
ClassPathXmlApplicationContext(常用) | 加载类路径下的配置文件,要求配置文件必须在类路径下 |
FileSystemXmlApplicationContext | 可以加载磁盘任意路径下的配置文件(必须要有访问权限) |
XmlWebApplicationContext | 在Web环境下读取配置信息 |
AnnotationContigApplicationContext | 用于读取注解创建容器 |
- 三种读取配置文件的程序代码写法:
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
FileSystemXmlApplicationContext xmlApplicationContext = new FileSystemXmlApplicationContext("c:/java/applicationContext.xml");
XmlWebApplicationContext wa = new XmlWebApplicationContext()//并没有初始化容器
wa.setServletContext(sevletcontext);//需要指定servletContext对象
wa.setConfigLocation("/applicationContext.xml");//指定配置文件的路径,开头是以web为根目录的路径
wa.refresh();//初始化容器
BeanFactory和ApplicationContext的区别
- ApplicationContext在构建核心容器时,创建对象采取的是
立即加载
的方式。也就是说,只要一读取完配置文件马上就创建配置文件中配置的对象。 - BeanFactory在构建核心容器时,创建对象采取的策略是采用
延迟加载
的方式。也就是说,什么时候根据id获取对象了,什么时候才真正的创建对象。
Spring容器原理浅析
- 1、利用dom4j技术,解析XML配置文件,获取里面所有的信息。
- 2、根据class属性的值,利用反射创建对象。
- 3、将利用反射创建出的对象放入到map中,key就是它所对应的id值。