zoukankan      html  css  js  c++  java
  • spring的cglib代理


    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 }

  • 相关阅读:
    工作中搜索页面搜索记录功能的封装(存储到本地)
    工作中遇到的git问题
    Git 常用命令
    帮女票做的报表(用到了angular的一些指令)
    HTML和CSS的知识点
    动画制作 手机APP制作以及响应式的实现
    CSS新内容
    JS中的循环嵌套 BOM函数
    fullpage的使用以及less, Sass的属性和JQuery自定义插件的声明和使用
    Javascript的内容
  • 原文地址:https://www.cnblogs.com/xiaostudy/p/9535208.html
Copyright © 2011-2022 走看看