1、被代理类Person.java

 package com.xiaostudy;

 /**
* @desc 被代理类
*
* @author xiaostudy
*
*/
public class Person { public void add() {
System.out.println("add()>>>>>>>>");
} public void update() {
System.out.println("update()>>>>>>>>");
} public void delete() {
System.out.println("delete()>>>>>>>>");
} }

2、切面类MyAdvice.java

 package com.xiaostudy;

 /**
* @desc 切面类
*
* @author xiaostudy
*
*/
public class MyAdvice { /**
* @desc 植入代理方法的方法
*/
public void before() {
System.out.println("日记开始>>>>>>>>>>>");
} public void after() {
System.out.println("日记结束<<<<<<<<<<<<");
} }

3、代理工厂类MyBeanFactory.java

 package com.xiaostudy;

 import java.lang.reflect.Method;

 import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy; /**
* @desc 代理工厂类
*
* @author xiaostudy
*
*/
public class MyBeanFactory {
/**
* @desc 获取一个代理的对象
*
* @return Person对象
*/
public static Person createPerson() {
// 被代理类
final Person person = new Person();
// 切面类
final MyAdvice myAdvice = new MyAdvice();
// 代理类,采用cglib
// 核心类
Enhancer enhancer = new Enhancer();
// 确定父类
enhancer.setSuperclass(person.getClass());
/*
* 设置回调函数 , MethodInterceptor接口 等效 InvocationHandler
* 接口 intercept() 等效 invoke()
* 参数1、参数2、参数3:以invoke一样
* 参数4:methodProxy 方法的代理
*/
enhancer.setCallback(new MethodInterceptor() { @Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy)
throws Throwable {
myAdvice.before();
Object obj = method.invoke(person, args);
// 这个与上面 等价
// Object obj2 = methodProxy.invokeSuper(proxy, args);
myAdvice.after();
return obj;
}
});
// 创建代理
Person obj = (Person) enhancer.create(); return obj;
} }

4、测试类Test.java

 package com.xiaostudy;

 /**
* @desc 测试类
*
* @author xiaostudy
*
*/
public class Test { public static void main(String[] args) {
Person person = MyBeanFactory.createPerson();
person.add();
person.update();
person.delete();
} }

spring的cglib代理的更多相关文章

  1. Spring强制使用CGLIB代理事务

    Spring强制使用CGLIB代理事务   springaopjdkreferenceclasspath Spring1.2: 将事务代理工厂[TransactionProxyFactoryBean] ...

  2. (转)Java动态代理与CGLib代理

    <br>public class UserDAOImpl{ <br><br>    public void save() { <br>        / ...

  3. 基于Spring AOP的JDK动态代理和CGLIB代理

    一.AOP的概念  在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的 ...

  4. Spring框架_代理模式(静态代理,动态代理,cglib代理)

    共性问题: 1. 服务器启动报错,什么原因? * jar包缺少.jar包冲突 1) 先检查项目中是否缺少jar包引用 2) 服务器: 检查jar包有没有发布到服务器下:                 ...

  5. jdk动态代理与cglib代理、spring aop代理实现原理

    原创声明:本博客来源与本人另一博客[http://blog.csdn.net/liaohaojian/article/details/63683317]原创作品,绝非他处摘取 代理(proxy)的定义 ...

  6. jdk动态代理与cglib代理、spring aop代理实现原理解析

    原创声明:本博客来源为本人原创作品,绝非他处摘取,转摘请联系博主 代理(proxy)的定义:为某对象提供代理服务,拥有操作代理对象的功能,在某些情况下,当客户不想或者不能直接引用另一个对象,而代理对象 ...

  7. 何为代理?jdk动态代理与cglib代理、spring Aop代理原理浅析

    原创声明:本博客来源为本人原创作品,绝非他处摘取,转摘请联系博主 代理(proxy)的定义:为某对象提供代理服务,拥有操作代理对象的功能,在某些情况下,当客户不想或者不能直接引用另一个对象,而代理对象 ...

  8. spring中基于JDK和CGLIB代理在项目的应用

    一.环境与问题 环境 spring boot的版本是1.2.1.RELEASE.JDK版本是1.7 问题 ​ A服务 PeopleService 调用B服务 HelloService ,其中B服务的方 ...

  9. Spring AOP demo 和获取被CGLIB代理的对象

    本文分为两部分:1)给出Spring AOP的一个例子(会使用CGLIB代理):2)给出获取被CGLIB代理的原始对象. 1.Spring AOP Demo 这部分参考了博文(http://www.v ...

随机推荐

  1. docker 从容器中拷文件到宿主机器中

    sudo docker cp 1d051604e0ea:/root/data /home/developer/zhanghui/data

  2. 【bzoj4872】[Shoi2017]分手是祝愿 数论+期望dp

    题目描述 Zeit und Raum trennen dich und mich. 时空将你我分开. B 君在玩一个游戏,这个游戏由 n 个灯和 n 个开关组成,给定这 n 个灯的初始状态,下标为从 ...

  3. [cocos2dx] cocosdx编译工程那些事

    cocos compile -p android 上面这条命令可以将cocos2dx的工程编译出android apk,需要注意的是如果有新增的cpp文件,都需要在“CocosProject\proj ...

  4. RPC远程过程调用概念及实现

    RPC框架学习笔记 >>什么是RPC RPC 的全称是 Remote Procedure Call 是一种进程间通信方式. 它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过 ...

  5. 关于jQuery中nth-child和nth-of-type的详解

    首先贴出来HTML的代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  6. js生成二维码/html2canvas生成屏幕截图

    1.需求简述 (1) 最初需求: 根据后台接口获取url,生成一个二维码,用户可以长按保存为图片.(这时的二维码只是纯黑白像素构成的二维码) 方案1: 使用jquery.qrcode.min.js插件 ...

  7. CNI IPAM插件分析 --- 以hostlocal为示例

    skel.CmdArgs数据结构如下所示: type CmdArgs struct { ContainerID string Netns string IfName string Args strin ...

  8. 品牌管理之万变与不变——From 品牌管理培训

  9. 设置EditText明文切换

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/mingyue_1128/article/details/37651793 if (!isChecke ...

  10. MB11 生鲜项目原料消耗发货功能

    *&---------------------------------------------------------------------* *& 程序名: ZDQFI_925 * ...