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

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. OJ题:计算各个数的位数之和

    题目描述: 输入一个大于0的数,要求各个位数的和. 例如: 输入12345 那么输出15 程序如下: ) ; }

  2. gitlab6 nginx配置和启动脚本

    gitlab6 nginx配置和启动脚本 cheungmine 2013-10 最近把gitlab安装到了ubuntu12.04.3的虚拟机上了.参考: https://github.com/gitl ...

  3. python字符串与数字类型转化

    数字转字符串:str(数字),如str(10) 相反:int(字符串),如int('10') 另外,import string后 用string.atoi('100',base),转换为int,bas ...

  4. 柔弱的APP如何自我保护,浅谈APP防御手段,使用360加固助手加固/签名/多渠道打包/应用市场发布

    柔弱的APP如何自我保护,浅谈APP防御手段,使用360加固助手加固/签名/多渠道打包/应用市场发布 由于JAVA和Android的平台型,所以APP很容易被反编译,这对于我们开发者来说,是一个不想要 ...

  5. VB.NET版机房收费系统---异常处理

    异常处理,英文名为Exceptional Handling, 那时年少,还记得那年一起学习过的VB6.0的时候,常常使用ONError的错误语句.与传统VB6.0中的OnError语句相比.NET平台 ...

  6. 【算法导论】图的深度优先搜索遍历(DFS)

    关于图的存储在上一篇文章中已经讲述,在这里不在赘述.下面我们介绍图的深度优先搜索遍历(DFS). 深度优先搜索遍历实在访问了顶点vi后,访问vi的一个邻接点vj:访问vj之后,又访问vj的一个邻接点, ...

  7. saiku 网站简介

    Saiku web:http://docs.analytical-labs.com/saiku/documentation/2013/08/15/datasources.html Click &quo ...

  8. BDA大数据处理流程

    可以看出,数据处理用云,可以高效完成.而分析部分应该利用传统的bi工具.

  9. C++多重继承与虚拟继承

    本文只是粗浅讨论一下C++中的多重继承和虚拟继承. 多重继承中的构造函数和析构函数调用次序 我们先来看一下简单的例子: #include <iostream> using namespac ...

  10. cocos2d-x升级到3.4与创建android项目

    cocos2d-x升级到3.4与创建android项目 1 升级安装cocos2d-x windows7 64位机器, 到官网下载cocos2d-x-3.4: http://www.cocos2d-x ...