接触依赖注入
Posted Q & L
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了接触依赖注入相关的知识,希望对你有一定的参考价值。
依赖注入(IOC)
以前做小项目的时候用到过,但不知道是什么原理,糊里糊涂的就用了。
今天特意来查一下原因的,找了很多,大部分太深奥不适合我这种初入新手,偶然看到了这篇
http://www.cnblogs.com/yriyr/archive/2010/01/29/1659143.html
作者好像也是转载的,推荐可以去原作看看。
这里边的代码样例通俗易懂,适合入门的人看
2017-06-07 更新
构造注入
另外一种依赖注入方式,是通过客户类的构造函数,向客户类注入服务类实例。
构造注入(Constructor Injection)是指在客户类中,设置一个服务类接口类型的数据成员,并以构造函数为注入点,这个构造函数接受一个具体的服务类实例为参数,并将它赋给服务类接口类型的数据成员。
图3.3 构造注入示意
图3.3是构造注入的示意图,可以看出,与Setter注入很类似,只是注入点由Setter方法变成了构造方法。这里要注意,由于构造注入只能在实例化客户类时注入一次,所以一点注入,程序运行期间是没法改变一个客户类对象内的服务类实例的。
由于构造注入和Setter注入的IServiceClass,ServiceClassA和ServiceClassB是一样的,所以这里给出另外ClientClass类的示例代码。
1: using System; 2: using System.Collections.Generic; 3: using System.Linq; 4: using System.Text; 5: 6: namespace ConstructorInjection 7: { 8: internal class ClientClass 9: { 10: private IServiceClass _serviceImpl; 11: 12: public ClientClass(IServiceClass serviceImpl) 13: { 14: this._serviceImpl = serviceImpl; 15: } 16: 17: public void ShowInfo() 18: { 19: Console.WriteLine(_serviceImpl.ServiceInfo()); 20: } 21: } 22: }
Setter注入
Setter注入(Setter Injection)是指在客户类中,设置一个服务类接口类型的数据成员,并设置一个Set方法作为注入点,
这个Set方法接受一个具体的服务类实例为参数,并将它赋给服务类接口类型的数据成员。
图3.1 Setter注入示意
上图展示了Setter注入的结构示意图,客户类ClientClass设置IServiceClass类型成员_serviceImpl,
并设置Set_ServiceImpl方法作为注入点。Context会负责实例化一个具体的ServiceClass,然后注入到ClientClass里。
下面给出Setter注入的示例代码。
1: using System; 2: using System.Collections.Generic; 3: using System.Linq; 4: using System.Text; 5: 6: namespace SetterInjection 7: { 8: internal interface IServiceClass 9: { 10: String ServiceInfo(); 11: } 12: }
1: using System; 2: using System.Collections.Generic; 3: using System.Linq; 4: using System.Text; 5: 6: namespace SetterInjection 7: { 8: internal class ServiceClassA : IServiceClass 9: { 10: public String ServiceInfo() 11: { 12: return "我是ServceClassA"; 13: } 14: } 15: }
1: using System; 2: using System.Collections.Generic; 3: using System.Linq; 4: using System.Text; 5: 6: namespace SetterInjection 7: { 8: internal class ServiceClassB : IServiceClass 9: { 10: public String ServiceInfo() 11: { 12: return "我是ServceClassB"; 13: } 14: } 15: }
1: using System; 2: using System.Collections.Generic; 3: using System.Linq; 4: using System.Text; 5: 6: namespace SetterInjection 7: { 8: internal class ClientClass 9: { 10: private IServiceClass _serviceImpl; 11: 12: public void Set_ServiceImpl(IServiceClass serviceImpl) 13: { 14: this._serviceImpl = serviceImpl; 15: } 16: 17: public void ShowInfo() 18: { 19: Console.WriteLine(_serviceImpl.ServiceInfo()); 20: } 21: } 22: }
1: using System; 2: using System.Collections.Generic; 3: using System.Linq; 4: using System.Text; 5: 6: namespace SetterInjection 7: { 8: class Program 9: { 10: static void Main(string[] args) 11: { 12: IServiceClass serviceA = new ServiceClassA(); 13: IServiceClass serviceB = new ServiceClassB(); 14: ClientClass client = new ClientClass(); 15: 16: client.Set_ServiceImpl(serviceA); 17: client.ShowInfo(); 18: client.Set_ServiceImpl(serviceB); 19: client.ShowInfo(); 20: } 21: } 22: }
运行结果如下:
图3.2 Setter注入运行结果
这是其中一段,依赖注入的思想是消除聚合(应该是这个意思,目前还在学习中)。通过多个类继承接口,ClientClass中定义注入点,注入接口后在Context实例化具体的类进行实现。
目前就这么多了,学习后继续整理
PS:仅作为学习总结和推荐作用,本人对依赖注入的理解只是入门,会有偏差,不要被我带坏了
----------------------------end
time:2017-06-07
高考时间,诸位考生加油,虽然你们并看不到
以上是关于接触依赖注入的主要内容,如果未能解决你的问题,请参考以下文章
spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段
《Effective Java》 读书笔记使用依赖注入取代原本的资源依赖
Android Dagger片段可以访问AppModule和ActivityModule依赖关系,但不能访问FragmentModule依赖关系