IOC:控制反转

什么是IOC?

举个例子,我们有一个UserDao接口类,并且有三个UserDao实现类,分别是MysqlUserDaoImpl、OracleUserDaoImpl、UserDaoImpl,都实现UserDao接口,接下来我们编写service层的UserService接口,并且编写UserService实现类UserServiceImpl,如果根据传统的方法去调用dao层的三个实现类来实现其中的方法

我们需要写三遍以下代码

UserServiceImpl userService = new UserServiceImpl();userService.setUserDao(new MysqlUserDaoImpl());
userService.getUser();userService.setUserDao(new OracleUserDaoImpl());
userService.getUser();userService.setUserDao(new UserDaoImpl());
userService.getUser();

但是现在,我们不用传统的方法去调用,而是在UserService实现类中set dao层中的UserDao接口类

public class UserServiceImpl implements UserService{private UserDao userDao;public void setUserDao(UserDao userDao) {this.userDao = userDao;}@Overridepublic void getUser() {userDao.getUser();}
}

然后将我们的dao层中三个接口实现类通过bean交给spring容器托管,并且将Service的实现类也交给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"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd"><bean id="mysqlImpl" class="com.kk.dao.MysqlUserDaoImpl"/><bean id="oracleImpl" class="com.kk.dao.OracleUserDaoImpl"/><bean id="userDaoImpl" class="com.kk.dao.UserDaoImpl"/><bean id="UserServiceImpl" class="com.kk.service.UserServiceImpl">
<!--        ref 引用Spring容器中创建好的对象value 具体的值,基本数据类型
--><!--在UserServiceImpl创建UserDao,将UserDao引入 因此UserServiceImpl有这么一个UserDao的属性  name="userDao",使用ref引用UserDao的三个实现类--><property name="userDao" ref="mysqlImpl"/>
<!--        <property name="userDao" ref="oracleImpl"/>-->
<!--        <property name="userDao" ref="userDaoImpl"/>--></bean></beans>

这时如果我们想要使用dao层中三个接口实现类中的某一个实现类,我们只需要 <property name="userDao" ref="userDaoImpl"/> 使用这个工具的ref选择我们想要实现的实现类

前提是我们必须在service接口实现类中有set dao的接口

package com.kk.service;
import com.kk.dao.UserDao;
public class UserServiceImpl implements UserService{private UserDao userDao;public void setUserDao(UserDao userDao) {this.userDao = userDao;}@Overridepublic void getUser() {userDao.getUser();}
}

代码如下:

UserDao

package com.kk.dao;public interface UserDao {public void getUser();}

MysqlUserDaoImpl

package com.kk.dao;public class MysqlUserDaoImpl implements UserDao{@Overridepublic void getUser() {System.out.println("Mysql获取用户数据");}
}

OracleUserDaoImpl

package com.kk.dao;public class OracleUserDaoImpl implements UserDao{@Overridepublic void getUser() {System.out.println("Oracal获取用户数据");}
}

UserDaoImpl

package com.kk.dao;public class UserDaoImpl implements UserDao{@Overridepublic void getUser() {System.out.println("获取用户数据");}
}

UserService

package com.kk.service;public interface UserService {public void getUser();
}

UserServiceImpl

package com.kk.service;import com.kk.dao.UserDao;public class UserServiceImpl implements UserService{private UserDao userDao;//IOC  控制反转public void setUserDao(UserDao userDao) {this.userDao = userDao;}@Overridepublic void getUser() {userDao.getUser();}
}

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/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd"><bean id="mysqlImpl" class="com.kk.dao.MysqlUserDaoImpl"/><bean id="oracleImpl" class="com.kk.dao.OracleUserDaoImpl"/><bean id="userDaoImpl" class="com.kk.dao.UserDaoImpl"/><bean id="UserServiceImpl" class="com.kk.service.UserServiceImpl">
<!--        ref 引用Spring容器中创建好的对象value 具体的值,基本数据类型
--><!-- 想要使用哪一个实现类ref就指向哪一个  -->     <property name="userDao" ref="mysqlImpl"/></bean></beans>

测试:

public class Test {public static void main(String[] args) {//获取ApplicationContext 拿到Spring的容器ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");//拿到容器之后 需要什么就get即可UserServiceImpl userServiceImpl = (UserServiceImpl) context.getBean("UserServiceImpl");userServiceImpl.getUser();}
}

以上便是IOC的思想,化繁为简,使用传统的去实现这个功能,需要不断的改变测试类的代码,然而使用IOC控制反转,只需改bean.xml中的代码即可

【Spring第二篇】IOC:控制反转相关推荐

  1. Spring概述及IOC(控制反转) Part I

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.Spring概述 1.Spring的模块划分图: 2.Spring主要由(IOC+AOP)构成: ioc的创建方式 ...

  2. spring学习笔记 -- day02 spring基础、IOC控制反转

    一:srping的介绍 1.spring的体系结构 2.spring资源 a.spring-framework-4.2.4.RELEASE:Spring Framework的官方发行包 b.sprin ...

  3. Spring框架中IoC(控制反转)的原理

    一.IoC的基础知识以及原理: 1.IoC理论的背景:在采用面向对象方法设计的软件系统中,底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑.即软件系统中对象之间的耦合,对 ...

  4. Spring学习:IOC控制反转

    一.Spring概述: Spring是一个开源框架,其存在的根本使命就是简化JAVA开发.为了降低JAVA开发的复杂性,Spring采取了以下四种关键策略: 基于POJO的最轻量级和最小侵入性编程: ...

  5. Spring第一天 IOC 控制反转JavaBean规范 Bean的作用域 生命周期 依赖注入

    Spring:是软件框架,是软件半成品,包含了很多组件. 核心组件:ioc容器 IOC控制反转: 由代码自己控制对象的创建,称为:主动控制(自己new对象,自己炒番茄炒蛋) 有一个组件容器管理对象,应 ...

  6. Spring中的IoC(控制反转)和DI(依赖注入)

    一.Spring IoC的基本概念 控制反转(IoC) 是一个比较抽象的概念,它主要用来消减计算机程序的耦合问题,是Spring框架的核心. 依赖注入(DI) 是IoC的另外一种说法,只是从不同的角度 ...

  7. Spring核心(ioc控制反转)

     IoC,Inversion Of Control 即控制反转,由容器来管理业务对象之间的依赖关系,而非传统方式中的由代码来管理. 其本质.即将控制权由应用程序代码转到了外部容器,控制权的转移就是 ...

  8. Spring 框架之Ioc控制反转

    IoC,Inversion of Control的缩写,中文名称为控制反转,意思是将对象的控制权转移至第三方,例如IoC容器,即可由IoC容器来管理对象的生命周期.依赖关系等. 1.先新建一个Spri ...

  9. 原创经典-为什么Spring中的IOC(控制反转)能够降低耦合性(解耦)?

    学到Spring老师一定会讲一句话:IOC能够降低耦合性.可是为什么会降低耦合性,许多老师就讲不清了或者干脆不讲,下面我们通过举一些栗子,一步一步地说明为什么IOC能够降低耦合性. 前言 通过本文你将 ...

  10. Spring的ioc控制反转

    spring介绍 Spring的出现是为了取代EJB(Enterprise JavaBean)的臃肿.低效.脱离现实的缺点. Spring致力于J2EE应用的各层(表现层.业务层.持久层)的解决方案, ...

最新文章

  1. Creative Web Typography Styles | Codrops
  2. [转]PHP--优化PHP代码建议
  3. 【自用】nginx.conf
  4. mysql慢sql增加读写分离_MySQL-Proxy实现MySQL读写分离提高并发负载
  5. 松果出行CTO朱蓝天做客《智慧Talk》,解开共享电单车产研密码
  6. Graph Without Long Directed Paths
  7. java集合概念_JAVA集合概念
  8. java导出pdf_一张PDF了解JDK11 GC调优秘籍-附PDF下载
  9. java开发环境怎么写_Java开发基础设置:如何配置Java运行环境
  10. oracle 多表视图更新
  11. 最近了解过的一个支付接口
  12. Linux在终端搜索的两条命令
  13. 服务器间数据传输的四种方式
  14. 社交网络分析(igraph)
  15. 计算机系统从本地硬盘启动设置,技嘉主板电脑在BIOS中设置硬盘启动教程
  16. 行为设计学-让创意更有黏性
  17. Office各个windows版本支持大全
  18. ubuntu alise设置
  19. 【软考中级】软件设计师学习笔记
  20. Linux 创建线程 段错误,linux下线程池,出现Segmentation fault (core dumped) 问题

热门文章

  1. 【BZOJ3992】【SDOI2015】序列统计
  2. unity5 人皮渲染 Skin Shading
  3. XP没有IIS服务组组件
  4. SpringMVC学习总结(三)——Controller接口详解(1)
  5. centos7.6内核升级
  6. 企业实战|基于Cobbler实现多版本系统批量部署
  7. 虚拟化VMware ESXi 6.7服务器安装配置
  8. 持续集成工具 jenkins 实践
  9. CentOS 7.4创建普通用户赋予登录权限
  10. 异常来自 HRESULT:0x800A01A8