Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类。

首先我们来用代码简单演示jdk动态代理:

现在有一个商品的增删改查的操作

/**
* 商品操作接口
*/
public interface ProductService {
public void add();
public void edit();
public void delte();
public void select();
} /**
* 实现类
*/
public class ProductServiceImpl implements ProductService {
@Override
public void add() {
System.out.println("添加商品");
} @Override
public void edit() {
System.out.println("修改商品");
} @Override
public void delte() {
System.out.println("删除商品");
} @Override
public void select() {
System.out.println("查询商品");
}
}

我们编写一个基于jdk的动态代理(实现InvocationHandler接口):

public class JdkProxy implements InvocationHandler {

    //被代理的目标
private Object target; //构造函数 传入目标对象
public JdkProxy(Object target) {
this.target = target;
} //提供创建代理对象的方法
public Object createProxy() {
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
} /**
* 实现InvocationHandler接口的回调方法, 拦截目标对象所有方法都会执行invoke方法
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("我是代理,我对被代理的目标有绝对的控制权...");
Object returnVal = method.invoke(target, args);
System.out.println("--------------------------------------");
return returnVal;
}
}

测试代码:

public class JdkProxyTest {
@Test
public void testJdkProxy() {
//创建对象
ProductService target = new ProductServiceImpl();
//创建代理对象
JdkProxy jdkProxy = new JdkProxy(target);
//代理面向接口
ProductService proxy = (ProductService) jdkProxy.createProxy();
//通过代理调用方法
proxy.add();
proxy.edit();
proxy.delte();
proxy.select();
}
}

运行结果:

jdk的代理,目标必须有接口

而cglib的代理不管有没有接口都可以

下面简单说一下cglib的动态代理:

ProductService

public class ProductService {
public void add() {
System.out.println("添加商品");
} public void edit() {
System.out.println("修改商品");
} public void delte() {
System.out.println("删除商品");
} public void select() {
System.out.println("查询商品");
}
}

CglibProxy:

public class CglibProxy {
private Object target; public CglibProxy(Object target) {
this.target = target;
} public Object createProxy() {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(target.getClass());
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
// 增强的功能
System.out.println("这么巧,我也是代理.......................");
// 原来的功能
Object returnVal = method.invoke(target, args);
return returnVal;
}
});
// 返回 代理对象(增强之后的对象)
return enhancer.create();
} }

测试代码:

public class CglibProxyTest {
@Test
public void testCglibProxy() {
ProductService target = new ProductService();
CglibProxy cglibProxy = new CglibProxy(target);
ProductService proxy = (ProductService) cglibProxy.createProxy();
proxy.add();
proxy.edit();
proxy.delte();
proxy.select();
}
}

运行结果:

其实除了动态代理,还有静态代理,以后总结设计模式的时候再详细说。设计模式之 代理模式

Spring总结七:AOP动态代理的实现的更多相关文章

  1. spring源码-aop动态代理-5.3

    一.动态代理,这是一个很强大的东西哦.研发过程中我们会常用很多业务类,但是存在一个问题.如何在不修改源码逻辑的情况下,加入自己的相关逻辑.比如异常处理,日志记录等! 二.Java动态代理的两种方式JD ...

  2. Spring学习笔记之aop动态代理(3)

    Spring学习笔记之aop动态代理(3) 1.0 静态代理模式的缺点: 1.在该系统中有多少的dao就的写多少的proxy,麻烦 2.如果目标接口有方法的改动,则proxy也需要改动. Person ...

  3. Spring中的cglib动态代理

    Spring中的cglib动态代理 cglib:Code Generation library, 基于ASM(java字节码操作码)的高性能代码生成包 被许多AOP框架使用 区别于JDK动态代理,cg ...

  4. Spring中的JDK动态代理

    Spring中的JDK动态代理 在JDK1.3以后提供了动态代理的技术,允许开发者在运行期创建接口的代理实例.在Sun刚推出动态代理时,还很难想象它有多大的实际用途,现在动态代理是实现AOP的绝好底层 ...

  5. Spring事务Transactional和动态代理(二)-cglib动态代理

    系列文章索引: Spring事务Transactional和动态代理(一)-JDK代理实现 Spring事务Transactional和动态代理(二)-cglib动态代理 Spring事务Transa ...

  6. Spring事务Transactional和动态代理(三)-事务失效的场景

    系列文章索引: Spring事务Transactional和动态代理(一)-JDK代理实现 Spring事务Transactional和动态代理(二)-cglib动态代理 Spring事务Transa ...

  7. 技术的正宗与野路子 c#, AOP动态代理实现动态权限控制(一) 探索基于.NET下实现一句话木马之asmx篇 asp.net core 系列 9 环境(Development、Staging 、Production)

    黄衫女子的武功似乎与周芷若乃是一路,飘忽灵动,变幻无方,但举手抬足之间却是正而不邪,如说周芷若形似鬼魅,那黄衫女子便是态拟神仙. 这段描写出自<倚天屠龙记>第三十八回. “九阴神抓”本是& ...

  8. Spring事务Transactional和动态代理(一)-JDK代理实现

    系列文章索引: Spring事务Transactional和动态代理(一)-JDK代理实现 Spring事务Transactional和动态代理(二)-cglib动态代理 Spring事务Transa ...

  9. Spring AOP 动态代理 缓存

    Spring AOP应用:xml配置及注解实现. 动态代理:jdk.cglib.javassist 缓存应用:高速缓存提供程序ehcache,页面缓存,session缓存 项目地址:https://g ...

随机推荐

  1. Android Afinal框架学习(一) FinalDb 数据库操作

    框架地址:https://github.com/yangfuhai/afinal 对应源码: net.tsz.afinal.annotation.sqlite.* net.tsz.afinal.db. ...

  2. CentOS7 编译安装golang和rpm安装golang

    编译安装 1.下载golang二进制安装包: https://storage.googleapis.com/golang/go1.9.linux-amd64.tar.gz 2.解压安装包到指定目录,此 ...

  3. mysql基本操作(重点)

    显示数据库 show databases 进入指定数据库 use 数据库名称 创建数据库 create database 数据库名称 default character set=utf8 删除数据库 ...

  4. Hadoop体系结构之 HDFS

    HDFS采用主从(Master/Slave)结构模型,一个HDFS集群是由一个NameNode和若干个DataNode组成的(在最新的Hadoop2.2版本已经实现多个NameNode的配置-这也是一 ...

  5. JAVA中常见异常类

    1. java.lang.nullpointerexception 这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对 ...

  6. gen_server的一些心得

    gen_server并不是我原来概念中的tcp_server或者udp_server的概念,只是一个纯粹的消息服务器,另外,附上它的一些回调函数的简单说明参考地址 http://hi.baidu.co ...

  7. MVC 控制器之间传值学习——session

    刚接触MVC不久,写的一些代码自己都不忍心看下去.路漫漫其修远兮,宝宝还需努力!之前只用过Session做登录时用户信息的储存,今天对集合类数据做了小小的尝试:利用session在控制器之间传值,以减 ...

  8. 分布式缓存系统 Memcached 内存管理机制

    在前面slab数据存储部分分析了Memecached中记录数据的具体存储机制,从中可以看到所采用的内存管理机制——slab内存管理,这也正是linux所采用的内存高效管理机制,对于Memchached ...

  9. Java-Runoob:Java 修饰符

    ylbtech-Java-Runoob:Java 修饰符 1.返回顶部 1. Java 修饰符 Java语言提供了很多修饰符,主要分为以下两类: 访问修饰符 非访问修饰符 修饰符用来定义类.方法或者变 ...

  10. StampedLock

    StampedLock是Java8引入的一种新的所机制,简单的理解,可以认为它是读写锁的一个改进版本,读写锁虽然分离了读和写的功能,使得读与读之间可以完全并发,但是读和写之间依然是冲突的,读锁会完全阻 ...