Spring.NET 的IOC(依赖注入)
(1) ioc,意思是Inversion of control,(反转控制),控制反转,就是交换控制权的意思。现在一般不使用这个词,一般使用dependency injection(依赖注入)。依赖注入就是将依赖 注入进去。
(2)这么来说吧,在一个动作或者事件中,比如说,你现在想写字(Action),那么你需要笔,于是乎,你new了一个笔来写字,这里,你用了new
笔,你这个动作和笔有了关联,没了笔,你就写不了字,也就是说,你的这个行为依赖于笔了,他们就构成了依赖关系。或者你现在想组装一台电脑
(Transaction),那么你就需要显示器、主板、键鼠光驱等对象,这些对象通常是new出来的,new出来的对象和当前(this)对象就有了依
赖关系。
spring中对依赖的对象采用注入,这就是常说的依赖注入吧
(3)反转控制嘛
给你个简单的例子:
1、未用IOC:一个人背着一大包炸药去炸敌人的一座碉堡
2、采用IOC:这个人什么都不带跑到敌人碉堡下,然后打电话给总部说,把炸药给我扔过来。
(4)ssh框架,是目前较为流行的框架之一。有时根据项目需要,可能只用到了struts和hibernate。有时可能是spring。
首先理解三个独立框架的功能。struts的目的,主要是请求和相应的分发跳转。页面数据的采集获得。hibernate主要针对于DB层的交互。DB的连接、对持久化对象的操作等。spring核心内容应该是IOC。理解它的控制反转和OOP(面向切面)
(5)所谓IoC,简单理解就是把原本应该我们去new对象这个操作转到spring容器去执行。
而且IoC核心其实就是一个工厂模式,而工厂模式就是制造(new)对象的,工厂模式中,一般都是利用反射来new具体的对象,然后返回实例。
(6)
IOC,控制反转这样理解
举个简单的例子
一个人要去砍柴。那么绝大部分时候,我们会这样设计程序
class Axe
{
//一些字段或方法
}
class person
{
private Axe
axe = new
Axe();
//自己制造斧头
public void
cut(Axe axe)
{
axe.cut();
}
}
即是,我们要去砍柴,我们要自己制造斧头。
而IOC的意思就是我们需要斧头,这时候斧头就已经制造好了,我们去取就可以,不用自己制造.
class person
{
private Axe
axe = springFactory.getBean("axe");
public void
cut(Axe axe)
{
axe.cut();
}
}
这些axe就是在spring的配置文件里声明的bean.
IOC和控制反转是一个意思
(7)<bean id="ss" class="A">
<property name="dao">
<ref bean="dbdao" />
</property
</bean>
个人理解:以上就是ioc的核心,意思是在此创建dbdao的对象,此对象在类A中使用,在类A中使用时候,用地名字是ss。通过getbean(ss)来获取对象。
(8)我来给你个简单明了的解释。
控制反转又成为依赖注入,主要为了降低类之间的耦合度,类A依赖类B的时候我们按传统写法就需要在类A里面调用类B对象的方法,而用SPRING的话,就
相当于提供了一个接口,在类A里面调用这个接口就可以得到类B对象,不用NEW出类B的对象来。利用接口的原理来降低了耦合度(如果你熟习接口的设计和使
用就会很清楚)。
而为了实现上述原理,我们把他写成配置文件,然后在程序运行时用反射的方式来加载这个配置文件(用spring时就是用的反射机制运行时调用),找到要使用的类,并由spring给你生成对象。这样就OK了。
最后在总结下这两个名词。控制反转,就是交换控制权的意思,比如我类A需要用到类B的时候,具体的实现方式是在类B的某个方法里,也就是说类B控制着这个
业务的具体实现。而现在用IOC以后,类B交出控制权,类A来进行控制,类A里只需要调用一个接口的方法,不管你这个方法的具体实现是由类B的对象来实
现,还是由其他类的对象来实现,反正类A调用这个接口的这个方法就可以搞定他需要实现的业务内容,这样一来,类A它看上去就得到了实现某个业务的控制权。
而依赖注入这个词则体现得更加专业一点,就是讲在我的程序里,我从来不去构造(new
HelloWorld()这样的方法)任何对象,只是在需要用到(也就是依赖)某个对象的时候,我就用spring给他注入这个对象。这个注入的方式也就
降低了程序的耦合度
(9)
AOP面向切面编程
将程序中的交叉业务逻辑(比如安全,日志,事务等),封装成一个切面,然后注入到目标对象(具体业务逻辑)中去。
比如:
很多方法可能会抛异常,你要记录这个异常到日志中去,可以写个拦截器类,在这个类中记录日志,在spring.xml中配置一个对这些要记录日志的方法的aop拦截器
在这个方法执行后调用这个拦截器,记录日志。这样就不用每次抛异常都要手动记录日志。
spring的事务管理用到的就是aop
这样也可以提高程序的内聚性。
(10)
aop叫aspect oriented program,面向切面的编程
ioc是invert of control,反转控制 在spring in
action那本书里有详细阐述,简单说一下,ioc就是其实就是依赖注入,即用接口编程,在程序中不出现new关键字,而是用接口来命名引用,然后通过
某种方式(多数用spring,不过Google
guice也是很好的ioc框架)把接口的某个实现类的实例注入到引用里,从而实现与接口具体实现类的松耦合 aop方式就理解起来就简单了,其方式很类似j2ee中的filter,就是在程序正常的业务流中间像切面一样插入很多其他需要执行的代码,比如登陆时候
在进入登录页面前写入日志,登录以后查看cookie等类似的操作,很常用的,尤其是跟数据库有关的,或者跟支付有关的程序肯定会在每一步前面插入日志,
还有某些国际化项目会在每次跳转时候都转换字符集之类
(11)我给你来个权威的,你答到这下面就基本不问了。
IOC(反转控制):对成员变量的赋值的控制权从代码中反转到配置文件中。
AOP:Aspect(切面) Oriented(面向) Programming(编程),面向切面编程。
Spring.NET 的IOC(依赖注入)的更多相关文章
- Spring学习-spring核心机制-IOC依赖注入
转载自:http://www.cnblogs.com/chenssy/archive/2012/11/11/2765266.html 今天复习一下spring两大特性之一:IOC依赖注入,看了一下大佬 ...
- Spring核心之IoC——依赖注入
在J2EE开发平台中,Spring是一种优秀的轻量级企业应用解决方案.Spring倡导一切从实际出发,它的核心技术就是IOC(控制反转)和AOP(面向切面编程)技术.本文用的Spring版本为spri ...
- 回客科技 面试的 实现ioc 容器用到的技术,简述BeanFactory的实现原理,大搜车面试的 spring 怎么实现的依赖注入(DI)
前言:这几天的面试,感觉自己对spring 的整个掌握还是很薄弱.所以需要继续加强. 这里说明一下spring的这几个面试题,但是实际的感觉还是不对的,这种问题我认为需要真正读了spring的源码后说 ...
- Spring之 IOC&依赖注入
0x01.Spring 1什么是Spring Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的(解耦). 框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组 ...
- (转)Spring读书笔记-----Spring核心机制:依赖注入
Java应用(从applets的小范围到全套n层服务端企业应用)是一种典型的依赖型应用,它就是由一些互相适当地协作的对象构成的.因此,我们说这些对象间存在依赖关系.加入A组件调用了B组件的方法,我们就 ...
- Spring核心机制:依赖注入
转载:http://www.cnblogs.com/chenssy/ Java应用(从applets的小范围到全套n层服务端企业应用)是一种典型的依赖型应用,它就是由一些互相适当地协作的对象构成的.因 ...
- Spring读书笔记-----Spring核心机制:依赖注入
spring框架为我们提供了三种注入方式,分别是set注入,构造方法注入,接口注入.今天就和大家一起来学习一下 依赖注入的基本概念 依赖注入(Dependecy Injection),也称为IoC(I ...
- Spring源码剖析依赖注入实现
Spring源码剖析——依赖注入实现原理 2016年08月06日 09:35:00 阅读数:31760 标签: spring源码bean依赖注入 更多 个人分类: Java 版权声明:本文为博主原 ...
- Spring-DI控制反转和IOC依赖注入
Spring-DI控制反转和IOC依赖注入 DI控制反转实例 IDEAJ自动导入Spring框架 创建UserDao.java接口 public interface UserDao { public ...
随机推荐
- C++:预处理指令
Preprocessor directives 预处理器指令 预处理器指令是指那些包含在我们代码中的预处理器语句行,这些预处理器语句不是真正的代码语句,但是他们指导程序如何进行编译.这些语句总是以 ‘ ...
- Django之路:QuerySet API,后台和表单
一.Django QuerySet API Django模型中我们学习了一些基本的创建和查询.这里专门讲以下数据库接口相关的接口(QuerySet API),当然你也可以选择暂时跳过这节.如果以后用到 ...
- jquery 延迟执行实例介绍
代码如下: $(function(){ var $inputs = $('input[type=button]') .delay(500) .queue(function(){$(this).hide ...
- android脚步---图片浏览
简单的图片浏览器,实现图像显示与点击切换下一张 首先在main.xml里面定义一个简单的线性布局容器. <?xml version="1.0" encoding=" ...
- 块和内嵌div和span
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- 总结NAND FLASH控制器的操作
初始化 NAND FLASH: 1)寄存器 NFCONT,用于开启 NAND FLASH控制器: 2)向寄存器NFCMD写入命令: 3)向寄存器NFADDR写入地址: 4)使用寄存器NFDATA进行数 ...
- 拓扑排序的经典题目 UVA1572
紫书172的例题: 题目大意:有n种正放形,每种正方形的数量可视为无限多.已知边与边之间的结合规则,而且正方形可以任意旋转和反转,问这n中正方形是否可以拼成无限大的图案 思路:首先因为是要无穷大,所以 ...
- ILayer
ILayer http://127.0.0.1:47873/help/1-4452/ms.help?method=page&id=ESRICARTO-7E8C676F-000BCF&p ...
- linux command ---1
查看Linux的内核版本 当前系统的发行版信息(distribution):lsb_release -a , lsb(linux standard Base) and distribution inf ...
- PHP 代码跟踪
怎么知道代码的执行过程呢,也就是说怎么知道:是先执行哪些代码,然后执行哪些代码呢? 这里有一个非常犀利的函数,可以让你知道代码的执行过程 debug_backtrace() 函数. 来一段代码: L ...