葵花宝典

来源:互联网 发布:故宫淘宝 编辑:程序博客网 时间:2024/04/19 04:51

IOC中最基本的技术就是“反射(Reflection)”编程,通俗来讲就是根据给出的类名(字符串方式)来动态地生成对象这种编程方式可以让对象在生成时才决定到底是哪一种对象。只是在Spring中要生产的对象都在配置文件中给出定义,目的就是提高灵活性和可维护性

由于IOC容器生成对象是通过反射方式,在运行效率上有一定的损耗。

具体到IOC框架产品(比如:Spring)来讲,需要进行大量的配制工作,比较繁琐,对于一些小的项目而言,客观上也可能加大一些工作成本。

依赖注入(DI)和控制反转(IOC)是从不同的角度的描述的同一件事情,就是指通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦

我们可以把IOC容器的工作模式看做是工厂模式的升华,可以把IOC容器看作是一个工厂,这个工厂里要生产的对象都在配置文件中给出定义,然后利用编程语言的的反射编程,根据配置文件中给出的类名生成相应的对象。从实现来看,IOC是把以前在工厂方法里写死的对象生成代码,改变为由配置文件来定义,也就是把工厂和对象生成这两者独立分隔开来,目的就是提高灵活性和可维护性。

正向: 代码->dll, 先编码, 定义好类,通过实例化对象来调用之.

反向: dll->类[方法,属性]. 从已经有的dll文件反编译得到其中的一些可用的方法.

正常处理过程:系统在运行的时候将把dll(动态链接库)加载到当前进程的一个默认的应用程序域application.currentdomain.load方法可以取得当前域的所有dll,也可以unload方法将dll从该域卸载掉,通过执行dll的方法来响应用户的操作,执行完后,就释放了这个dll,这是运行时的行为这里dll相当于一个工具集, 工具箱. 用户只得到这个工具箱, 按下相应接口按钮可以完成对应的任务。

反射: 反过来看,你可以从当前进程的应用程序域取得DLL开始(application.currentdomain.load取出该进程的所有的DLL列表),取得DLL里的类列表或者其他模块,然后调用类的方法,相当于打开了工具箱, 取其中的一些工具来.

也就是说,正常的顺序是,知道一个确定的类以及里面的属性、方法。然后实例化一个对象,调用它的方法来执行。

反射就是只有一个DLL文件,知道类名却不知道他有什么属性和方法,可以通过反射机制来动态加载程序集得到类中的属性、方法信息,并实例化一个对象等

  1. .net所编写的程序集包含两个重要部分:IL(中间语言代码) 和metadata(元数据)。我们编写的代码中不是有很多很多的类吗,类有很多很多的成员,在编译代码的时候,元数据表就根据代码把类的所有信息都记录在了它里面(其实它就是一个数据结构,组织类的信息)。
  2. 而反射的过程刚好相反,就是通过元数据里记录的关于类的详细信息找到该类的成员,并能使它“复活”(因为元数据里所记录的信息足够详细,以致于可以根据metadata里面记录的信息找到关于该类的IL code并加以利用)。

元数据形成:根据代码具体内容形成类的记录信息;

反射:根据元数据的记录找到所需的代码;

依赖注入和控制反转是同一个概念。具体含义是:当某个角色(一个实例,调用者)需要另一个角色(另一个实例,被调用者)的协助时,在传统的程序设计过程中,通常有调用者来创建被调用者的实例。但在Spring里,创建被调用者的工作不再由调用者来完成,因此成为控制反转;创建被调用者实例的工作通常有Spring容器来完成,然后注入到调用者,因此也称为依赖注入。

(1).原始社会里,几乎没有社会分工。需要一把斧子的人(调用者)只能自己去磨一把斧子(被调用者)。对应的情形为:Java或C#程序里的调用者自己创建被调用者。

(2).进入工业社会,工厂出现。斧子不再由普通人完成,而在工厂里被生产出来,此时需要斧子的人(调用者)找到工厂,购买斧子,无需关系斧子的制造过程。对应程序的简单工厂设计模式。

(3).进入“按需分配”社会,需要斧子的人不需要找到工厂,坐在家里发出一个简单指令:需要斧子。斧子就自然出现在它面前。对应Spring的依赖注入。

可以把IoC模式看做是工厂模式的升华,可以把IoC看作是一个大工厂,只不过这个大工厂里要生成的对象都是在XML文件中给出定义的,然后利用Java 的“反射”编程,根据XML中给出的类名生成相应的对象。从实现来看,IoC是把以前在工厂方法里写死的对象生成代码,改变为由XML文件来定义,也就是把工厂和对象生成这两者独立分隔开来,目的就是提高灵活性和可维护性。

IoC中最基本的Java技术就是“反射”编程。反射又是一个生涩的名词,通俗的说反射就是根据给出的类名(字符串)来生成对象。这种编程方式可以让对象在生成时才决定要生成哪一种对象。反射的应用是很广泛的,象Hibernate、Spring中都是用“反射”做为最基本的技术手段。

在过去,反射编程方式相对于正常的对象生成方式要慢10几倍,这也许也是当时为什么反射技术没有普遍应用开来的原因。但经SUN改良优化后,反射方式生成对象和通常对象生成方式,速度已经相差不大了(但依然有一倍以上的差距)。







原创粉丝点击