先来复习一下多态吧,简单点讲,就是一个类的引用可以指向其本身以及其子类的对象。

Like these:

FatherClass a = new FatherClass();

FatherClass a = new Son1Class();

FatherClass a = new Son2Class();

再来说说接口和其实现类,父类和子类是继承关系(父子关系),接口和实现类的关系与之是有区别的;

接口中只定义方法,没有方法体,而接口实现类就是负责补充方法体,多个实现类的方法体可以是不同的。

现在定义一个接口InterfaceDemo和两个实现类Demoimp1、Demoimp2.三个类都有同名方法say();

InterfaceDemo b = new Demoimp1();

InterfaceDemo c = new Demoimp2();

那么b.say()和c.say()是调用了两个不同的方法的。

说到这,就该轮到Spring闪亮登场了!!!

1.面向接口的编程

从上面我们可以看到,我们想要调用某个实现类的say()方法,先要实例化一个这个类的对象,无论是直接实例化

还是通过引用多态的方式实例化该类对象。

而面向接口呢,是不显式地实例化这个实现类对象,而是定义一个接口类的对象,然后定义方法去调用接口类对

象的方法,然后在程序要真正使用这个方法时,先通过setter()方法来声明这个接口类对象具体是指向哪个实现类

的对象,然后运行这个方法时就会真正调用接口实现类的的方法了(接口和实现类的方法名都相同)。

 1 public class Userservice {
 2     // 定义接口的引用
 3     private UserDao userdao;
 4
 5     // 定义setter方法,设置接口的引用指向哪个实现类的对象
 6     public void setUserdao(UserDao userdao) {
 7         this.userdao = userdao;
 8     }
 9
10     public void useradd(User newuser) {
11         // 此时的userdao经过spring依赖注入之后已经实现指向特定的接口实现类对象
12         // 那么调用接口的方法,实际上是调用了特定实现类的方法的
13         userdao.adduser(newuser);
14     }
15 }

2.依赖注入

又叫做接口注入,可以看做规定这个接口对象userdao到底要指向哪个实现类的对象,进而实现对何种实现类方法

的调用。

以下是beans.xml文件:

1     <bean id="todo" class="com.eco.daoimp.Usertodo1"></bean>
2
3     <!--定义Userservice类内部接口的引用(userdao)指向具体的实现类对象(Usertodo1) -->
4     <bean id="userservice" class="com.eco.service.Userservice">
5         <property name="userdao" ref="todo"></property>
6     </bean>

依赖注入有三种方法,在这里只说最常用的setter注入,红字可以看做是一个连接器,上面的第二个bean标签实现

了声明接口对象userdao是指向Usertodo1这个实现类的,那么自然之前的userdao.adduser(newuser)实际上也就等

于实例化一个Usertodo1对象,然后调用Usertodo1对象的adduser(newuser)方法。

3.测试类通过对xml文件的操作来明确接口对象的指向

 1 public class Test1 {
 2     @Test
 3     public void add() {
 4         // Spring读取beans。xml文件
 5         ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
 6         // 解析id为userservice的bean标签,内部实现UserDao userdao = new Usertodo1()
 7         Userservice service = (Userservice) ctx.getBean("userservice");
 8         User newuser = new User("桔子桑", 31);
 9         // 此时调用的useradd()方法,就是接口实现类Usertodo1的useradd()方法
10         service.useradd(newuser);
11     }
12 }

如此,就实现了通过xml文件来对Usertodo1的useradd(newuser)方法的调用。我为每个实现类的方法添加了标记,

1 //Usertodo1类
2 System.out.println("todo1 create the user");
3
4 //Usertodo2类
5 System.out.println("todo2 create the user");

上面的bean文件配置,最后运行测试了类,控制台打印输出:

1 todo1 create the user

然后我们改一下上面的bean标签如下:

1 <bean id="todo" class="com.eco.daoimp.Usertodo2"></bean>

控制台打印输出:

1 todo2 create the user

这样我们只需通过更改bean文件就能实现对不同实现类方法的调用了,再也不用在代码中具体实例化这个实现类了,

这就相当于把控制权交给了Spring,实现了控制反转。

转载于:https://www.cnblogs.com/eco-just/p/7842513.html

java之Spring实现控制反转相关推荐

  1. java反向注入_java 控制反转和依赖注入的理解

    开始好好学习java基础和思想~ 控制反转(IOC)是Spring框架的核心思想,用我自己的话说,就是你要做一件事,别自己可劲new了,你就说你要干啥,然后外包出去就好~ 依赖注入(DI) 在我浅薄的 ...

  2. java-12:spring MVC - 控制反转IOC,依赖注入DI

    学习spring框架之前,先理解几个概念: 1.第一部分:依赖倒置原则 2.第二部分:控制反转,控制反转容器(实例) 3.第三部分:控制反转,控制反转容器(全面理解,面试题) 综合性理解:控制反转(I ...

  3. Spring 的控制反转/依赖注入

    第一章 Spring 的控制反转/依赖注入 回顾 增删改查. 课前测: 本章内容 spring:春天 IOC:将创建对象的权力交给 spring 核心容器去控制.工厂模式 BeanFactory: 懒 ...

  4. Spring的控制反转(IOC)和依赖注入(DI)具体解释

    Spring的控制反转(IOC)和依赖注入(DI)具体解释 首先介绍下(IOC)控制反转: 所谓控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的.这样控制器就有应 ...

  5. Spring IOC(控制反转)思想笔记

    Spring IOC(控制反转)思想笔记 IOC控制反转基本理念就是将程序控制权从程序员手中交给用户自定义,从而避免了因为用户一个小需求的变化使得程序员需要改动大量代码. 在这里插入图片描述 案例 如 ...

  6. Spring IOC(控制反转)思想笔记

    Spring IOC(控制反转)思想笔记 IOC控制反转基本理念就是将程序控制权从程序员手中交给用户自定义,从而避免了因为用户一个小需求的变化使得程序员需要改动大量代码. 案例 如果按照之前javaw ...

  7. SSM框架—Spring基础—控制反转和依赖注入(概念)

    控制反转: 控制反转(IoC)是面向对象编程的一个设计原则,用于降低代码耦合度 在传统面向对象编程中,获取对象的方式是用关键字"new"主动创建一个对象,也就是说,应用程序掌握着对 ...

  8. Spring的控制反转与依赖注入

    学习过Spring的都知道Spring有三大核心的概念,分别是控制反转(IOC).依赖注入(DI)和面向切面编程(AOP).今天就来聊聊我对控制反转和依赖注入的了解,至于面向切面编程放到后面讲解. 一 ...

  9. 【Java从0到架构师】Spring - IoC 控制反转、DI 依赖注入

    IoC 控制反转.DI 依赖注入 Spring 简介 Spring 基本使用 - IoC 容器 依赖注入 (Dependency Injection) 基于 setter 的注入 - 自定义对象 be ...

最新文章

  1. OpenCV 畸变校正函数undistortPoints()与remap()详解及校正效果对比
  2. NARF 特征点提取
  3. json模块及其API
  4. 学javascript 必须了解 typeof 和 instanceof
  5. 大剑无锋之了解什么是CAP吗?【面试推荐】
  6. 【渝粤教育】国家开放大学2019年春季 2767养猪技术 参考试题
  7. 第 6-2 课:SpringMVC 核心 + 面试题
  8. vcpkg安装_[工具]包管理工具Vcpkg 的使用
  9. 被罚 50 亿美元,Android 究竟招谁惹谁了?
  10. linux内核 eql.c,Linux Kernel EQL_GETMASTRCFG请求内核信息泄露漏洞
  11. 形象解释 undefined 和 null 之间的区别
  12. HTML emoji
  13. 爬虫基础09B—scrapy爬虫
  14. 解决win10微软应用商店打不开的问题
  15. java rest 请求_rest有哪些请求方法
  16. linux终端中文方块,Linux终端界面显示中文乱码或方块
  17. 开源大数据处理系统/工具大全
  18. C语言实验六 一维数组程序设计
  19. 惠普HP Smart Tank 508 打印机驱动
  20. 知识图谱偏重于信息还是计算机,基于知识图谱的计算机领域胜任力研究与应用...

热门文章

  1. datatables[columns] 中的详细参数
  2. 使用srvany.exe将任何程序作为Windows服务运行
  3. 微服务实践:全栈小团队“洪荒之力”改造阿里服务CRM技术体系
  4. mysql可以运行在不同sql mode模式下面,sql mode模式定义了mysql应该支持的sql语法,数据校验等...
  5. 打通NTFS权限 文件共享各取所需
  6. KN-S1008S1016S1024S1024F端口状态指示
  7. 【ORACLE 高可用】使用GOLDENGATE 配置Oracle-MySQL的异构复制
  8. Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant)
  9. android contentDescription的使用
  10. 解决android扫描二维码时,用户禁止权限报错问题