`

【SSH进阶之路】Spring的IOC逐层深入——为什么要使用IOC[实例讲解](二)

阅读更多

上篇博客【SSH进阶之路】Spring简介,搭建Spring环境——轻量级容器框架(一),我们简单的介绍了Spring的基本概念,并且搭建了两个版本的Spring开发环境,但是我们剩下了Spring最核心的两大技术:IoC和AOP,没有深入介绍。从这篇博文开始,我们开始一一的深入学习Spring的两个核心。Spring目前最引人注目的地方,就是IOC=InversionOfControl(控制反转)或者DI=Dependence Injection(依赖注入)的设计思想。

这篇博客我们使用传统方式(即不使用Spring)来实现一个添加用户的实例,再同理使用Spring实现添加用户的实例,对比学习IoC的概念,以及为什么使用IoC等等,最后,简单总结。下面我们开始:

 

传统方式:

 

客户端:

public class Client {

	public static void main(String[] args){
		//由我们的应用程序负责服务(对象)定位,主动发起查找
		UserManager userManager = new UserManagerImpl();
		userManager.addUser("jiuqiyuliang", "123456");
	}
}

业务逻辑层:

UserManager接口:添加用户的方法

public interface UserManager {

	public void addUser(String userName,String password);
}

UserManager实现

public class UserManagerImpl implements UserManager{

	@Override
	public void addUser(String userName, String password) {
		//由我们的应用程序负责服务(对象)定位,主动发起查找
		//UserDao userDao = new UserDao4MysqlImpl();
		UserDao userDao = new UserDao4OracleImpl();
		userDao.addUser(userName, password);
	}
}

数据访问层:

UserDao接口:添加用户的方式

public interface UserDao {

	public void addUser(String userName,String password);
}

UserDao两种实现(Mysql和Oracle):传统方式使用配置文件,然后使用工厂来创建相应的对象(即我们经常说的配置文件+抽象工厂+反射,一会儿我们再看看Spring创建对象的方式)

public class UserDao4MysqlImpl implements UserDao{

	@Override
	public void addUser(String userName, String password) {
		
		//打印访问Mysql的相关信息
		System.out.println("UserDao4MysqlImpl.addUser");
	}
}
public class UserDao4OracleImpl implements UserDao{

	@Override
	public void addUser(String userName, String password) {
		
		//打印访问Oracle的相关信息
		System.out.println("UserDao4OracleImpl.addUser");
	}
}

运行效果图:



看到上面的代码,非常的熟悉,因为我们平时经常使用。但是问题来了,在业务逻辑层的实现中,UserDao有多种不同的实现方式,例如Mysql和Oracle,UserManager要依赖于UserDao的具体实现。并且对象是由我们自己负责创建的,我们主动的发起了一个查找,要依赖于一种数据库的实现。此时我们的UserManager就和UserDao的具体实现紧紧的耦合在一起了我们再看客户端,我们要使用UserManager,同业务逻辑层一样,还得需要我们自己负责主动查找UserManager的具体实现。

 

我们可以发现:传统方式,对象和对象之间发生严重的依赖关系,耦合度非常高而且依赖关系都写死在了代码里,项目不易修改和维护,必须要改代码

 

下面我们使用Spring方式改造实例,实现同样的功能,让Spring管理我们的对象,看看Spring是怎么创建对象和描述对象之间依赖关系的。

 

Spring方式:

 

项目的包图:

客户端:

public class Client {

	public static void main(String[] args){

		BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
		//到IOC容器中获取UserManager
		UserManager userManager = (UserManager) factory.getBean("userManager");
		//UserManager使用UserDao,在配置文件已经有依赖关系
		userManager.addUser("jiuqiyuliang", "123456");		
	}
}

业务逻辑层:
UserManager实现:

public class UserManagerImpl implements UserManager{

	private UserDao userDao;

	//使用构造方式赋值
	public UserManagerImpl(UserDao userDao) {
		this.userDao = userDao;
	}

	@Override
	public void addUser(String userName, String password) {

		userDao.addUser(userName, password);
	}

}

Spring的配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	     xmlns:aop="http://www.springframework.org/schema/aop"
	     xmlns:tx="http://www.springframework.org/schema/tx"
	     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd">

	<!-- 使用spring管理对象的创建,还有对象的依赖关系 -->
	<bean id="userDao4Mysql" class="com.tgb.spring.dao.UserDao4MysqlImpl"/>

	<bean id="userDao4Oracle" class="com.tgb.spring.dao.UserDao4OracleImpl"/>
	
	<bean id="userManager" class="com.tgb.spring.manager.UserManagerImpl">
		<!-- (1)userManager使用了userDao,Ioc是自动创建相应的UserDao实现,都是由容器管理-->
		<!-- (2)在UserManager中提供构造函数,让spring将UserDao实现注入(DI)过来 -->
		<!-- (3)让spring管理我们对象的创建和依赖关系,必须将依赖关系配置到spring的核心配置文件中 -->

		<constructor-arg ref="userDao4Oracle"/>
	</bean>
	
</beans>

 

由于其他地方的代码和效果图,同上,不再浪费大家的带宽。

 

对比传统的实现方式,再看客户端和UserManager,我们可以发现:通过IoC或DI,我们只需要通过简单的配置,而无需任何代码就可以指定UserManager中所需的UserDao的具体实现。UserManager只需利用容器注入的UserDao实例,完成自身的业务逻辑,而不用关心具体实现来自哪、由谁实现。换句话说:我们不再需要自己负责创建对象,管理对象生命周期以及维护对象的依赖关系,这些都有Spring替我们完成了。

 

传统方式和Spring方式对比:

 

传统方式:决定使用哪一个具体实现是由应用程序负责的,在编译阶段就确定了。

Spring方式:调用类只依赖接口,而不依赖具体的实现类,减少了耦合。控制权交给了容器,在运行期才由容器决定将具体的实现动态的“注入”到调用类的对象中。这也是使用IoC的根本原因。

 

现在我们对IoC有了基本认识,我们再理解一下IoC的概念。

 

IoC

 

IoC(Inversion of Control),控制反转,用白话来讲,就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接控制。这也就是所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,就是所谓反转。

 

IoC的优缺点

 

优点:

1、把对象的创建和依赖关系定义在了XML文件中,我们改变子类的实现变得异常简单。

2、控制反转减轻了对象之间的耦合度,减轻了对象之间的依赖关系,增加了系统的灵活性,可维护性,以及可移植性等等。

 

缺点:

1、生成对象的方式变复杂了(事实上操作还是挺简单的),对于不习惯这种方式的人,会觉得有些别扭和不直观。

2、创建对象因为使用了反射技术,在效率上有些损耗。但相对于IoC提高的维护性和灵活性来说,这点损耗是微不足道的,除非某对象的生成对效率要求特别高。

 

总结

 

IoC使得面向对象的世界更加简单,面向接口编程成为了可能。

 

引言:下篇博文,我为大家转载了一篇深入理解IoC原理的博文,相当简单,通俗易通。之后,我为大家准备了一篇依赖注入几种类型对比的博文,快马加鞭ing,敬请期待。

分享到:
评论

相关推荐

    SpringIoC的简单实现

    【SSH进阶之路】一步步重构容器实现Spring的IoC——解决容器对组件的“侵入式”管理的两种方案--服务定位器和IoC容器(九) 【SSH进阶之路】一步步重构容器实现Spring的IoC——工厂+反射+配置文件实现IoC容器(十)

    Java进阶之SpringIoC源码深度剖析共19页.pd

    【标题】"Java进阶之SpringIoC源码深度剖析共19页.pd" 提供的是一项关于Java开发中的高级主题,特别是针对Spring框架的依赖注入(Inversion of Control,IoC)部分的深入研究。Spring IoC是Spring框架的核心特性之一...

    Java进阶之SpringIoC应用共18页.pdf.zi

    在Java开发领域,Spring框架是不可或缺的一部分,尤其是其核心组件——Spring Inversion of Control(IoC)容器。本文将深入探讨Spring IoC的应用,旨在帮助Java开发者进一步提升技能,掌握高级编程技巧。Spring IoC...

    springIoc实现原理

    Spring Ioc(Inversion of Control,控制反转)是Spring框架的核心特性之一,它改变了传统应用程序中对象的创建和管理方式。在传统的软件设计中,对象的创建和依赖关系的维护通常由代码自身来完成,而在Spring Ioc中...

    Spring框架的简单实现

    我们从一个简单的容器开始,一步步的...【SSH进阶之路】一步步重构容器实现Spring框架——配置文件+反射实现IoC容器(十) 【SSH进阶之路】一步步重构容器实现Spring框架——彻底封装,实现简单灵活的Spring框架(十一)

    Spring IoC加载流程讲解

    Spring IoC 加载流程讲解 在本节中,我们将对 Spring IoC 加载流程进行详细的讲解,并探讨 IoC 思想和依赖倒置原则的应用。 IoC 控制反转 IoC(Inversion of Control)是指在软件设计中,将对象实例的控制权从...

    springioc的详细讲解

    Spring IOC,全称为Inversion of Control,即控制反转,是Spring框架的核心特性之一。它将对象的创建和管理从应用程序代码中分离出来,使得应用程序不再负责对象的生命周期,而是由Spring容器来负责。这种设计模式...

    Spring中IoC优点与缺点解析

    Spring 中 IoC 优点与缺点解析 IoC(Inversion of Control)是 Spring 框架中的一种设计模式,它的主要思想是将对象的创建和管理交给容器,从而解耦合对象之间的依赖关系。今天,我们将详细解析 IoC 的优点和缺点。 ...

    spring ioc

    标题 "Spring IOC" 描述了我们讨论的核心主题——Spring 框架中的依赖注入(Inversion of Control,简称 IOC)机制。Spring 是一个广泛应用的 Java 应用开发框架,其核心特性之一就是IOC,它极大地简化了软件组件...

    Spring IoC讲解PPT

    IoC(Inversion of Control)即控制反转,是 Spring 的核心特性之一。在传统的编程模式中,对象之间存在依赖关系,程序员需要手动创建和管理这些对象。而在 Spring 中,IoC 容器负责管理和创建对象,对象之间的依赖...

    spring ioc和aop原理流程图(详细)

    Spring 框架是Java开发中的核心框架,它主要由两个关键部分组成:IOC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)。这两个概念是Spring框架的核心特性,极大地简化了企业...

    SpringIoc示例代码

    Spring IOC,全称Inversion of Control,即“控制反转”,是Spring框架的核心特性之一。在传统的Java应用程序中,对象的创建和管理通常由开发者自己控制。而在Spring IOC中,这种控制权被反转,对象的创建、初始化、...

    Spring的ioc小案例

    本案例主要探讨的是Spring框架的核心特性之一——依赖注入(Dependency Injection,简称DI),通常也被称为IOC(Inversion of Control,控制反转)。通过这个小案例,我们可以深入理解Spring如何实现IoC以及属性注入...

    实验一 Springioc基本操作.docx

    1. 创建项目和配置文件:在使用 Spring IOC 之前,需要创建一个项目并配置相关的依赖项。pom.xml 文件是 Maven 项目的核心配置文件,用于管理项目的依赖项。在 pom.xml 文件中,需要添加 Spring IOC 相关的依赖项,...

    springioc和spring aop

    Spring框架是Java开发中不可或缺的一部分,它通过提供两种核心特性——控制反转(IoC)和面向切面编程(AOP)来简化应用的构建。理解并掌握这两种技术对于任何Java开发者来说都至关重要。 **控制反转(IoC)**,也...

    spring ioc思维导图源文件

    Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性之一,它允许开发者将对象的创建和管理交给Spring容器来处理,从而使代码更加松耦合,更易于测试和维护。下面将详细介绍Spring IOC的基本概念、...

    springIOC手写框架分析

    springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC...

    Android进阶——框架打造之IOC框架

    Android进阶——框架打造之IOC框架 实现通过Id找到控件的功能 实现通过Id找到Color、String资源 实现绑定view的点击事件、长按事件 实现绑定SetContentView 实现绑定网络的检测功能

    spring ioc模块手写demo

    spring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demo...

    Spring IOC.pdf

    Spring IOC,即Spring控制反转,是Spring框架的核心特性之一。控制反转(Inversion of Control,简称IoC)是一种设计原则,用于减少代码间的耦合,提高系统模块化和代码的重用性。在Spring框架中,IOC具体体现在对...

Global site tag (gtag.js) - Google Analytics