Spring升级案例之IOC介绍和依赖注入

Spring升级案例之IOC介绍和依赖注入 一、IOC的概念和作用 1.什么是IOC

控制反转(Inversion of Control, IoC)是一种设计思想,在Java中就是将设计好的对象交给容器控制,而不是传统的在对象内部直接控制。传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建;可以理解为IoC 容器控制了对象和外部资源获取(不只是对象包括比如文件等)。

2.反转和正转

有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。

3.IoC的作用

IoC 不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是 松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。

此外,IoC对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序原本是老大,要获取什么资源都是主动出击,但是在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC容器来创建并注入它所需要的资源了。

二、基于XML的IOC 1.创建工程

本项目建立在入门案例中传统三层架构的基础上,项目结构如下:

SpringIOC的项目结构

首先在pom.xml文件中添加如下内容:

<packaging>jar</packaging> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.5.RELEASE</version> </dependency> </dependencies> 2.创建xml文件

在resource目录下新建beans.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 "> </bean>

这里有一个小细节,在创建xml文件的时候,选择new->XML Configuration File->Spring Config,就会自动创建带有约束的Spring的xml配置文件。如下图:

创建xml配置文件

3.使用Spring来创建bean对象

在bean标签内部添加如下内容:IOC容器本质上是一个map,id就是key,class对应的就是bean对象的全限定类名,Spring可以依据全限定类名来创建bean对象来作为map的value属性。

<!-- 把对象的创建交给Spring来管理 --> <bean></bean> <bean></bean> 4.使用IOC容器创建的bean对象

在src/main/java目录下创建ui.Client类:

public class Client { /** * 获取Spring的IoC核心容器,并根据id获取对象 * @param args */ public static void main(String[] args) { //1.获取IoC核心容器 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml"); //2.根据id获取bean对象 //第一种方法:只传入id获取到对象之后强转为需要的类型 IAccountService accountService = (IAccountService) applicationContext.getBean("accountService"); System.out.println(accountService); //第二种方法:传入id和所需要类型的字节码,这样getBean返回的对象就已经是所需要的对象 IAccountDao accountDao = applicationContext.getBean("accountDao", IAccountDao.class); System.out.println(accountDao); } }

关于ApplicationContext,这里需要说明一下,首先通过选中这个接口然后右键Diagrams->Show Diagrams,可以看到接口的继承关系:其中BeanFactory接口就是IoC容器的底层接口。

ApplicationContext接口的继承关系

在diagram中选中ApplicationContext接口,然后右键Show Implementations,可以看到该接口的实现类:

ApplicationContext接口的实现类

关于这些实现类需要说明如下几点:

ApplicationContext的实现类: 1.ClassPathXmlApplicationContext:加载类路径下的配置文件,要求配置文件必须在类路径下 2.FileSystemApplicationContext:加载磁盘任意路径下的配置文件,要求配置文件必须有访问权限,这种方法不常用 3.AnnotationApplicationContext:用于读取注解创建容器 5.IoC核心容器的两个接口:ApplicationContext和BeanFactory

ApplicationContext:创建核心容器时采用立即加载的方式创建对象,读取配置文件之后,立刻创建Bean对象(单例模式)。

BeanFactory:创建核心容器时采用延迟加载的方式创建对象,当根据id获取对象时,才会创建Bean对象(多例模式)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyspyd.html