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

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. 网站开发进阶(三十五)JSP页面中的pageEncoding和contentType两种属性

    JSP页面中的pageEncoding和contentType两种属性 本文介绍了在JSP页面中经常用的两种属性,分别是pageEncoding和contentType,希望对你有帮助,一起来看. 关 ...

  2. Mybatis插件原理分析(一)

    我们首先介绍一下Mybatis插件相关的几个类,并对源码进行了简单的分析. Mybatis插件相关的接口或类有:Intercept.InterceptChain.Plugin和Invocation,这 ...

  3. python的文件操作file:(内置函数,如seek、truncate函数)

    file打开文件有两种方式,函数用file()或者open().打开后读入文件的内容用read()函数,其读入是从文件当前指针位置开始,所以需要控制指针位置用: 一.先介绍下file读入的控制函数: ...

  4. /sbin/insserv: No such file or directory

    /sbin/insserv: No such file or directory在Ubuntu下安装service服务,可能会报如下错误:/sbin/insserv: No such file or ...

  5. mongoDB基本使用(二)

    数据库基本操作 连接到mongoDB服务器 ./bin/mongo 127.0.0.1:12345  查看当前数据库 > show dbs admin  (empty) local  0.078 ...

  6. C++ Primer 有感(new和delete表达式)

    定义变量时,必须指定其数据类型和名字.而动态创建对象时,只需指定其数据类型,而不必为该对象命名.取而代之的是,new表达式返回指向性创建的指针. 1.动态创建对象的默认初始化 对于类类型的对象,用该类 ...

  7. python检测变量是否有定义(即使用前检查是否定义好)

    http://www.cnblogs.com/starspace/archive/2008/12/03/1347007.html 第一种方法: 'var' in locals().keys() 第二种 ...

  8. View,ViewGroup的Touch事件的分发机制

    原帖地址:http://blog.csdn.net/xiaanming/article/details/21696315 ViewGroup的事件分发机制 我们用手指去触摸Android手机屏幕,就会 ...

  9. 【嵌入式开发】C语言 内存分配 地址 指针 数组 参数 实例解析

    . Android源码看的鸭梨大啊, 补一下C语言基础 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/detai ...

  10. STL - 容器共性机制研究

    C++模板是容器的概念. 理论提高:所有容器提供的都是值(value)语意,而非引用(reference)语意.容器执行插入元素的操作时,内部实施拷贝动作.所以STL容器内存储的元素必须能够被拷贝(必 ...