面向切面编程AOP
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向切面编程AOP相关的知识,希望对你有一定的参考价值。
一,代理对象实现
1,静态代理
目标对象和代理对象都实现同一个处理接口,代理对象中引入了处理接口的构造方法,在不改变目标对象源码的同时,实现目标对象的方法添加额外的功能。
2,动态代理
利用了java.lang.reflect包下的一个接口InvocationHandler和代理类Proxy
InvocationHandler接口是代理实例Proxy在创建时需要指派的参数 :
static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
InvocationHandler代理实例proxy需要实现的目标对象功能和添加额外服务
1 public class StudentDaoHandler implements InvocationHandler{ 2 3 private Object target;//目标对象 4 5 public StudentDaoHandler(Object target){ 6 this.target=target; 7 } 8 @Override 9 public Object invoke(Object proxy, Method method, Object[] args) 10 throws Throwable { 11 long begin = System.currentTimeMillis(); 12 13 method.invoke(target, args); 14 15 long end = System.currentTimeMillis(); 16 System.out.println(method.getName()+"执行时间为"+(end-begin)); 17 return null; 18 } 19 }
1 public void testProxy(){ 2 3 StudentImpl studao=new StudentImpl(); 4 5 StudentDaoHandler handler= new StudentDaoHandler(studao); 6 7 IStudentDao proxy= (IStudentDao)Proxy.newProxyInstance(studao.getClass().getClassLoader(), studao.getClass().getInterfaces(), handler); 8 9 proxy.findAll(); 10 11 proxy.save(null); 12 13 }
二,AOP
将原来分散到核心业务逻辑的重复代码提起出来,在运行时动态植入到核心业务逻辑中去,这就是aop
aop相关概念:
通知(Advice) : 把那些原本分散核心业务中代码提取出来,放置到一个方法中,这个方法就叫做通知
连接点(JoinPoint) : 通知可以放置到哪些位置上,aop原则说可以将横切关注点放置到方法上、成员变量
但是spring只支持放置到方法
切入点(PointCut) : 要把通知放置到哪里?这些位置就叫做切入点
切面(Aspect) : 把通知应到切入点上,也就说把通知横切到业务逻辑中,所以说切面就是通知和它所应用到切入点的集合
织入 : 把通知应到核心业务逻辑中的过程就叫做织入
目标对象:
代理对象:对目标对象的增强
通知的五种类型:
前置通知:通知在目标方法执行之前执行
后置返回通知 : 通知在目标方法完全正确执行完毕之后执行
后置异常通知 : 通知在目标方法抛出异常后执行
后置最终通知 : 不管目标方法是否有异常结束总是要执行通知
环绕通知 : 通知在方法执行前后都要执行
spring提供aop的实现,而且spring也支持使用aspectj的aop实现
spring支持两种方式使用aop,一种基于Schema的xml形式,第二种 基于@AspectJ风格注解形式aop
基于schema的xml方式aop使用
1、定义通知
2、通知类(切面支持类)需要纳入spring的IoC容器
3、引入aop的命名空间
4、配置aop
通过<aop:pointcut>可以定义切入点(通知要应用那些位置(方法前后)),使用的aspectj表达式进行
execution(目标方法的修饰符 目标方法的返回值类型 目标方法所在完整类名.方法名(目标方法的参数类型列表))
以上是关于面向切面编程AOP的主要内容,如果未能解决你的问题,请参考以下文章