一点一点学架构(三)——Spring.NET IOC
2015-07-28 22:07
225 查看
IOC背景介绍
传统的实现:由程序内部代码来控制类与类之间的关系(如:在一个具体的类中,调用另一个类的方法)。
使用new关键字来实现两个类之间关系的组合。
这种实现方式会造成类之间耦合。
IOC的实现:
它将类间关系从程序内部提到外部容器,也就是说由容器在运行期将类间的某种依赖关系动态注入类中。
对象A依赖于对象B,当对象 A需要用到对象B的时候,IOC容器就会立即创建一个对象B送给对象A。
IOC容器就是一个对象制造工厂,你需要什么,它会给你送去,你直接使用就行了,而再也不用去关心你所用的东西是如何制成的,也不用关心最后是怎么被销毁的,这一切全部由IOC容器包办。
——Spring的IOC原理
项目中的应用
在应用程序配置文件中进行配置<configSections> <sectionGroup name="spring"> <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core" /> <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" /> </sectionGroup> </configSections>
<spring> <context> <resource uri="config://spring/objects" /> </context> <objects xmlns="http://www.springframework.net"> <object id="BidSystemEntities" type="LFBidSystem.Model.BidSystemEntities,LFBidSystem.Model" singleton="false" /> <!--DbSession层的的注解--> <object id="DBSession" type="LFBidSystem.DAL.DbSession,LFBidSystem.DAL" singleton="false"> <!--加入属性注入,指向D层的注入--> <property name="T_BidDAL" ref="T_BidDal"/> </object> <!--D层的的注解--> <object id="T_BidDal" type="LFBidSystem.DAL.T_BidDal,LFBidSystem.DAL" singleton="false" /> </objects> </spring>
在程序中获取对象
SpringHelper.GetObject<ICoreDbSession>("DBSession");
SpringHelper是在项目中封装的一个类。
在上面的配置文件中,展示了创建对象和给对象的属性赋值的方式。
这里要强调以下内容:
配置内容可以写到应用程序配置文件中(Web.config),也可以写到XML文件中。
在背景中,我们提到IOC容器就相当于是工厂,帮我们产生对象,产生对象的方式有多种,具体可参考以下链接:
[Spring.NET IoC] 之三:获取对象
产生对象的方式不同,决定了对象什么时候创建出来,这就是下面我们要介绍的。
执行流程
这里参考了Java中的SpringIOC的执行流程。应用程序开始执行
创建IOC容器
解析配置文件
初始化IOC容器中配置的对象实例
但是,也有特殊情况,当我们在配置文件中配置对象,并设置为”Singleton=false”时,对象的初始化过程会延迟到我们获取该对象时,即调用GetObject方法时,才实例化。
这也就是当我们在项目中执行以下这行代码时:
dbSession = SpringHelper.GetObject<ICoreDbSession>("DBSession");
程序获取DBSession这个类的实例化对象,会根据配置文件中的属性注入给DBSession中每个属性赋值。而给每个属性赋的值是具体的DAL层中一个类的实例,所以紧接着就会调用每个DAL的构造函数。而每个D层类的构造函数中会调用SetDbContext()这个方法,所以当你的DbSession中有多少个属性,就会执行多少遍的SetDbContext()方法。
public partial class DbSession : IDbSession { public IT_BidDal T_BidDAL { get; set; } } }
总结
IOC作为第三方来维护对象间的依赖关系,解除了对象间的耦合,让我们的项目架构又灵活了些。相关文章推荐
- Java之逻辑错误
- Java学习笔记----一些常用却不清楚的知识
- 单例模式(java 实现 Singleton)(一)
- Java中关于类的个人看法
- Java反射—模拟Spring的Aop
- 一个简单的java僵局演示示例
- JAVA里的单引号和双引号及String和char的区别
- eclipse安装svn插件的多种方式
- 深入分析java序列化
- Java反射—运用反射生成jdk动态代理
- java error
- java多线程(生产消费)
- Spring Framework简介
- java 泛型详解(普通泛型、 通配符、 泛型接口,泛型数组,泛型方法,泛型嵌套)
- java 泛型详解(普通泛型、 通配符、 泛型接口,泛型数组,泛型方法,泛型嵌套)
- LeetCode138 Copy List with Random Pointer(深度复制带有随机指针的链表) Java题解
- Struts2中result配置中常见的几种视图转发类型
- Spring的Bean的生命周期
- 《Java程序性能优化》学习笔记之ArrayList和LinkedList
- 【Java】(1)Base64加密技术