spring是整合了BGLIB和JDK两种动态代理

示例:使用CGLIB代理

public class MyCar {

    private String color = "blue";

    public void run() {
System.out.println("我的汽车跑起来了" + color);
}
}

测试

public class SpringProxy {

    public static void main(String[] args) {
//将代理类的class文件保存到本地
System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "E:\\Java4IDEA\\comm_test\\com\\sun\\proxy");
ProxyFactory proxyFactory = new ProxyFactory(new MyCar());
//添加前后置通知
addAdivce(proxyFactory);
proxyFactory.setProxyTargetClass(true);
MyCar proxy = (MyCar) proxyFactory.getProxy();
proxy.run();
}
}

使用JDK代理

被代理的对象需要实现接口

public interface Car {
void run();
}

调用

public static void main(String[] args) throws Exception {
System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
ProxyFactory proxyFactory = new ProxyFactory(new MyCar());
addAdivce(proxyFactory);
// proxyFactory.setProxyTargetClass(true);
Car proxy = (Car) proxyFactory.getProxy();
proxy.run();
}

如果想添加前后置通知 如下

 private static void addAdivce(ProxyFactory proxyFactory) {
proxyFactory.addAdvice(new MethodInterceptor() {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
Object aThis = invocation.getThis();
System.out.println("MethodInterceptor前置:"+aThis);
//执行被代理对象的方法,返回方法的返回值
Object proceed = invocation.proceed();
System.out.println("MethodInterceptor后置");
return proceed;
}
}); //可以添加多个方法前置或者后置通知
proxyFactory.addAdvice(new AfterReturningAdvice() {
@Override
public void afterReturning(Object returnValue, Method method,
Object[] args, Object target) throws Throwable {
System.out.println("AfterReturningAdvice后置通知"); }
}); proxyFactory.addAdvice(new MethodBeforeAdvice() {
@Override
public void before(Method method, Object[] args, Object target) throws Throwable {
System.out.println("MethodBeforeAdvice前置通知");
}
});
}

JDK生成的动态类

public final class $Proxy0 extends Proxy implements Car, SpringProxy, Advised, DecoratingProxy {
...
public final void run() throws {
try {
super.h.invoke(this, m3, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
}

源码与JDK的代理和CGLB的代理源码大同小异,可以自行查阅

也可以参考 代理模式

spring中使用动态代理(AOP)的更多相关文章

  1. 浅谈Spring中JDK动态代理与CGLIB动态代理

    前言Spring是Java程序员基本不可能绕开的一个框架,它的核心思想是IOC(控制反转)和AOP(面向切面编程).在Spring中这两个核心思想都是基于设计模式实现的,IOC思想的实现基于工厂模式, ...

  2. SSM-Spring-10:Spring中cglib动态代理

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 何为动态代理,就不扯皮了,上一篇博客刚刚提到,那cglib动态代理又怎么写,我拿个和上个例子相似的案例来写 具 ...

  3. SSM-Spring-09:Spring中jdk动态代理

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- JDK动态代理: 为何叫JDK动态代理呢? 所谓JDK,jdk是java开发工具包,它里面包含了一个动态代理的 ...

  4. Spring AOP中的动态代理

    0  前言 1  动态代理 1.1 JDK动态代理 1.2 CGLIB动态代理 1.2.1 CGLIB的代理用法 1.2.2 CGLIB的过滤功能 2  Spring AOP中的动态代理机制 2.1  ...

  5. 转:Spring AOP中的动态代理

    原文链接:Spring AOP中的动态代理 0  前言 1  动态代理 1.1 JDK动态代理 1.2 CGLIB动态代理 1.2.1 CGLIB的代理用法 1.2.2 CGLIB的过滤功能 2  S ...

  6. java中的动态代理机制

    java中的动态代理机制 在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface).另一个则是 Proxy(Class),这一个类和接口是实现 ...

  7. java反射中的动态代理机制(有实例)

    在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...

  8. 详谈 Spring 中的 IOC 和 AOP

    这篇文章主要讲 Spring 中的几个点,Spring 中的 IOC,AOP,下一篇说说 Spring 中的事务操作,注解和 XML 配置. Spring 简介 Spring 是一个开源的轻量级的企业 ...

  9. 动态代理(一)——JDK中的动态代理

    在开始动态代理的描述之前,让我们认识下代理.代理:即代替担任执行职务.在面向对象世界中,即寻找另一个对象代理目标对象与调用者交互.Java中分为静态代理和动态代理.这里对于静态代理不做详述.它们之间的 ...

随机推荐

  1. Java实体类为什么要实现序列化

    public class User implements Serializable {} 客户端访问了某个能开启会话功能的资源, web服务器就会创建一个与该客户端对应的HttpSession对象,每 ...

  2. CTR预估之LR与GBDT融合

    转载自:http://www.cbdio.com/BigData/2015-08/27/content_3750170.htm 1.背景 CTR预估,广告点击率(Click-Through Rate ...

  3. 在 Java 应用程序中加一些 Groovy 进来

    如果您一直在阅读这个系列,那么您应该已经看到有各种各样使用 Groovy 的有趣方式,Groovy 的主要优势之一就是它的生产力.Groovy 代码通常要比 Java 代码更容易编写,而且编写起来也更 ...

  4. Angular 执行 css3 简单的动画

    <div class="content"> 内容区域 <button (click)="showAside()">弹出侧边栏</b ...

  5. Arduino---HC-05 蓝牙模块

    蓝牙基础知识回顾: (一)Arduino和HC-05连接 注意:Arduino通过TX与HC-05进行通信,而Arduino的电压为5V,HC-05的允许电压为3.3V.短时间通信无妨(长时间可能烧毁 ...

  6. SpringCloud学习成长之路二 服务客户端(rest+ribbon)

    在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的. Spring cloud有两种服务调用方式,一种是ribbon+restTemplate,另一种是f ...

  7. Python基础之set集合与函数

    set集合 集合是一个无序且不重复的元素组合,以大括号表示.使用详情: >>> b=set(a) >>> type(b) <class 'set'> & ...

  8. SUBMIT标准程序取ALV数据

    示例1: 调用J3RFLVMOBVEDH ,取物料的期初/ 期末庫存数.金额 FORM frm_call_j3rflvmobvedh. DATA: lr_bukrs TYPE RANGE OF buk ...

  9. mysql定时任务event——清理过期数据 (转)

    1.查询是否开启事件调度 SHOW VARIABLES LIKE 'event_scheduler'; 2.开启事件调度 临时: SET GLOBAL event_scheduler = 1; 永久: ...

  10. Hive之insert into与insert overwrite区别

    一.实践先行,直接上手 1. hive 表及数据准备 建表,并插入初始数据.向表中插入 hive> use test; hive> create table kwang_test (id ...