依赖注入怎么写
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
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中部分代码如下:
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对象当中
怎么写注入器
1. dnf注入器怎么写
先建一个窗口 两个按钮 一个加载一个卸载
代码 ↓
.版本 2
.支持库 spec
.程序集 窗口程序集1
.程序集变量 输入法句柄
.程序集变量 目录
.子程序 _按钮1_被单击
.局部变量 输入法, 输入法类
写到文件 (“C:\WINDOWS\system32\SouGoo.ime”, #shurufa)
输入法句柄 = 输入法.安装 (“C:\WINDOWS\system32\SouGoo.ime”, “DNF输入法”)
调试输出 (输入法句柄)
.如果真 (输入法句柄 ≠ 0)
输入法.设置注入 (“C:\WINDOWS\system32\SouGoo.ime”, “D:\My Documents\E\cds.dll”)
延时 (1549)
信息框 (“加载成功” + #换行符 + “请切换输入法呼出外挂” + #换行符 + “呼不出多呼几次”, #信息图标, “请切换输入法呼出外挂”)
.如果真结束
.子程序 _按钮2_被单击
输入法.清除注入 (“C:\WINDOWS\system32\SouGoo.ime”)
输入法.卸载 (输入法句柄)
.子程序 __启动窗口_创建完毕
.如果 (进程是否存在 (“DNF.exe”))
返回 ()
.否
信息框 (“请先到仓库后在开启外挂”, #错误图标, “发现错误”)
结束 ()
我只知道这个输入法注入的写法 也是网上学的 但是这个现在都好用了 TX现在封的太厉害 呵呵 希望对你有所帮助
2. 易语言怎么写注入器
我来回答你吧
DNF注入器 两种
①输入法注入
网址:
②HOME注入器
网址:
---------------------------精易论坛 - 问问团队---------------------------
此答案来源于 → 精易论坛,要学习编程的可百度一下"精易论坛"
我们的口号是:帮助别人等于帮助自己
语音歪歪交流 :4 . 9 . 3 . 6
需加入本论坛请点击 进去后注册帐号即可
3. 易语言怎么写DNF.dll文件注入器
.版本 2
.支持库 shell
.程序集 窗口程序集1
.程序集变量 输入法句柄
.子程序 __启动窗口_创建完毕, , 公开
热键.注册 (_启动窗口.取窗口句柄 (), , #Home键, &子程序1)
.子程序 输入法注DLL
写到文件 (取特定目录 (10) + “\SouGoo.ime”, #Shurufa)
写到文件 (取运行目录 () + “\feifei.dll”, #Dll)
输入法句柄 = 输入法.安装 (取特定目录 (10) + “\SouGoo.ime”)
.如果真 (输入法句柄 ≠ 0)
输入法.设置注入 (取特定目录 (10) + “\Sougoo.ime”, 取运行目录 () + “\feifei.dll”)
信息框 (“按Home呼出!!!”, 0, )
.如果真结束
.子程序 _按钮1_被单击
.如果真 (进程是否存在 (“DNF.exe”))
输入法注DLL ()
返回 ()
.如果真结束
信息框 (“游戏未运行!”, 0, )
.子程序 子程序1
.局部变量 进程, 逻辑型
进程 = 进程是否存在 (“DNF.exe”)
.如果真 (进程)
输入法.激活 (取句柄2 (“DNF.exe”, , ), 输入法句柄)
.如果真结束
.子程序 _按钮2_被单击
.局部变量 dnf进程, 逻辑型
dnf进程 = 输入法.卸载 (输入法句柄)
.如果 (dnf进程)
信息框 (“关闭成功!”, #信息图标, “系统信息”)
.否则
信息框 (“关闭失败!可能已经关闭!”, #信息图标, “系统信息”)
进程结束 (进程取ID (“DNF.exe”))
输入法.清除注入 (取特定目录 (10) + “\Sougoo.ime”)
删除文件 (取运行目录 () + “\feifei.dll”)
输入法.卸载 (输入法句柄)
结束 ()
.如果结束
输入法.清除注入 (取特定目录 (10) + “\Sougoo.ime”)
删除文件 (取运行目录 () + “\feifei.dll”)
输入法.卸载 (输入法句柄)
结束 ()
.子程序 __启动窗口_将被销毁
输入法.清除注入 (取特定目录 (10) + “\Sougoo.ime”)
删除文件 (取运行目录 () + “\SkinH_EL1.dll”)
输入法.卸载 (输入法句柄)
4. 易语言写dll注入器
.版本 2.支持库 spec.支持库 shell
.程序集 窗口程序集1.程序集变量 输入法, 输入法类.程序集变量 输入法句柄
.子程序 _按钮1_被单击
通用对话框1.类型 = 0通用对话框1.过滤器 = “可注入的文件(*.dll)|*.dll”通用对话框1.标题 = “请执行可注入的 DLL 文件!”通用对话框1.打开 ()编辑框1.内容 = 通用对话框1.文件名
.子程序 _按钮2_被单击
.如果 (编辑框1.内容 = “”) 标签1.标题 = “请选择需要注入的DLL文件.!” 延迟 (1000) 标签1.标题 = “未注入文件”.否则 写到文件 (取特定目录 (10) + “\Sougoo.ime”, #srf) 输入法句柄 = 输入法.安装 (取特定目录 (10) + “\Sougoo.ime”, “多文件注入器输入法”) 调试输出 (输入法句柄) .如果真 (输入法句柄 ≠ 0) 输入法.设置注入 (取特定目录 (10) + “\Sougoo.ime”, 编辑框1.内容) 热键.注册 (_启动窗口.取窗口句柄 (), , #Home键, &;呼出外挂) 标签1.标题 = “注入完成,进入游戏可按 [Home键] 呼出外挂!” 编辑框1.禁止 = 真 按钮2.禁止 = 真 .如果真结束
.如果结束
.子程序 呼出外挂.局部变量 游戏是否存在, 逻辑型
游戏是否存在 = 进程是否存在 (“DNF.exe”) = 真.如果 (游戏是否存在) 输入法.激活 (取句柄2 (“DNF.exe”, , ), 输入法句柄).否则 标签1.标题 = “请在游戏中呼出!” 延迟 (1000) 标签1.标题 = “启动完成!请进入游戏!”.如果结束
.子程序 _按钮3_被单击
.如果 (编辑框1.内容 = “”) 标签1.标题 = “请选择需要卸载的DLL文件.!” 延迟 (1000) 标签1.标题 = “未注入文件”.否则 输入法.清除注入 (取特定目录 (10) + “\Sougoo.ime”) 输入法.卸载 (输入法句柄).如果结束
.子程序 __启动窗口_创建完毕
转载请注明出处育才学习网 » 注入的注怎么写
育才学习网