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开发百科全书

    友情提示根据目录 快速查找问题 %1$s %1$d Android string 1.整型,比如"我今年23岁了",这个23是整型的.在string.xml中可以这样写,<s ...

  2. Leetcode 1005. Maximize Sum Of Array After K Negations

    class Solution(object): def largestSumAfterKNegations(self, A, K): """ :type A: List[ ...

  3. js 获取服务器当前时间

    //获取服务器时间 function getNowDate(){ var xhr = null; if(window.XMLHttpRequest){ xhr = new window.XMLHttp ...

  4. 【解题报告】2014ACM/ICPC上海赛区现场赛B

    唉  谷歌出的神题,差点爆零了...三小时终于A掉 B题 题目大概是说从左上角的点出发,经过某路线最后回到原点,求每个格子被路线包含的圈数的平方和. 首先可以知道,对于某个格子来说,从该格子的任意一个 ...

  5. 查找对应jar的maven包

    当原有项目换成maven项目时,往往不知道具体jar包在maven里叫什么.这边文章教你如何去找到自己想要的jar的maven包. 工具/原料   浏览器 方法/步骤   1 登录一下网站 http: ...

  6. 《DSP using MATLAB》示例Example7.21

    代码: h = [1, 2, 3, 4, 3, 2, 1]/15; M = length(h); n = 0:M-1; [Hr, w, a, L] = Hr_Type1(h); a L amax = ...

  7. maxsigma

    10^8 768 10^7 448 10^6 240 10^5 128

  8. LG3391 【模板】文艺平衡树(Splay)

    题意 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 \(n,m ...

  9. 积累 ---- PHP可能会遇到的面试题

    1.白盒测试和黑盒测试的区别 2.Bootstrap是什么 3.OOP是什么意思 4.git和svn的使用 5.常用的git命令 6.lamp开发环境 7.高内聚,低耦合

  10. (转)【Android】获取Mac地址【2】

    [Android]获取Mac地址[2] 之前写了[Android]获取Mac地址[1]有些不够详细,现在贴上一些其他代码,仅供参考. (1) 调用android 的API: NetworkInterf ...