标签:.so nts target result tin 运行 spring4 pac div
Spring与AOP:
AOP的引入:
主业务经常需要调用系统级业务(交叉业务),如果在主业务代码中大量的调用系统级业务代码,会使系统级业务与主业务深度耦合在一起,大大影响了主业务逻辑的可读性,降低了代码的可维护性,同时也增加了开发难度。
所以,可以采用动态代理方式。动态代理是 OCP 开发原则的一个重要体现:在不修改主业务逻辑的前提下,扩展和增强其功能。
1 package com.tongji.test; 2 3 import java.lang.reflect.InvocationHandler; 4 import java.lang.reflect.Method; 5 import java.lang.reflect.Proxy; 6 7 import org.junit.Test; 8 9 import com.tongji.service.ISomeService; 10 import com.tongji.service.SomeServiceImpl; 11 import com.tongji.utils.SomeUtils; 12 13 public class MyTest { 14 @Test 15 public void test01() { 16 final ISomeService target = new SomeServiceImpl(); 17 ISomeService proxy = (ISomeService) Proxy.newProxyInstance( 18 target.getClass().getClassLoader(), 19 target.getClass().getInterfaces(), 20 new InvocationHandler() { 21 22 //织入:交叉业务逻辑切入到主业务中,就在这里完成的 23 @Override 24 public Object invoke(Object proxy, Method method, Object[] args) 25 throws Throwable { 26 SomeUtils.doTransaction(); 27 Object result = method.invoke(target, args); 28 SomeUtils.doLog(); 29 return result; 30 } 31 }); 32 proxy.doSome(); 33 proxy.doSecond(); 34 } 35 }
AOP简介:
AOP(Aspect Orient Programming),面向切面编程,是面向对象编程 OOP 的一种补充。
面向对象编程是从静态角度考虑程序的结构,而面向切面编程是从动态角度考虑程序运行过程。AOP 底层,就是采用动态代理模式(代理模式见此链接)实现的。采用了两种代理:JDK 的动态代理,与 CGLIB的动态代理。
面向切面编程,就是将交叉业务逻辑封装成切面,利用 AOP 容器的功能将切面织入到主业务逻辑中。所谓交叉业务逻辑是指,通用的、与主业务逻辑无关的代码,如安全检查、事务、日志等。
若不使用 AOP,则会出现代码纠缠,即交叉业务逻辑与主业务逻辑混合在一起。这样,会使主业务逻辑变的混杂不清。
例如,转账,在真正转账业务逻辑前后,需要权限控制、日志记录、加载事务、结束事务等交叉业务逻辑,而这些业务逻辑与主业务逻辑间并无直接关系。但,它们的代码量所占比重能达到总代码量的一半甚至还多。它们的存在,不仅产生了大量的“冗余”代码,
还大大干扰了主业务逻辑---转账。
AOP编程术语:
(1)切面(Aspect)
切面泛指交叉业务逻辑。上例中的事务处理、日志处理就可以理解为切面。常用的切面有通知与顾问。实际就是对主业务逻辑的一种增强。
(2)织入(Weaving)
织入是指将切面代码插入到目标对象的过程。上例中 invoke()方法完成的工作,就可以称为织入。
(3)切入点(Pointcut)
切入点指切面具体织入的位置。在 StudentServiceImpl 类中,若 doSome()将被增强,而doOther()不被增强,则 doSome()为切入点,而 doOther()仅为连接点。被标记为 final 的方法是不能作为连接点与切入点的。因为最终的是不能被修的,不能被增强的。
(4)目标对象(Target)
目标对象指将要被增强的对象。即包含主业务逻辑的类的对象。上例中的StudentServiceImpl 的对象若被增强,则该类称为目标类,该类对象称为目标对象。当然,不被增强,也就无所谓目标不目标了。
(5)通知(Advice)
通知是切面的一种实现,可以完成简单织入功能(织入功能就是在这里完成的)。换个角度来说,通知定义了增强代码切入到目标代码的时间点,是目标方法执行之前执行,还是之后执行等。通知类型不同,切入时间不同。切入点定义切入的位置,通知定义切入的时间。
(6)顾问(Advisor)
顾问是切面的另一种实现,能够将通知以更为复杂的方式织入到目标对象中,是将通知包装为更复杂切面的装配器。
标签:.so nts target result tin 运行 spring4 pac div
原文地址:http://www.cnblogs.com/qjjazry/p/6363300.html