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

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()方法来声明这个接口类对象具体是指向哪个实现类

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

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

2.依赖注入

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

的调用。

以下是beans.xml文件:

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

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

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

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

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

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

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

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

 //Usertodo1类
System.out.println("todo1 create the user"); //Usertodo2类
System.out.println("todo2 create the user");

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

 todo1 create the user

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

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

控制台打印输出:

 todo2 create the user

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

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

java之Spring实现控制反转的更多相关文章

  1. 【Java】Spring之控制反转(IoC)(二)

    控制反转(IoC) IoC:Inverse of Control(控制反转) 读作“反转控制”,更好理解,不是什么技术,而是一种设计思想,就是将原本在程序中手动创建对象的控制权,交由Spring框架来 ...

  2. 学习Spring IOC控制反转和DI依赖注入总结

    30岁的小曹,20岁的身体,还在坚持在能力允许控制范围内22点睡觉,5点起床锻炼身体,好好学习,除了加班或者像今天这样的深夜,再一次写已经有X百万人写过的 spring Ioc 的总结博客. 一.IO ...

  3. 【SSH】——spring的控制反转和依赖注入

    spring是一个轻量级的容器框架,主要是为了使企业的开发变得简单.高效.无论是从大小还是开销来讲,他都可以算是轻量级的,也是非侵入性的. 下图是spring的框架示意图,说到spring,就不得不提 ...

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

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

  5. Spring IoC控制反转创建实例

    Spring IoC控制反转创建实例写一个配置文件beans.xml,配置文件的约束可以访问:完整链接:https://repo.spring.io/libs-release-local/org/sp ...

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

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

  7. Spring、控制反转与依赖注入(概念)

    Spring 一个开源的控制反转(Inversion of Control ,Ioc)和面向切面(AOP)的容器框架. 主要目的:简化开发 控制反转(Inversion of Control ,Ioc ...

  8. Spring总结——控制反转,注入(配置和注解两种方式)

    一.Spring的容器: 1.什么是控制反转:传统的方法,当某个java对象A需要调用对象B时,是由调用者(对象A)通过new关键字来创建对象B的(也可以说类A依赖类B),而在Spring中,则是由s ...

  9. Spring 之 控制反转(IoC), 依赖注入(DI)和面向切面(AOP)

    关于依赖注入, 这篇博文写的非常简单易懂. https://github.com/android-cn/blog/tree/master/java/dependency-injection 此外, 博 ...

随机推荐

  1. Java 中Log4j的使用详情

    Log4j 真的很简单,简单到令人发指的地步.不是要记录日志吗?那就给你一个Log ,然后你用Log 来写东西就行了,先来一个完整类示例: package test; import org.apach ...

  2. java Domj4读取xml文件

    先概括,再以代码形式给出. 获取节点: Iterator  Element.nodeIterator();  //获取当前标签节点下的所有子节点 获取 标签: Element Document.get ...

  3. Android必知必会--使用shape制作drawable素材

    前言 最近看到朋友制作的Android APP使用了极少的图片,但是图形却极其丰富,问了之后得知是使用shape绘制的,有很多优点. 下面是我整理的一些素材: 预览 下面是图片预览: 代码 布局文件 ...

  4. sublimeText3使用记录

    sublime确实是神器,最近学习了一下,做个记录 1.下载 http://www.sublimetext.com/3 选择对应的版本安装即可(我的是win10 64位机) 2.个人配置 2.1.默认 ...

  5. 【Android 应用开发】Android屏幕适配解析 - 详解像素,设备独立像素,归一化密度,精确密度及各种资源对应的尺寸密度分辨率适配问题

    . 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/19698511 . 最近遇到了一系列的屏幕适配问题, 以及 ...

  6. Matlab R2013a: C++ MEX on Ubuntu 14.04 64-bit

    原文地址: http://blogs.bu.edu/mhirsch/2013/07/matlab-r2013a-mex-on-ubuntu-13-04-64-bit/ Note: the way Me ...

  7. shell-like program(shell程序的基本实施部分)

    直接上代码: #include "apue.h" #include <sys/wait.h> int main(void) { char buf[MAXLINE]; / ...

  8. tomcat中的线程问题2

    最近在看线程的有关知识,碰到一个小问题,目前还没有解决,现记录下来. 如果在我们自己写的servlet里有成员变量,因为多线程的访问就会出现一些线程问题.这点大家都知道,我们看下面的例子. publi ...

  9. Android群英传笔记——第四章:ListView使用技巧

    Android群英传笔记--第四章:ListView使用技巧 最近也是比较迷茫,但是有一点点还是要坚持的,就是学习了,最近离职了,今天也是继续温习第四章ListView,也拖了其实也挺久的了,list ...

  10. Android的启动过程分析(从进程和Framework的角度)-android学习之旅(98)

    Android的启动过程包含从Linux加载到home程序运行的过程,如下图所示: 1.linux内核: Android是基于Linux内核的系统平台.启动时,首先通过bootloader加载LInu ...