IOC和AOP的基础原理
IoC(Inversion of Control)就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在。控制权由应用代码中转到了外部容器,控制权的转移是所谓反转。IoC还有另外一个名字——“依赖注入(Dependency Injection)”。从名字上理解,所谓依赖注入,即组件之间的依赖关系由容器在运行期决定,形象地说,即由容器动态地将某种依赖关系注入到组件之中。
IoC是近年来兴起的一种思想,不仅仅是编程思想。主要是协调各组件间相互的依赖关系,同时大大提高了组件的可移植性,组件的重用机会也变得更多。在传统的实现中,由程序内部代码来控制程序之间的关系。我们经常使用new关键字来实现两组键间关系的组合,这种实现的方式会造成组件之间耦合(一个好的设计,不但要实现代码重用,还要将组件间关系解耦)。IoC很好的解决了该问题,它将实现组件间关系从程序内部提到外部容器来管理。也就是说由容器在运行期将组件间的某种依赖关系动态的注入组件中。控制程序间关系的实现交给了外部的容器来完成。
IoC的实现形式有两种:
依赖查找:容器提供回调接口和上下文环境给组件。EJB和Apache Avalon都是使用这种方式。
依赖注入:组件不做定位查询,只是提供普通的Java方法让容器去决定依赖关系。容器全权负责组件的装配,它会把符合依赖关系的对象通过JavaBean属性或者构造子传递给需要的对象。
通过JavaBean属性注射依赖关系的做法称为设值方法注入(Setter Injection);
将依赖关系作为构造子参数传入的做法称为构造子注入(Constructor Injection)。
AOP为Aspect Oriented Programming的缩写,意为:面向方面编程,可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。
AOP主要应用于日志记录,性能统计,安全控制,事务处理等方面。
1、AOP相关概念:
1)方面(Aspect):一个关注点的模块化,这个关注点实现可能另外横切多个对象。事务管理是J2EE应用中一个很好的横切关注点例子。方面用Spring的Advisor或拦截器实现。
2)切入点(Pointcut):指定一个通知将被引发的一系列连接点的集合。
3)连接点(Joinpoint):程序执行过程中明确的点,如方法的调用或特定的异常被抛出。
4)通知(Advice):在特定的连接点,AOP框架执行的动作。
5)目标对象(Target Object):包含连接点的对象,也被称作被通知或被代理对象。
6)AOP代理(AOP Proxy):AOP框架创建的对象,包含通知。在Spring中,AOP代理可以是JDK动态代理或CGLIB代理。
7)引入(Introduction):添加方法或字段到被通知的类。Spring允许引入新的接口到任何被通知的对象。
8)编织(Weaving):组装方面来创建一个被通知对象。
2、Java领域的AOP实现有多种方案,主要包括:
1)AspectJ (TM):创建于Xerox PARC. 有近十年历史,技术成熟。但其过于复杂;破坏封装;而且需要专门的Java编译器,易用性较差。
2)动态代理AOP:使用JDK提供的动态代理API或字节码Bytecode处理技术来实现。基于动态代理API的具体项目有: JBoss 4.0 JBoss 4.0服务器。
3)基于字节码的AOP,例如:Aspectwerkz, CGlib, Spring等。