spring动态代理的cglib方法
2021-07-16 01:05
标签:stat alt work 等价 for glib 核心 ide str spring动态代理的cglib方法 标签:stat alt work 等价 for glib 核心 ide str 原文地址:https://www.cnblogs.com/xiaostudy/p/9535208.html
1、被代理类Person.java
1 package com.xiaostudy;
2
3 /**
4 * @desc 被代理类
5 *
6 * @author xiaostudy
7 *
8 */
9 public class Person {
10
11 public void add() {
12 System.out.println("add()>>>>>>>>");
13 }
14
15 public void update() {
16 System.out.println("update()>>>>>>>>");
17 }
18
19 public void delete() {
20 System.out.println("delete()>>>>>>>>");
21 }
22
23 }
2、切面类MyAdvice.java
1 package com.xiaostudy;
2
3 /**
4 * @desc 切面类
5 *
6 * @author xiaostudy
7 *
8 */
9 public class MyAdvice {
10
11 /**
12 * @desc 植入代理方法的方法
13 */
14 public void before() {
15 System.out.println("日记开始>>>>>>>>>>>");
16 }
17
18 public void after() {
19 System.out.println("日记结束);
20 }
21
22 }
3、代理工厂类MyBeanFactory.java
1 package com.xiaostudy;
2
3 import java.lang.reflect.Method;
4
5 import org.springframework.cglib.proxy.Enhancer;
6 import org.springframework.cglib.proxy.MethodInterceptor;
7 import org.springframework.cglib.proxy.MethodProxy;
8
9 /**
10 * @desc 代理工厂类
11 *
12 * @author xiaostudy
13 *
14 */
15 public class MyBeanFactory {
16 /**
17 * @desc 获取一个代理的对象
18 *
19 * @return Person对象
20 */
21 public static Person createPerson() {
22 // 被代理类
23 final Person person = new Person();
24 // 切面类
25 final MyAdvice myAdvice = new MyAdvice();
26 // 代理类,采用cglib
27 // 核心类
28 Enhancer enhancer = new Enhancer();
29 // 确定父类
30 enhancer.setSuperclass(person.getClass());
31 /*
32 * 设置回调函数 , MethodInterceptor接口 等效 InvocationHandler
33 * 接口 intercept() 等效 invoke()
34 * 参数1、参数2、参数3:以invoke一样
35 * 参数4:methodProxy 方法的代理
36 */
37 enhancer.setCallback(new MethodInterceptor() {
38
39 @Override
40 public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy)
41 throws Throwable {
42 myAdvice.before();
43 Object obj = method.invoke(person, args);
44 // 这个与上面 等价
45 // Object obj2 = methodProxy.invokeSuper(proxy, args);
46 myAdvice.after();
47 return obj;
48 }
49 });
50 // 创建代理
51 Person obj = (Person) enhancer.create();
52
53 return obj;
54 }
55
56 }
4、测试类Test.java
1 package com.xiaostudy;
2
3 /**
4 * @desc 测试类
5 *
6 * @author xiaostudy
7 *
8 */
9 public class Test {
10
11 public static void main(String[] args) {
12 Person person = MyBeanFactory.createPerson();
13 person.add();
14 person.update();
15 person.delete();
16 }
17
18 }