AOP原理:
AOP分为:JDK动态代理和CGLIB代理
静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。
             注意: 目标代理类不能是final 字段、方法、类
动态代理:在程序运行时,运用反射机制动态创建而成。 

JDK动态代理实现:必须有接口和实现类
?疑问:为什么必须是接口和实现类,既然核心是反射,普通的java也是可以通过反射实现注入,为什么必须是接口及实现类

UserService :
package com.gillion.aop; 
/** 

* @Description 目标接口 
* @author huyuangui@aliyun.com 
* @time 2015年1月9日 下午2:28:00 
* @version 1.0.0 
*/ 
public interface UserService { 
/** 
* 根据ID删除用户 
* @param id 
* @return 
*/ 
public String deleteUser(String id); 
}

UserService实现类 :
package com.gillion.aop.impl; 
import com.gillion.aop.UserService;

/** 
* @Description UserService实现类 
* @author huyuangui@aliyun.com 
* @time 2015年1月9日 下午2:28:31 
* @version 1.0.0 
*/ 
public class UserServiceImpl implements UserService { 
public String deleteUser(String id) { 
System.out.println("实现类修改ID前"+id); 
System.out.println("实现类修改ID为1111"); 
id="1111"; 
return id; 

}


JDK动态代理实现:
package com.gillion.aop;
 
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
 
public class JdkAOP implements InvocationHandler {  
   
  // 目标对象  
  private Object target;  
   
  /**
   * 构造方法
   * @param target 目标对象  
   */  
  public JdkAOP(Object target) {  
      super();  
      this.target = target;  
  }  
 
 
  /**
   * 执行目标对象的方法
   */  
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {  
   System.out.println("------------------before------------------id:"+args[0]);  
   // 在目标对象的方法执行之前简单的打印一下  
      System.out.println("------------------before------------------");  
      System.out.println("修改第一个参数为ddff");
      args[0]="ddff";
      // 执行目标对象的方法  
      Object result = method.invoke(target, args);
      System.out.println("结果返回:"+result);
      System.out.println("修改结果为:ddfdfd");
      result="ddfdfd";
      // 在目标对象的方法执行之后简单的打印一下  
      System.out.println("-------------------after------------------");  
       
      return result;  
  }  
 
  /**
   * 获取目标对象的代理对象
   * @return 代理对象
   */  
  public Object getProxy() {  
      return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),  
              target.getClass().getInterfaces(), this);  
  }
 
}  

测试类:

package com.gillion.aop;
 
import com.gillion.aop.impl.UserServiceImpl;
 
public class TestJdkAOP {
 public static void main(String []ages){
  // 实例化目标对象  
     UserService userService = new UserServiceImpl();  
       
     // 实例化InvocationHandler  
     JdkAOP invocationHandler = new JdkAOP(userService);  
       
     // 根据目标对象生成代理对象  
     UserService proxy = (UserService) invocationHandler.getProxy();  
     String id="333";
     System.out.println("调用前id:"+id);
     // 调用代理对象的方法  
     id=proxy.deleteUser(id);
     System.out.println("调用后id:"+id);
 }
}

结果:
调用前id:333
------------------before------------------id:333
------------------before------------------
修改第一个参数为ddff
实现类修改ID前ddff
实现类修改ID为1111
结果返回:1111
修改结果为:ddfdfd
-------------------after------------------
调用后id:ddfdfd

Cglib动态代理 :
JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。
 
普通java类:Book

package com.gillion.aop.cglib;

/** 
* @Description BOOK 普通java 
* @author huyuangui@aliyun.com 
* @time 2015年1月9日 下午2:51:40 
* @version 1.0.0 
*/ 
public class Book { 
public String test(String id) 

System.out.println("Book更改id前id:"+id); 
id="123456"; 
System.out.println("Book更改id=123456"); 
return id; 

}


代理类:BookCglib

package com.gillion.aop.cglib;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer; 
import net.sf.cglib.proxy.MethodInterceptor; 
import net.sf.cglib.proxy.MethodProxy;

/** 
* @Description Cglib代理Book(普通java) 
* @author huyuangui@aliyun.com 
* @time 2015年1月9日 下午3:17:03 
* @version 1.0.0 
*/ 
public class BookCglib implements MethodInterceptor { 
private Object target;

/** 
* 创建代理对象 

* @param target 
* @return 
*/ 
public Object getInstance(Object target) { 
this.target = target; 
Enhancer enhancer = new Enhancer(); 
enhancer.setSuperclass(this.target.getClass()); 
// 回调方法 
enhancer.setCallback(this); 
// 创建代理对象 
return enhancer.create(); 
}

// 回调方法 
public Object intercept(Object obj, Method method, Object[] args, 
MethodProxy proxy) throws Throwable { 
System.out.println("Cglib事物开始"); 
System.out.println("Cglib设置第一个参数为1"); 
if(args!=null) 
args[0]="1"; 
Object result=proxy.invokeSuper(obj, args); 
System.out.println("Cglib调用后---返回结果:"+result); 
System.out.println("Cglib改变返回结果:654321"); 
result="654321"; 
System.out.println("Cglib事物结束"); 
return result;

}

}   


测试类:
package com.gillion.aop.cglib;
 
public class TestCglib {
 public static void main(String[] args) {  
        BookCglib cglib=new BookCglib();  
        Book bookCglib=(Book)cglib.getInstance(new Book());  
        String id="dd";
        System.out.println("未调用前id:"+id);
        bookCglib.test(id);
    }  
}

 
 
 
 
 
 
 
 
 
 
 
 
 

SpringAOP实现(原理)的更多相关文章

  1. OOP的完美点缀—AOP之SpringAOP实现原理

    OOP的完美点缀-AOP之SpringAOP实现原理 前言 OOP与AOP OOP(Object Oriented Programming,面向对象编程),通过封装.继承将程序抽象为各个层次的对象,进 ...

  2. spring框架学习笔记4:SpringAOP实现原理

    AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.OOP引入 ...

  3. SpringAOP 设计原理

    1.  设计原理 引入了,代理模式. java 程序执行流: 如果从虚拟机的角度看,整个程序的过程就是方法的调用,我们按照方法的执行顺序,将方法调用成一串. 在方法之间有着Join Point 连接点 ...

  4. springAOP实现原理

    spring AOP实现原理, spring 会在初始化的时候,创建一个BeanPostProcessor(AnnotationAwareAspectJAutoProxyCreator)用来为类注入切 ...

  5. SpringAop实现原理及代理模式

    Spring Aop的原理 Spring的AOP就是通过动态代理实现的.当为某个Bean或者某些Bean配置切面时,Spring会为其创建代理对象,当调用该对象的某个方法时,实际是调用生成的代理类的对 ...

  6. springAOP配置原理

    什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引入 ...

  7. SpringAOP 原理解析

    什么是AOP? 1: 传统的OOP编程他的代码逻辑是一种自上向下, 而在这些自上而下的过程中会产生一些横切性的问题,比如说:日志信息,权限校验认证,事务等, 2: 这些横切性问题,往往与我们的主业务逻 ...

  8. Spring知识点总结(四)之SpringAOP基础

        1. Spring aop中的基本概念        • 连接点(Joinpoint):在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候.在Spring AOP中,一个连接 ...

  9. 75道阿里Java面试题,你能答上几道?

    整理了下阿里近几年的java面试题目,大家参考下吧,希望对大家有帮助,可以帮大家查漏补缺. 答对以下这些面试题,可以淘汰掉 80 % 的求职竞争者. 1.hashcode相等两个类一定相等吗?equa ...

随机推荐

  1. video 手机全屏自动播放

    <video src="video.mp4" id="video" x-webkit-airplay="true" webkit-pl ...

  2. Intellij jrebel 热部署

    Intellij 14破解下载 注册机 即可进行破解.JRebel安装下载IntelliJ IDEA的 JRebel插件: jr-ide-idea-6.2.0-idea-13-14.zip. 打开In ...

  3. 在 ASP.NET MVC 中使用 HTML Helpers 的那些事

    在 ASP.NET MVC 中使用 HTML Helpers 方法,可以返回得到标准的 HTML 标签,就像 <input>.<button> 或者 <img> 等 ...

  4. 读《编写可维护的JavaScript》第二三章总结

    第二章 注释 添加注释的一般原则是,在需要让代码变得清晰时添加注释. 2.1 ① 单行注释 独占一行的注释,用来解释下一行代码.这行注释之前总是有一个空行,且缩进层级和下一行代码保持一致. 在代码行的 ...

  5. react+redux开发谷歌插件

    React Developer Tools Redux Dev Tools

  6. rxjava源码分析

    RXjava响应式编程 此文作者大暴雨原创,转载请注明出处. 如果线程的知识不是很丰富,请先查看     rxjava源码中的线程知识  一文 rxjava总结就是:异步实现主要是通过扩展观察者模式 ...

  7. SQL查出异常数据(ORA-01722: 无效数字)

    -- Created on 2015/4/29 by MENGHU DECLARE -- Local variables here I INTEGER; BEGIN FOR OPEN_DATA IN ...

  8. python GUI输入窗口

    为了解决 sublime text 下 python 的 raw_input() 函数无法起效,便萌生了个用 GUI 窗口来获取输入的想法,一开始想用 Tkinter,后来想了下还是用 PyQt 吧, ...

  9. checkbox属性checked="checked"已有,但却不显示打勾的解决办法

    2014-02-05 BIWEB开发技巧 9919 在做权限管理的时候,做了一个功能,就是当勾选栏目,把所有的权限全勾上.刚开始使用了如下代码: function check(id,check) { ...

  10. 自定义scrollview右侧的滑动条

    在做这个功能之前我其实是拒绝的,为什么这么说呢,因为我怕麻烦啊!(开玩笑的,怕麻烦就不做程序员了) 很久没有写博客,这次刚好项目中有个有趣的东西,想拿出来分享一下,希望能帮到某些小伙伴. 首先说说需求 ...