java之Spring实现控制反转
先来复习一下多态吧,简单点讲,就是一个类的引用可以指向其本身以及其子类的对象。
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实现控制反转的更多相关文章
- 【Java】Spring之控制反转(IoC)(二)
控制反转(IoC) IoC:Inverse of Control(控制反转) 读作“反转控制”,更好理解,不是什么技术,而是一种设计思想,就是将原本在程序中手动创建对象的控制权,交由Spring框架来 ...
- 学习Spring IOC控制反转和DI依赖注入总结
30岁的小曹,20岁的身体,还在坚持在能力允许控制范围内22点睡觉,5点起床锻炼身体,好好学习,除了加班或者像今天这样的深夜,再一次写已经有X百万人写过的 spring Ioc 的总结博客. 一.IO ...
- 【SSH】——spring的控制反转和依赖注入
spring是一个轻量级的容器框架,主要是为了使企业的开发变得简单.高效.无论是从大小还是开销来讲,他都可以算是轻量级的,也是非侵入性的. 下图是spring的框架示意图,说到spring,就不得不提 ...
- Spring的控制反转(IOC)和依赖注入(DI)具体解释
Spring的控制反转(IOC)和依赖注入(DI)具体解释 首先介绍下(IOC)控制反转: 所谓控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的.这样控制器就有应 ...
- Spring IoC控制反转创建实例
Spring IoC控制反转创建实例写一个配置文件beans.xml,配置文件的约束可以访问:完整链接:https://repo.spring.io/libs-release-local/org/sp ...
- Spring IOC(控制反转)思想笔记
Spring IOC(控制反转)思想笔记 IOC控制反转基本理念就是将程序控制权从程序员手中交给用户自定义,从而避免了因为用户一个小需求的变化使得程序员需要改动大量代码. 案例 如果按照之前javaw ...
- Spring、控制反转与依赖注入(概念)
Spring 一个开源的控制反转(Inversion of Control ,Ioc)和面向切面(AOP)的容器框架. 主要目的:简化开发 控制反转(Inversion of Control ,Ioc ...
- Spring总结——控制反转,注入(配置和注解两种方式)
一.Spring的容器: 1.什么是控制反转:传统的方法,当某个java对象A需要调用对象B时,是由调用者(对象A)通过new关键字来创建对象B的(也可以说类A依赖类B),而在Spring中,则是由s ...
- Spring 之 控制反转(IoC), 依赖注入(DI)和面向切面(AOP)
关于依赖注入, 这篇博文写的非常简单易懂. https://github.com/android-cn/blog/tree/master/java/dependency-injection 此外, 博 ...
随机推荐
- 最近在线笔试的一些感想和总结,阿里巴巴,腾讯,百度,360。c++研发,机器学习等岗位
持续更新中... 1.编程界牛人太多了,还是要好好a题,好好弄清楚基础算法,并且用代码实现 2.c/c++方向其实来回来去那么几道题,做好了记到脑子里. 下面就是我打算把不会的,不清楚的都贴上来然后好 ...
- git常用技巧
一般的过程: ①如果还没有库先用 git clone 克隆一个库. ②使用 git checkout master切换到master分支. ③使用 git pull 同步远程master分支(即git ...
- LCD正向扫描和反向扫描
LCD正向扫描和反向扫描 LCD扫描一般分正向扫面和反向扫描,分别针对正装和倒装结构(如下): 有时候提到长边扫描和短边扫描应该是针对横屏和竖屏的设置,大部分显示屏是正向扫描,是否都支持,和玻璃有关, ...
- (NO.00002)iOS游戏精灵战争雏形(七)
接上一篇博文,我们继续完成射击的功能. 还是在MainScene.m中,添加initBullets方法: -(void)initBullets{ CCSprite *bullet; for (int ...
- 敏捷测试(5)--基于story的敏捷基础知识
基于story的敏捷基础知识----需求管理(二) (1)定期发布 定期发布上线,把整个项目划分为一个个迭代,每个迭代时间大小固定(基本固定),迭代结束时上线交付一次. (2)迭代规划 迭代规划相当于 ...
- Swift基础之UITextField
//设置全局变量,将下面的替换即可 //var myTextField = UITextField(); //系统生成的viewDidLoad()方法 override fun ...
- mysql进阶(十)不靠谱的FLOAT数据类型
今天在设计数据表时,突然发现原来FLOAT原来是很不靠谱的,所以在这里建议大家换成DOUBLE类型, 原因是: 在mysql手册中讲到,在MySQL中的所有计算都是使用双精度完成的,使用float(单 ...
- 【翻译】Siesta事件记录器入门
原文:Getting started with the Siesta event recorder 作者:Mats Bryntse 随着事件记录器功能的发布越来越近,我们准备了一下入门指南,向大家展示 ...
- Linux自动安装JDK的shell脚本
Linux自动安装JDK的shell脚本 A:本脚本运行的机器,Linux B:待安装JDK的机器, Linux 首先在脚本运行的机器A上确定可以ssh无密码登录到待安装jdk的机器B上,然后就可以在 ...
- centOS 安装(光安装 和 u盘安装)
光盘安装用这个: http://www.williamlong.info/archives/1912.html 是否保留win7,要作好相关配置.有些插件可以不装. 网络设置:不好弄 如果用u盘安装, ...