
1、被代理类Person.java
1 1 package com.xiaostudy;
2 2
3 3 8
9 9 public class Person {
1010
1111 public void add() {
1212 System.out.println("add()>>>>>>>>");
1313 }
1414
1515 public void update() {
1616 System.out.println("update()>>>>>>>>");
1717 }
1818
1919 public void delete() {
2020 System.out.println("delete()>>>>>>>>");
2121 }
2222
2323 }
2、切面类MyAdvice.java
1 1 package com.xiaostudy;
2 2
3 3 8
9 9 public class MyAdvice {
1010
1111 13
1414 public void before() {
1515 System.out.println("日记开始>>>>>>>>>>>");
1616 }
1717
1818 public void after() {
1919 System.out.println("日记结束<<<<<<<<<<<<");
2020 }
2121
2222 }
3、代理工厂类MyBeanFactory.java
1 1 package com.xiaostudy;
2 2
3 3 import java.lang.reflect.Method;
4 4
5 5 import org.springframework.cglib.proxy.Enhancer;
6 6 import org.springframework.cglib.proxy.MethodInterceptor;
7 7 import org.springframework.cglib.proxy.MethodProxy;
8 8
9 9 14
1515 public class MyBeanFactory {
1616 20
2121 public static Person createPerson() {
2222 // 被代理类
2323 final Person person = new Person();
2424 // 切面类
2525 final MyAdvice myAdvice = new MyAdvice();
2626 // 代理类,采用cglib
2727 // 核心类
2828 Enhancer enhancer = new Enhancer();
2929 // 确定父类
3030 enhancer.setSuperclass(person.getClass());
3131 /*
3232 * 设置回调函数 , MethodInterceptor接口 等效 InvocationHandler
3333 * 接口 intercept() 等效 invoke()
3434 * 参数1、参数2、参数3:以invoke一样
3535 * 参数4:methodProxy 方法的代理
3636 */
3737 enhancer.setCallback(new MethodInterceptor() {
3838
3939 @Override
4040 public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy)
4141 throws Throwable {
4242 myAdvice.before();
4343 Object obj = method.invoke(person, args);
4444 // 这个与上面 等价
4545 // Object obj2 = methodProxy.invokeSuper(proxy, args);
4646 myAdvice.after();
4747 return obj;
4848 }
4949 });
5050 // 创建代理
5151 Person obj = (Person) enhancer.create();
5252
5353 return obj;
5454 }
5555
5656 }
4、测试类Test.java
1 1 package com.xiaostudy;
2 2
3 3 8
9 9 public class Test {
1010
1111 public static void main(String[] args) {
1212 Person person = MyBeanFactory.createPerson();
1313 person.add();
1414 person.update();
1515 person.delete();
1616 }
1717
1818 }