• 4-2cglib 动态代理


    JDK的动态代理依靠接口实现,如果有些类并没有实现接口,则不能使用JDK代理,这就要使用cglib动态代理了。

    Cglib动态代理 
    JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。 

    BookCadeImpl1.java 

    Java代码  
    1. package net.battier.dao.impl;  
    2.   
    3. /** 
    4.  * 这个是没有实现接口的实现类 
    5.  *  
    6.  * @author student 
    7.  *  
    8.  */  
    9. public class BookFacadeImpl1 {  
    10.     public void addBook() {  
    11.         System.out.println("增加图书的普通方法...");  
    12.     }  
    13. }  


    3、BookFacadeProxy.java 

    Java代码  
    1. package net.battier.proxy;  
    2.   
    3. import java.lang.reflect.Method;  
    4.   
    5. import net.sf.cglib.proxy.Enhancer;  
    6. import net.sf.cglib.proxy.MethodInterceptor;  
    7. import net.sf.cglib.proxy.MethodProxy;  
    8.   
    9. /** 
    10.  * 使用cglib动态代理 
    11.  *  
    12.  * @author student 
    13.  *  
    14.  */  
    15. public class BookFacadeCglib implements MethodInterceptor {  
    16.     private Object target;  
    17.   
    18.     /** 
    19.      * 创建代理对象 
    20.      *  
    21.      * @param target 
    22.      * @return 
    23.      */  
    24.     public Object getInstance(Object target) {  
    25.         this.target = target;  
    26.         Enhancer enhancer = new Enhancer();  
    27.         enhancer.setSuperclass(this.target.getClass());  
    28.         // 回调方法  
    29.         enhancer.setCallback(this);  
    30.         // 创建代理对象  
    31.         return enhancer.create();  
    32.     }  
    33.   
    34.     @Override  
    35.     // 回调方法  
    36.     public Object intercept(Object obj, Method method, Object[] args,  
    37.             MethodProxy proxy) throws Throwable {  
    38.         System.out.println("事物开始");  
    39.         proxy.invokeSuper(obj, args);  
    40.         System.out.println("事物结束");  
    41.         return null;  
    42.   
    43.   
    44.     }  
    45.   
    46. }  


    4、TestCglib.java 

    Java代码  
      1. package net.battier.test;  
      2.   
      3. import net.battier.dao.impl.BookFacadeImpl1;  
      4. import net.battier.proxy.BookFacadeCglib;  
      5.   
      6. public class TestCglib {  
      7.       
      8.     public static void main(String[] args) {  
      9.         BookFacadeCglib cglib=new BookFacadeCglib();  
      10.         BookFacadeImpl1 bookCglib=(BookFacadeImpl1)cglib.getInstance(new BookFacadeImpl1());  
      11.         bookCglib.addBook();  
      12.     }  
      13. }  
  • 相关阅读:
    N个数求和
    求整数段和
    连续因子
    L1-005 考试座位号
    PTA Java tips(转载)
    个位数统计
    flink编译支持CDH6.2.0(hadoop3.0.0)
    hdfs/hbase 程序利用Kerberos认证超过ticket_lifetime期限后异常
    spring boot通过@Bean注解定义一个Controller
    【TypeScript】TypeScript 学习 2——接口
  • 原文地址:https://www.cnblogs.com/guoliangxie/p/5301782.html
Copyright © 2020-2023  润新知