面向切面编程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(目标方法的修饰符 目标方法的返回值类型 目标方法所在完整类名.方法名(目标方法的参数类型列表))


 

posted @ 2017-06-17 16:09  山鬼幽篁  阅读(220)  评论(0编辑  收藏  举报