Spring_依赖注入思想
Ioc(Inversion of Control) 控制反转,DI(Dependncy Injection)依赖注入,其实是指同一种思想。举例说明:
张三在某公司负责供水问题。有两种形式,第一种老板指定必须要买A公司的水,这样如果某天A公司不能再提供水了,需换别的公司供水时,张三必须请示老板才能做决定。第二种是老板只要求公司供水正常,不指定具体公司,这样换公司时,张三就不用通过老板再决定。其中第二种相较于第一种就体现了控制反转的思想,老板只对张三提出一个接口,要求供水,具体的操作由张三全权完成,将供水的控制权反转给了张三。
在Spring中张三相当于一个xml格式的配置文件,领导是一个发送请求的bean,矿泉水公司是提供服务的另一个bean,XML起到一个中间连接的作用,当依赖发生变化时,只需要更改XML的依赖注入就可以实现服务变更。
将上面例子转化为代码形式,如下:
//假设已经有个Water类,表示矿泉水
//按照领导决定供水公司方式
//首先创建一个矿泉水公司A,包括提供矿泉水服务的基本属性
public class WaterCompanyA {
private Water water ;
public Water getWater(){
return water;
};
}
//矿泉水公司B,也包括提供矿泉水服务
public class WaterCompanyB{
private Water water;
public Water getWater(){
return water;
};
}
//创建一个老板类,老板其实就是一个客户端程序,有需要矿泉水的请求
public class boss{
//假设与A签订了供水协约,实例化一个A公司
private WaterCompany wca = new WaterCompany();
public void needWater(){
wca.getWater();//A为其供水
}
}
//每次供水公司需要更换时,都需要更改Boss中的实例化对象
//请求服务与提供服务间的耦合性太强了,代码灵活性低
//按照由张三决定供水公司方式
//为实现Boss类不直接通过调用公司实体类来取得服务,需要设计一个供水公司接口
public interface IWaterCompany{
//供水服务
public Water getWater();
}
//A,B两家供水公司要想给Boss提供供水业务,就需要实现这个接口
public class WaterCompanyA implements IWaterCompany{
private Water water;
//实现接口中的抽象方法
public Water getWater(){
return water;
}
}
public class WaterCompanyB implements IWaterCompany{
private Water water;
//实现接口中的抽象方法
public Water getWater(){
return water;
}
}
//改写Boss类
public class Boss{
//接口属性
private IWaterCompany wcp;
public void needWater(){
getWcp().getWater();
} public IWaterCompany getWcp(){
return wcp;
}
//实现IWaterCompany接口的所有类实例都可作为参数
public void setWcp(IWaterCompany wcp){
this.wcp = wcp;
}
}
//改写的Boss勒种已经完全与AB公司解耦,只需通过别的方法将A或B注入给Boss即可
//一个测试类,注入A
public class TestClient{
public static void main() {
Boss boss = new Boss();
//注入A
boss.setWcp(new WaterCompanyA());
//得到供水服务
boss.needWater();
}
}
//上面的测试类就担当了张三的角色,在Spring中由XML配置文件代替
依赖注入的3种方式
1.接口注入--将要注入的内容置入到一个借口中,然后将其注入到它的实现类中,因为实现一个接口必须实现接口定义的所有方法。eg:
public interface IGetCompany {
//取得一家具体的公司
public IwaterCompany getCompany(IWaterCompany wcp);
}
当一个类实现了这几个接口,就意味着它被注入了getCompany这个方法,且必须实现它哪怕是空实现,如下面这个实现类:
public class GetCompanyImpl implements IGetCompany{
//实现getCompany方法,且必须实现,它是IgetCompany注入给它的一个方法
public IWtaerCompany getCompany(IWaterCompany wcp){
return wcp;
}
}
2.set注入--注入者通过调用setter方法将一个对象注入进去,如
public class Boss{
//以接口为属性
private IWaterCompany wcp;
public void needWater(){
//得到供水服务
getWcp().getWater();
}
public IWtaerCompany getWcp(){
return wcp;
}
//实现IWaterCompany接口的所有类的实例都可以作为参数传递进来
public void setWcp(IWaterCompany wcp){
this.wcp = wcp;
}
}
//Boss类中含有一个wcp属性,要想给这个属性注入一个具体的对象值,那么就可以通过setWcp这个方法做到,eg
public class TestClient{
public static void main(){
Boss boss= new Boss();
//先实例化一个WaterCompanyA独享,然后将它注入进去
boss.setWcp(new WaterCompanyA());
//得到A公司供水服务
boss.needWater();
}
}
3.构造注入--是通过一个带参的构造函数将一个对象注入进去。上面的Boss类是通过set方法进行依赖注入的,那么也很容易改为构造注入方法,eg:
public class Boss{
private IWaterCompany wcp;
//构造注入
public Boss(IWaterCompany wcp){
this.wcp=wcp;
}
}
该类中,直接将参数写进了构造函数中,在实例化Boss类的时候,就可以将一个IWtaerCompany实例注入给Boss。这个过程就叫构造注入
Spring_依赖注入思想的更多相关文章
- ABP中的依赖注入思想
在充分理解整个ABP系统架构之前首先必须充分了解ABP中最重要的依赖注入思想,在后面会具体举出一些实例来帮助你充分了解ABP中的依赖注入思想,在了解这个之前我们首先来看看什么是依赖注入?来看看维基百科 ...
- 依赖注入及AOP简述(四)——“好莱坞原则”和依赖注入框架简介 .
3.2. “好莱坞原则” 看了前面关于依赖注入概念的描述,我们来提炼出依赖注入的核心思想.如果说传统的组件间耦合方式,例如new.工厂模式等,是一种由开发者主动去构建依赖对象的话,那么依赖注入模 ...
- Ninject依赖注入——构造函数、属性、方法和字段的注入
Ninject依赖注入——构造函数.属性.方法和字段的注入(三) 1.Ninject简介 Ninject是基于.Net平台的依赖注入框架,它能够将应用程序分离成一个个高内聚.低耦合(loosely-c ...
- 第六节:SignalR完结篇之依赖注入和分布式部署
一. SignalR中DI思想的应用 DI,即依赖注入,它是一种不负责创建其自己的依赖项对象的一种模式,通常用来降低代码之间的耦合性,广泛应用于架构设计,是必不可少的一种思想. 下面结合一个需求来说一 ...
- 在ABAP里模拟实现Java Spring的依赖注入
Dependency Injection- 依赖注入,在Java Spring框架中有着广泛地应用.通过依赖注入,我们不必在应用代码里繁琐地初始化依赖的资源,非常方便. 那么ABAP能否从语言层面上也 ...
- 任务21 :了解ASP.NET Core 依赖注入,看这篇就够了
DI在.NET Core里面被提到了一个非常重要的位置, 这篇文章主要再给大家普及一下关于依赖注入的概念,身边有工作六七年的同事还个东西搞不清楚.另外再介绍一下.NET Core的DI实现以及对实例 ...
- 一) Spring 介绍、IOC控制反转思想与DI依赖注入
一.spring介绍1.IOC反转控制思想(Inversion of Control)与DI依赖注入(Dependency Injection)2.AOP面向切面的编程思想与动态代理3.作用:项目的粘 ...
- spring核心思想:IOC(控制反转)和DI(依赖注入)
Spring有三大核心思想,分别是控制反转(IOC,Inversion Of Controller),依赖注入(DI,Dependency Injection)和面向切面编程(AOP,Aspect O ...
- Spring核心思想:“控制反转”,也叫“依赖注入” 的理解
@Service对应的是业务层Bean,例如: @Service("userService") public class UserServiceImpl implements Us ...
随机推荐
- SourceTree Win10 安装过程及配置
SourceTree 是一款拥有可视化界面的项目版本控制软件,适用于git项目管理,同时它集成了 git flow 工作流程,对于不熟悉 git 命令的初学者来说,可以通过 SourceTree 快速 ...
- Linux目录与文件的权限意义
ls -l和ls -al的区别:第一个不会显示隐藏文件,第二个会显示隐藏文件(以点(.)开头的文件) 一.权限对文件(r.w.x主要针对文件的内容而言)的重要性 r:可读取文件内容 w:可以编辑.新增 ...
- redis笔记(三)
redis配置文件 配置文件对单位大小写不敏感 tcp-backlog 511 高并发环境连接数 tcp-keepalive 单位为秒 0 表示不会进行keepalive检测,,,建议设置 ...
- Vue.js-创建Vue项目(Vue项目初始化)并不是用Webstrom创建,只是用Webstrom打开
我犯的错误:作为vue小白,并不知道还要单独去创建初始的vue项目,于是自己在webstrom中建了一个Empty Project, 在其中新增了一个js文件,就开始import Vue from “ ...
- 网页打开速度优化——HTTP请求头及响应头
no-cache:不缓存过期的资源 no-store:不缓存 最近看了<图解HTTP>这本书,书上讲到了这两者的区别: no-cache从字面意义上很容易误解为不缓存,但是no-cache ...
- 2016 Multi-University Training Contest 4 - 1005 (hdu5768)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5768 题目大意:给你区间[L,R],问你[L, R]中有多少个数字x满足x%7=0且x%p[i]≠a[ ...
- Jerry Wang诚邀广大SAP同仁免费加入我的知识星球,共同探讨SAP技术问题
大家知道Jerry Wang有一个微信公众号"汪子熙",2017年12月27日,Jerry的这个公众号发布了第一篇文章.到今天2018年10月底为止,正好十个月. 在这10个月的时 ...
- input,button制作按钮IE6,IE7点击时1px黑边框的解决方法
按钮在IE6中点击时1px黑边框的最常见的解决方法 首先设置按钮为none,然后在按钮外面套一层来实现边框的效果,部分代码如下 .btnbox{ border:solid 1px red;} .btn ...
- DEM精度评价自动化系统的成果展示
程序员:左正康 完成时间:2013/12/3 系统开发背景: 原始的DEM精度评价方法:采用ArcGIS结合Excel的方式完成DEM的精度评价.具体操作是:利用ArcGIS工具箱中的创建TIN,T ...
- 零基础Centos6搭建Git服务器,及常见问题解决
1.编译安装git 2.1 服务器端: #yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl- ...