依赖注入怎么写

1.依赖注入是怎么回事

依赖注入和控制反转是同义词,已合并。

控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题。 控制反转还有一个名字叫做依赖注入(Dependency Injection)。

简称DI。起源 早在2004年,Martin Fowler就提出了“哪些方面的控制被反转了?”这个问题。

他总结出是依赖对象的获得被反转了。基于这个结论,他为创造了控制反转一个更好的名字:依赖注入。

许多非凡的应用(比HelloWorld.java更加优美,更加复杂)都是由两个或是更多的类通过彼此的合作来实现业务逻辑,这使得每个对象都需要,与其合作的对象(也就是它所依赖的对象)的引用。如果这个获取过程要靠自身实现,那么如你所见,这将导致代码高度耦合并且难以测试。

IoC 亦称为 “依赖倒置原理”("Dependency Inversion Principle")。差不多所有框架都使用了“倒置注入(Fowler 2004)技巧,这可说是IoC原理的一项应用。

SmallTalk,C++, Java 或各种.NET 语言等面向对象程序语言的程序员已使用了这些原理。 控制反转是Spring框架的核心。

应用控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用,传递给它。也可以说,依赖被注入到对象中。

所以,控制反转是,关于一个对象如何获取他所依赖的对象的引用,这个责任的反转。编辑本段IoC是设计模式 IoC就是IoC,不是什么技术,与GoF一样,是一种设计模式。

Interface Driven Design接口驱动,接口驱动有很多好处,可以提供不同灵活的子类实现,增加代码稳定和健壮性等等,但是接口一定是需要实现的,也就是如下语句迟早要执行:AInterface a = new AInterfaceImp(); 这样一来,耦合关系就产生了,如: Class A { AInterface a; A() { } aMethod() { a = new AInterfaceImp(); } } ClassA与AInterfaceImp就是依赖关系,如果想使用AInterface的另外一个实现就需要更改代码了。当然我们可以建立一个Factory来根据条件生成想要的AInterface的具体实现,即: InterfaceImplFactory { AInterface create(Object condition) { if(condition = condA) { return new AInterfaceImpA(); } elseif(condition = condB) { return new AInterfaceImpB(); } else { return new AInterfaceImp(); } } } 表面上是在一定程度上缓解了以上问题,但实质上这种代码耦合并没有改变。

通过IoC模式可以彻底解决这种耦合,它把耦合从代码中移出去,放到统一的XML 文件中,通过一个容器在需要的时候把这个依赖关系形成,即把需要的接口实现注入到需要它的类中,这可能就是“依赖注入”说法的来源了。 IOC模式,系统中通过引入实现了IOC模式的IOC容器,即可由IOC容器来管理对象的生命周期、依赖关系等,从而使得应用程序的配置和依赖性规范与实际的应用程序代码分开。

其中一个特点就是通过文本的配件文件进行应用程序组件间相互关系的配置,而不用重新修改并编译具体的代码。 当前比较知名的IOC容器有:Pico Container、Avalon 、Spring、JBoss、HiveMind、EJB等。

在上面的几个IOC容器中,轻量级的有Pico Container、Avalon、Spring、HiveMind等,超重量级的有EJB,而半轻半重的有容器有JBoss,Jdon等。 可以把IoC模式看做是工厂模式的升华,可以把IoC看作是一个大工厂,只不过这个大工厂里要生成的对象都是在XML文件中给出定义的,然后利用Java 的“反射”编程,根据XML中给出的类名生成相应的对象。

从实现来看,IoC是把以前在工厂方法里写死的对象生成代码,改变为由XML文件来定义,也就是把工厂和对象生成这两者独立分隔开来,目的就是提高灵活性和可维护性。 IoC中最基本的Java技术就是“反射”编程。

反射又是一个生涩的名词,通俗的说反射就是根据给出的类名(字符串)来生成对象。这种编程方式可以让对象在生成时才决定要生成哪一种对象。

反射的应用是很广泛的,象Hibernate、Spring中都是用“反射”做为最基本的技术手段。 在过去,反射编程方式相对于正常的对象生成方式要慢10几倍,这也许也是当时为什么反射技术没有普通应用开来的原因。

但经SUN改良优化后,反射方式生成对象和通常对象生成方式,速度已经相差不大了(但依然有一倍以上的差距)。编辑本段IoC的优点和缺点 IoC最大的好处是什么?因为把对象生成放在了XML里定义,所以当我们需要换一个实现子类将会变成很简单(一般这样的对象都是实现于某种接口的),只要修改XML就可以了,这样我们甚至可以实现对象的热插拨(有点象USB接口和SCIS硬盘了)。

IoC最大的缺点是什么?(1)生成一个对象的步骤变复杂了(其实上操作上还是挺简单的),对于不习惯这种方式的人,会觉得有些别扭和不直观。(2)对象生成因为是使用反射编程,在效率上有些损耗。

但相对于IoC提高的维护性和灵活性来说,这点损耗是微不足道的,除非某对象的生成对效率要求特别高。(3)缺少IDE重构操作的支持,如果在Eclipse要对类改名,那么你还需要去XML文件里手工去改了,这似乎是所有XML方式的缺憾所在。

编辑本段。

2.依赖注入这个词怎么理解

个例子,组件A中有类ClassA,组件B中有接口IB和其对应的实现类B1和B2。

那么,现在ClassA需要利用IB接口来做一些事情,例如:

public class ClassA {

public void DoSomething() {

IB b = ???

b.DoWork();

}

}

现在的问题来了,IB b = ??? 中这三个???要写什么代码?是要写成 IB b = new B1(),还是要写成IB b = new B2() ?

不管是哪一种,都会让ClassA强依赖于IB的实现。

在上面这种方案中,ClassA通过new一个B1或B2来实现对IB的依赖的获取,换句话说,ClassA在主动获取依赖。

这样的设计会让ClassA很难扩展,那我们要改良设计:使用依赖注入。上面说到了,问题出在new这里,也就是依赖是Class去主动获取的,那我们就要解决这个问题:不要去主动获取对IB的依赖(通过new),而让这个依赖从ClassA的外面“注入”进来。注入有多种方式,比较常用的一种是通过构造函数注入,那么,我们要把ClassA改成:

public class ClassA {

private IB b;

public ClassA(IB b) {

this.b = b;

}

public DoSomething() {

this.b.DoWork();

}

}

可以看到,通过把IB这个依赖从构造函数中“注”进来后,ClassA就不依赖IB的实现了。还可以发现,这个重构过程中,我们是把"ClassA主动获取对IB的依赖”变成“把对IB的依赖从外部注入到ClassA中”,依赖的方向反转了,所以,依赖注入又称“控制反转”。

上面是依赖注入的所有内容。

3.如何编写一个简单的依赖注入容器

//容器和示例的完整代码如下 public interface ILogWriter { void Write(string text); } public class MyLogWriter : ILogWriter { public void Write(string str) { Console.WriteLine(str); } } public interface ILogger { void Log(string message); } public class MyLogger : ILogger { ILogWriter _writer; public MyLogger(ILogWriter writer) { _writer = writer; } public void Log(string message) { _writer.Write("[ Log ] " + message); } } static void Main(string[] args) { var container = new Container(); container.Register(); container.Register(); var logger = container.Resolve(); logger.Log("asdasdas"); } public class Container { private IDictionary, IList>> Factories { get; set; } public Container() { Factories = new Dictionary, IList>>(); } private Func WrapFactory(Func originalFactory, bool singleton) { if (!singleton) return originalFactory; object value = null; return () => { if (value == null) value = originalFactory(); return value; }; } private Func BuildFactory(Type type) { // 获取类型的构造函数 var constructor = type.GetConstructors().FirstOrDefault(); // 生成构造函数中的每个参数的表达式 var argumentExpressions = new List(); foreach (var parameter in constructor.GetParameters()) { var parameterType = parameter.ParameterType; if (parameterType.IsGenericType && parameterType.() == typeof(IEnumerable<>)) { // 等于调用this.ResolveMany(); argumentExpressions.Add(Expression.Call( Expression.Constant(this), "ResolveMany", parameterType.GetGenericArguments(), Expression.Constant(null, typeof(string)))); } else { // 等于调用this.Resolve(); argumentExpressions.Add(Expression.Call( Expression.Constant(this), "Resolve", new [] { parameterType }, Expression.Constant(null, typeof(string)))); } } // 构建new表达式并编译到委托 var newExpression = Expression.New(constructor, argumentExpressions); return Expression.Lambda>(newExpression).Compile(); } public void Register(string serviceKey = null, bool singleton = false) where TImplementation : TService { var key = Tuple.Create(typeof(TService), serviceKey); IList> factories; if (!Factories.TryGetValue(key, out factories)) { factories = new List>(); Factories[key] = factories; } var factory = BuildFactory(typeof(TImplementation)); WrapFactory(factory, singleton); factories.Add(factory); } public TService Resolve(string serviceKey = null) { var key = Tuple.Create(typeof(TService), serviceKey); var factory = Factories[key].Single(); return (TService)factory(); } public IEnumerable ResolveMany(string serviceKey = null) { var key = Tuple.Create(typeof(TService), serviceKey); IList> factories; if (!Factories.TryGetValue(key, out factories)) { yield break; } foreach (var factory in factories) { yield return (TService)factory(); } } }。

4.多个spring配置文件依赖注入要怎么写

主要有两种方式:

1、在一个配置文件中使用import标签导入其他配置文件,即

applicationContext.xml中部分代码如下:

2、在web.xml中配置Spring配置文件处导入多个配置文件,即可

a、导入多个配置文件

web.xml部分代码如下:

contextConfigLocation

applicationContext-core.xml,

applicationContext-dao.xml,

applicationContext-service.xml,

applicationContext-action.xml

b、使用*通配符导入多个配置文件

web.xml部分代码如下:

contextConfigLocation

applicationContext-*.xml

5.什么是依赖注入

依赖注入是spring框架中的解耦的一种策略,称为DI或IOC(控制反转),主要有set方式(提供set和get方法)和constractor(构造方法)方式,它使得类与类之间以配置文件的形式组织在一起,而不是硬编码的方式,例如classA 中用到了classB如果写代码的话是new 一个classB,而用依赖注入的方式则是在applicationContext.xml里面写两个

<bean id="id1" class="A"><property name="B" ref="id2"></bean>

<bean id="id2" class="B"></bean>;,就是在类A里原来需要new 的地方就不需要写了,

6.spring的依赖注入怎么注入的

创建编写测试Demo使用的工程,并导入Spring调用所需要的jar包。

创建接口类。

编写ProductDaoImp类,实现ProductDao接口。

编写ProductManage类,实现set方法,以注入ProductDaoImp类。

修改applicationContext.xml文件,添加红框中的代码。

编写测试用主类。

7

执行主类,查看执行结果。可见测试Demo已经成功!

7.请高手通俗解释一下"依赖注入"

依赖注入就是使类型之间的依赖关系可配置,也就是在运行时通过配置文件等手段确定类型之间的依赖关系。

而没有使用依赖注入的时候类型之间的关系是硬编码在程序中的。例如某个地方写了个new SqlDBReader();那么除非改源代码否则只能使用Sql Data Reader。使用依赖注入的话是CreateDBReader();//返回一个IDBReader接口实例

至于CreateDBReader这个方法创建的是OLEDB Reader还是Sql DB Reader就要看类置文件中是怎么配置的。

这样即为程序对DBReader类型的依赖被通过配置文件的方式在运行时注入到程序中去,简称依赖注入。

搂主可以研究一下企业库4.0里面的Unity应用程序块,就是实现这个功能的。依赖注入从另一个角度看,就是某些开发框架所提供的一种功能,用一段时间就明白了。

我觉得IOC和依赖注入就是一个东西,只不过是从不同的角度描述,不过也有很多牛人说它们有区别。

8.多个spring配置文件依赖注入要怎么写

主要有两种方式: 1、在一个配置文件中使用import标签导入其他配置文件,即 applicationContext.xml中部分代码如下:2、在web.xml中配置Spring配置文件处导入多个配置文件,即可 a、导入多个配置文件 web.xml部分代码如下: contextConfigLocation applicationContext-core.xml, applicationContext-dao.xml, applicationContext-service.xml, applicationContext-action.xml b、使用*通配符导入多个配置文件 web.xml部分代码如下: contextConfigLocation applicationContext-*.xml

9.依赖注入这个词怎么理解

个例子,组件A中有类ClassA,组件B中有接口IB和其对应的实现类B1和B2。

那么,现在ClassA需要利用IB接口来做一些事情,例如:public class ClassA { public void DoSomething() { IB b = ??? b.DoWork(); }}现在的问题来了,IB b = ??? 中这三个???要写什么代码?是要写成 IB b = new B1(),还是要写成IB b = new B2() ?不管是哪一种,都会让ClassA强依赖于IB的实现。在上面这种方案中,ClassA通过new一个B1或B2来实现对IB的依赖的获取,换句话说,ClassA在主动获取依赖。

这样的设计会让ClassA很难扩展,那我们要改良设计:使用依赖注入。上面说到了,问题出在new这里,也就是依赖是Class去主动获取的,那我们就要解决这个问题:不要去主动获取对IB的依赖(通过new),而让这个依赖从ClassA的外面“注入”进来。

注入有多种方式,比较常用的一种是通过构造函数注入,那么,我们要把ClassA改成:public class ClassA { private IB b; public ClassA(IB b) { this.b = b; } public DoSomething() { this.b.DoWork(); }}可以看到,通过把IB这个依赖从构造函数中“注”进来后,ClassA就不依赖IB的实现了。还可以发现,这个重构过程中,我们是把"ClassA主动获取对IB的依赖”变成“把对IB的依赖从外部注入到ClassA中”,依赖的方向反转了,所以,依赖注入又称“控制反转”。

上面是依赖注入的所有内容。

10.Spring 的依赖注入是什么意思

如楼上所说

“依赖注入就是通过配置文件解决代码问题

<bean id="" class="">

<property name="message" value="hello"/>

</bean>

这种方式是设置注入 (又称 setter注入)

相当于一个bean工厂,工厂帮你创建好了这个bean对象,然后调用了

setMessage方法将"Hello" 设置到了你的bean对象当中

依赖注入怎么写

转载请注明出处育才学习网 » 依赖注入怎么写

知识

童谣怎么写200字左右

阅读(342)

本文主要为您介绍童谣怎么写200字左右,内容包括五年级校园童谣自己写200字,童谣的作文两百个字,童谣200字。上下楼梯有秩序,不滑栏杆不拥挤, 不跑不跳不打闹,人人都要做得好。 出入校门有秩序,注意脚下别滑倒, 发现滑倒忙扶起,千万不要向前挤。

知识

双儿的韩文怎么写

阅读(268)

本文主要为您介绍双儿的韩文怎么写,内容包括赵菲的韩文怎么写,双儿英文怎么写,王诗琪的韩文怎么写。보배/아가【中文】:宝贝【韩文】:보배/아가【罗马音标】:Bo Bae /A Ga【举例】:1.宝贝 아가야 2.心肝宝贝 애지중지하는

知识

工作状态详细的怎么写

阅读(290)

本文主要为您介绍工作状态详细的怎么写,内容包括工作状态怎么写,填表时的工作状态怎么填啊,填表时的工作状态怎么填。原发布者:mxmiug2601工作态度怎么写 关于工作态度怎么写大全 积极进取、工作态度认真、塌实肯干、责任心强、并有很强的团

知识

大院出租合同怎么写

阅读(216)

本文主要为您介绍大院出租合同怎么写,内容包括房屋出租合同怎么写,房屋出租合同怎么写,租房合同怎么写。给你一份北京正规的合同, 北京市房屋租赁合同 (自行成交版) 出租人(甲方): 证件类型及编号: 承租人(乙方): 证件类型及

知识

艾拉用英文怎么写

阅读(276)

本文主要为您介绍艾拉用英文怎么写,内容包括艾拉用英文怎么拼写,有没有艾拉的英文名,怎么写,艾拉用英文怎么拼写。I love youlove 英[lʌv] 美[lʌv] vt. 喜欢; 爱,热爱; 爱戴; 赞美,称赞; vt. 喜欢; 喜爱; 喜好

知识

sponsorletter怎么写

阅读(217)

本文主要为您介绍sponsorletter怎么写,内容包括402签证里面的sponsorapprovalletter是怎样的东西,出国问题:家里人,.家里人是sponsor怎么还。useful note to convey messages. The following should be covered in y

知识

low的音标怎么写

阅读(236)

本文主要为您介绍low的音标怎么写,内容包括英语yeilow音标怎么写,“LOW”怎么发音,英语元音音标怎么写。low的读音[英]:[ləʊ] [美]:[lo]adj. 低的,矮小的;楼下的,低洼的; 沮丧的;下贱的adv. 低声地;谦卑地;底下地

知识

致他翻译英文怎么写

阅读(225)

本文主要为您介绍致他翻译英文怎么写,内容包括致某人用英语怎么说,“致辞”的英文怎么写,致词的英文翻译是什么。400O years ago, an accidental discovery inspired by the Chinese inve

知识

i正确的拼音怎么写

阅读(223)

本文主要为您介绍i正确的拼音怎么写,内容包括拼音i的声调怎么写,I正确读音怎么读,i汉语拼音格式怎么写。小学一年级的一个重要学习内容就是汉语拼音,那么拼音究竟该怎么写呢?拼音的正确写法是怎样的?小编特将拼音的写法整理在这里供爸爸妈妈们

知识

学的笔顺笔画怎么写呀

阅读(300)

本文主要为您介绍学的笔顺笔画怎么写呀,内容包括学字的笔画顺序怎么写,学的笔顺怎么写,"学"字笔画顺序怎么写。“学”字笔画笔顺为:点、点、撇、点、横撇/横钩、横撇/横钩、竖钩、横基本解释:1. 效法,钻研知识,获得知识,读书 :~生。~徒。~习。

知识

jsloading页怎么写

阅读(281)

本文主要为您介绍jsloading页怎么写,内容包括用javascript怎么实现网页loading加载效果,求用JS编写LOADING条的代码,htmlloading怎么做。<head><title>LOADING</title><script type=text/javascript><!--// // v

知识

list的全选怎么写

阅读(207)

本文主要为您介绍list的全选怎么写,内容包括vblist里面多选框怎么做&#39;全选&#39;,vblist里面多选框怎么做&#39;全选&#39;,求教:点击"全选"将左边的所有记录添加到右边列表怎么写。简单的如下,从后台读取数据的时候为每家店铺的商品单独加类<!

知识

什么是写景散文怎么写

阅读(298)

本文主要为您介绍什么是写景散文怎么写,内容包括什么是散文我该怎样写写景散文,什么是写景散文,什么是写景散文。有广义和狭义两种概念。广义的散文,在古代指的是一切不押韵的文章。不过,古代没有“散文”这一个名称;“散文”这个名称是“五四

知识

星脉的英语怎么写

阅读(218)

本文主要为您介绍星脉的英语怎么写,内容包括脉用英语怎么说,星的英文怎么写,星星的英语怎么写。1到20为:first、second、third、fourth、fifth、sixth、seventh、eighth、ninth、ten

知识

dnf辅助注入器怎么写

阅读(233)

本文主要为您介绍dnf辅助注入器怎么写,内容包括dnf注入器怎么写,dnf注入器怎么写,怎么用C语言写dnf注入器。先建一个窗口 两个按钮 一个加载一个卸载代码 ↓.版本 2.支持库 spec.程序集 窗口程序集1.程序集变量 输入法句柄.程序集变量

知识

假设和依赖怎么写

阅读(257)

本文主要为您介绍假设和依赖怎么写,内容包括大写依赖怎么写,结论所依赖的假设是什么意思,想写依赖~怎么开头。1)【依赖】方正北魏楷书繁体

知识

依赖英语单词怎么写的

阅读(227)

本文主要为您介绍依赖英语单词怎么写的,内容包括依赖的英语单词怎么写,依赖的英文怎么写,依赖用英语怎么说。依赖的英文翻译是rely on,后可接名词、动名词和动词不定式,具体解析如下:rely on英 [riˈlai ɔn] 美 [rɪˈla

知识

maven依赖怎么写

阅读(338)

本文主要为您介绍maven依赖怎么写,内容包括teradata的maven依赖怎么写,mavenpom写好了,怎么添加依赖,commonspoolmaven怎么写依赖。通常添加一个jar,只需要在 pom 文件中添加:<dependencies> <dependency> <groupId>org.ap

知识

依赖的拼音怎么写的

阅读(269)

本文主要为您介绍依赖的拼音怎么写的,内容包括你是我的依赖拼音怎么写,依赖的一怎么写,大写依赖怎么写。(你是我的依赖)拼音如下:【汉语拼音】你(nǐ) 是(shì) 我(wǒ) 的(de) 依(yī) 赖(lài)【无声调版】你(ni)

知识

怎么写注入器

阅读(157)

本文主要为您介绍怎么写注入器,内容包括dnf注入器怎么写,易语言怎么写注入器知道的说一下可以么谢谢,用代码注入器注入的代码,用易语言怎么写。先建一个窗口 两个按钮 一个加载一个卸载代码 ↓.版本 2.支持库 spec.程序集 窗口程序集1.程序

知识

依赖怎么写

阅读(184)

本文主要为您介绍依赖怎么写,内容包括大写依赖怎么写,依赖简写怎么写,怎么以依靠为题写一篇作文。1)【依赖】方正北魏楷书繁体

知识

依赖的赖怎么写

阅读(221)

本文主要为您介绍依赖的赖怎么写,内容包括依赖的赖字怎么写,依赖的赖的部首是什依赖的赖的部首是什么,赖的词语怎么写。抬头望天,空洞洞的夜空中,只悬挂着一轮明月,几点繁星。窗外,几盏灯断断续续的灭了,只有我房里的灯依旧亮着。月很清,很清,柔柔

[/e:loop]