Spring 的AOP实现技术之JDK的动态代理技术实例:

接口:IUserService

(Spring的AOP是动态AOP,实现技术:JDK提供的动态代理和cglib代理,
cglib它可以为没有实现接口的类做代理,也可以为接口类做代理.如果有接口,使用JDK动态代理,如果没有,使用cglib动态代理.)

利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理

 public interface IUserService {
public void login(String username,String password);
public void regist();
}

实现类

 public class UserServiceImpl implements IUserService {
@Override
public void login(String username,String password) {
System.out.println("登录......");
}
@Override
public void regist() {
System.out.println("注册.......");
}
}

代理工厂

 //使用jdk的proxy完成动态代理工具
public class JDKProxyFactory implements InvocationHandler{
//创建目标对象,将传进来的对象赋值给本类对象就代理.
private Object target;
public JDKProxyFactory(Object target){
this.target=target;
};
//通过目标对象创建代理对象
public Object createProxy(){
//使用Proxy完成代理对象的创建
//得到目标对象的classLoder
ClassLoader loader = target.getClass().getClassLoader();
//得到目标对象的interfaces
Class<?>[] interfaces = target.getClass().getInterfaces();
//实现InvocationHandler接口,this就是创建代理对象的
return Proxy.newProxyInstance(loader, interfaces, this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//在代理实例上处理方法调用并返回
//proxy是代理对象,method是调用的方法的method方法,args是调用的方法的参数
System.out.println("日志文件");
//target=UserServiceImpl--目标对象
return method.invoke(target, args);
}

测试类

 public class ProxyTest {
@Test
public void test1(){
//创建目标对象
IUserService userService = new UserServiceImpl();
//创建代理对象
JDKProxyFactory factory = new JDKProxyFactory(userService);
IUserService userServiceProxy = (IUserService) factory.createProxy();
userServiceProxy.login("Tom","");}}

Spring 的AOP实现技术之CGLIB的动态代理技术实例:

CGLIB包底层是使用一个小而快的字节码处理框架ASM

接口IUserService

public interface IUserService {
public void login(String username,String password);
public void regist();
}

实现类UserService

public class UserServiceImpl /*implements IUserService*/ {
//@Override
public void login(String username,String password) {
System.out.println("登录......");
}
//@Override
public void regist() {
System.out.println("注册.......");
}
}

CglibProxyFactory 代理工厂

public class CglibProxyFactory implements MethodInterceptor  {
//得到目标函数
private Object target;
//使用构造方法传递目标对象
public CglibProxyFactory(Object target){
this.target=target;
}
//创建代理对象
public Object createProxy(){
//1.创建enhancer
Enhancer enhancer = new Enhancer();
//2.传递目标对象
enhancer.setSuperclass(target.getClass());
//3.设置回调参数(相当于Invocationhandler)
enhancer.setCallback(this);
return enhancer.create();
}
@Override
//增强目标对象
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
//在代理实例上处理方法调用并返回
System.out.println("执行目标方法前");
  Object result =method.invoke(target, args);
   System.out.println("执行目标方法后");
     return result;

测试类

public class CglibTest {
@Test
public void test1(){
//创建目标
UserServiceImpl userSerice = new UserServiceImpl();
//创建代理类,传递目标对象
CglibProxyFactory factory= new CglibProxyFactory(userSerice);
//生成IUserService的代理类
UserServiceImpl userSericeproxy = (UserServiceImpl) factory.createProxy();
userSericeproxy.login("tom", "");
}

Spring 的AOP底层实现技术:JDK和CGLIB动态代理的更多相关文章

  1. Spring源码剖析5:JDK和cglib动态代理原理详解

    AOP的基础是Java动态代理,了解和使用两种动态代理能让我们更好地理解 AOP,在讲解AOP之前,让我们先来看看Java动态代理的使用方式以及底层实现原理. 转自https://www.jiansh ...

  2. Spring AOP中的JDK和CGLib动态代理哪个效率更高?

    一.背景 今天有小伙伴面试的时候被问到:Spring AOP中JDK 和 CGLib动态代理哪个效率更高? 二.基本概念 首先,我们知道Spring AOP的底层实现有两种方式:一种是JDK动态代理, ...

  3. spring框架中JDK和CGLIB动态代理区别

    转载:https://blog.csdn.net/yhl_jxy/article/details/80635012 前言JDK动态代理实现原理(jdk8):https://blog.csdn.net/ ...

  4. 动态代理的两种方式,以及区别(静态代理、JDK与CGLIB动态代理、AOP+IoC)

    Spring学习总结(二)——静态代理.JDK与CGLIB动态代理.AOP+IoC   目录 一.为什么需要代理模式 二.静态代理 三.动态代理,使用JDK内置的Proxy实现 四.动态代理,使用cg ...

  5. Spring框架中的JDK与CGLib动态代理

    JDK和CGLib动态代理区别 JDK动态代理:利用拦截器(拦截器必须实现InvocationHanlder)加上反射机制生成一个实现代理接口的匿名类, 在调用具体方法前调用InvokeHandler ...

  6. 【java高级编程】JDK和CGLIB动态代理区别

    转载:https://blog.csdn.net/yhl_jxy/article/details/80635012 前言 JDK动态代理实现原理(jdk8):https://blog.csdn.net ...

  7. JDK、CGlib动态代理详解

    Java动态代理之JDK实现和CGlib实现(简单易懂)      一 JDK和CGLIB动态代理原理 1.JDK动态代理 利用拦截器(拦截器必须实现InvocationHanlder)加上反射机制生 ...

  8. JDK和CGLIB动态代理原理

    1.JDK动态代理利用拦截器(拦截器必须实现InvocationHanlder)加上反射机制生成一个实现代理接口的匿名类, 在调用具体方法前调用InvokeHandler来处理. 2.CGLiB动态代 ...

  9. JDK和CGLIB动态代理原理区别

    JDK和CGLIB动态代理原理区别 https://blog.csdn.net/yhl_jxy/article/details/80635012 2018年06月09日 18:34:17 阅读数:65 ...

随机推荐

  1. oracle 基础知识(三)--SCN

    一,SCN的介绍     SCN(System Change Number),也就是通常所说的系统改变号或者系统提交号,是数据库中非常重要的一个数据结构. SCN用以标识数据库在某个确切时刻提交的版本 ...

  2. (转)Saltstack系列

    Saltstack系列1:安装配置 Saltstack系列2:Saltstack远程执行命令 Saltstack系列3:Saltstack常用模块及API Saltstack系列4:Saltstack ...

  3. Struts2中Action对象的set方法和get方法调用规则

    Struts的Action是采用的是多实例多线程设计,而不是像Servlet那样采用单实例多线程设计,因此在struts中,一个请求就对应一个Action对象,个对象之间的数据相互之间互不干扰.没接到 ...

  4. pat00-自测2. 素数对猜想 (20)

    00-自测2. 素数对猜想 (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 让我们定义 dn 为:dn  ...

  5. SEH结构

    首先有几点问题 1.在后文中看到的PE的节中的配置信息表Load configuration是对SEH回调函数的注册,那么Exception Table是加载的什么信息. 2.什么时候走进系统异常,什 ...

  6. 阻止事件的默认行为,例如click <a>后的跳转~

    在W3C中,使用preventDefault()方法: 在IE中,使用window.event.returnValue = false.

  7. hashlib库的使用

    这个模块实现了许多不同的安全哈希和消息摘要算法的通用接口.包括FIPS安全哈希算法SHA1.SHA224.SHA256.SHA384和SHA512(在FIPS 180-2中定义)以及RSA的MD5算法 ...

  8. 通过response向服务器用Io流写入图片

       1.响应头设置字节.     使用response获得字节输出流        ServletOutputStream out = response.getOutputStream();     ...

  9. Java笔记之Scanner先读取一个数字,在读取一行字符串方法分析

    问题:大家在学习Java读取数据的时候一般都是使用Scanner方法读取数据,但是其中有一个小问题大家可能不知道, 就是我们在使用scanner的时候如果你先读取一个数字,在读取一行带有空格的字符串, ...

  10. stark——增删改页面

    一.制作添加页面 1.前置准备 (1)修改增删改的视图函数名 class ModelStark(object): def add_view(self, request): return HttpRes ...