spring动态代理
2021-07-16 04:07
标签:object string 第一个 ati 实例 类加载器 sys upd final spring动态代理 标签:object string 第一个 ati 实例 类加载器 sys upd final 原文地址:https://www.cnblogs.com/xiaostudy/p/9535015.html1、被代理类接口Person.java
1 package com.xiaostudy;
2
3 /**
4 * @desc 被代理类接口
5 *
6 * @author xiaostudy
7 *
8 */
9 public interface Person {
10
11 public void add();
12 public void update();
13 public void delete();
14 }
2、被代理类PersonImple.java
1 package com.xiaostudy;
2
3 /**
4 * @desc 被代理类
5 *
6 * @author xiaostudy
7 *
8 */
9 public class PersonImple implements Person {
10
11 /**
12 * @desc 实现接口方法
13 */
14 public void add() {
15 System.out.println("add()>>>>>>>>");
16 }
17
18 @Override
19 public void update() {
20 System.out.println("update()>>>>>>>>");
21 }
22
23 @Override
24 public void delete() {
25 System.out.println("delete()>>>>>>>>");
26 }
27
28 }
3、切面类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 }
4、代理工厂类MyBeanFactory.java
1 package com.xiaostudy;
2
3 import java.lang.reflect.InvocationHandler;
4 import java.lang.reflect.Method;
5 import java.lang.reflect.Proxy;
6
7 /**
8 * @desc 代理工厂类
9 *
10 * @author xiaostudy
11 *
12 */
13 public class MyBeanFactory {
14 /**
15 * @desc 获取一个代理的对象
16 *
17 * @return Person对象
18 */
19 public static Person createPerson() {
20 //被代理类
21 final Person person = new PersonImple();
22 //切面类
23 final MyAdvice myAdvice = new MyAdvice();
24 /*
25 * 1、第一个参数:loader 类加载器,动态代理类,运行时创建,任何类都需要加载器将其加载到内存
26 * 一般情况:当前类.class.getClassLoader() 2、第二个参数:Class[] interfaces,代理类需要实现的所有接口
27 * 方法1、被代理类实例.getClass().getInterfaces() 注意:只能获取父类的接口,而不能获取父类的父类接口 方法2、new
28 * Class[]{被代理类.class} 3、第三个参数:InvocationHandler 处理类,这个是接口,要进行实现类,采用匿名内部类
29 * 提供invoke()方法,代理类每个方法都要调用一次invoke 3.1、第一个参数:proxy 被代理类对象 3.2、第二个参数:method
30 * 代理类对象当前执行的方法的描述对象 执行方法名:method.getName() 执行方法:method.invoke(被代理类对象,实际参数)
31 * 3.3、第三个参数:方法实际参数
32 */
33 return (Person) Proxy.newProxyInstance(MyBeanFactory.class.getClassLoader(), person.getClass().getInterfaces(),
34 new InvocationHandler() {
35 @Override
36 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
37 myAdvice.before();
38 method.invoke(person, args);
39 myAdvice.after();
40 return proxy;
41 }
42 });
43 }
44
45 }
5、测试类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 }