最新公告
  • 欢迎您光临极客文库,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • 使用CGLIB生成代理

    对于不使用接口的业务类,无法使用JDK动态代理。

    CGlib采用非常底层字节码技术,可以为一个类创建子类,解决无接口代理问题。

    代码实现

    新建一个包demo2,创建一个类ProductDao

    package com.jikewenku.aop.demo2;
    
    public class ProductDao {
        public void save(){
            System.out.println("保存商品...");
        }
    
        public void update(){
            System.out.println("修改商品...");
        }
    
        public void delete(){
            System.out.println("删除商品...");
        }
    
        public void find(){
            System.out.println("查询商品...");
        }
    }
    

    传统方法和上一节一样,我们这里就不演示了,现在我们仍然是要对save方法做一个权限校验。

    创建一个类MyCglibProxy

    package com.jikewenku.aop.demo2;
    
    import org.springframework.cglib.proxy.Enhancer;
    import org.springframework.cglib.proxy.MethodInterceptor;
    import org.springframework.cglib.proxy.MethodProxy;
    
    import java.lang.reflect.Method;
    
    public class MyCglibProxy implements MethodInterceptor{
    
        private ProductDao productDao;
    
        public MyCglibProxy(ProductDao productDao){
            this.productDao = productDao;
        }
    
        public Object createProxy(){
            // 1.创建核心类
            Enhancer enhancer = new Enhancer();
            // 2.设置父类
            enhancer.setSuperclass(productDao.getClass());
            // 3.设置回调
            enhancer.setCallback(this);
            // 4.生成代理
            Object proxy = enhancer.create();
            return proxy;
        }
    
        public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
            if("save".equals(method.getName())){
                System.out.println("权限校验===================");
                return methodProxy.invokeSuper(proxy,args);
            }
            return methodProxy.invokeSuper(proxy,args);
        }
    }
    

    创建一个测试类

    package com.jikewenku.aop.demo2;
    
    import org.junit.Test;
    
    public class SpringDemo2 {
    
        @Test
        public void demo1(){
            ProductDao productDao = new ProductDao();
    
            ProductDao proxy = (ProductDao) new MyCglibProxy(productDao).createProxy();
            proxy.save();
            proxy.update();
            proxy.delete();
            proxy.find();
        }
    }
    

    运行程序,输出结果正确,保存之前进行了权限校验

    代理知识总结

    Spring在运行期,生成动态代理对象,不需要特殊的编译器

    Spring AOP的底层就是通过JDK动态代理或CGLib动态代理技术为目标Bean执行横向织入

    1、若目标对象实现了若干接口,Spring使用JDK的java.lang.reflect.Proxy类代理。

    2、若目标对象没有实现任何接口,Spring使用CGLib库生成目标对象的子类。

    程序中应优先对接口创建代理,便于程序解耦维护

    标记为final的方法,不能被代理,因为无法进行覆盖

    – JDK动态代理是针对接口生成子类,接口中方法不能使用final修饰

    – CGLib是针对目标类生产子类,因此类或方法不能使用final

    Spring只支持方法链接点,不提供属性连接。

    本站所有文章均由网友分享,仅用于参考学习用,请勿直接转载,如有侵权,请联系网站客服删除相关文章。若由于商用引起版权纠纷,一切责任均由使用者承担
    极客文库 » Spring AOP的底层实现之CGLIB的动态代理

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    极客文库
    程序员的加油站

    Leave a Reply

    Hi, 如果你对这款模板有疑问,可以跟我联系哦!

    联系发布者

    Leave a Reply

    Hi, 如果你对这款模板有疑问,可以跟我联系哦!

    联系发布者
    • 99会员总数(位)
    • 3629资源总数(个)
    • 44本周发布(个)
    • 0 今日发布(个)
    • 105稳定运行(天)

    欢迎加入「极客文库」,成为原创作者从这里开始!

    立即加入 了解更多