zoukankan      html  css  js  c++  java
  • aop学习总结二------使用cglib动态代理简单实现aop功能

    aop学习总结二------使用cglib动态代理简单实现aop功能

    模拟业务需求:

    1.拦截所有业务方法

    2.判断用户是否有权限,有权限就允许用户执行业务方法,无权限不允许用户执行业务方法

    (判断是否有权限是根据user是否为null

    CGLIB的代理:目标对象没有实现接口

    业务类:

    package ql.service.impl;
    
    
    public class PersonServiceBean {
    
        private String user=null;
        
        public PersonServiceBean(){}
        
        public PersonServiceBean(String user){    
            this.user=user;
        }
    
        public String getUser() {
            return user;
        }
    
        public void setUser(String user) {
            this.user = user;
        }
    
        public void save(String name) {
    
            System.out.println("我是save()方法");
        }
    
        public void update(String name, Integer personId) {
            System.out.println("我是update()方法");
        }
    
        public String getPersonName(Integer personId) {
            System.out.println("我是getPersonName()方法");
            return "success";
        }
    
    }

    CGLIB动态代理工厂类:

    package ql.aop;
    
    import java.lang.reflect.Method;
    
    import net.sf.cglib.proxy.Enhancer;
    import net.sf.cglib.proxy.MethodInterceptor;
    import net.sf.cglib.proxy.MethodProxy;
    import ql.service.impl.PersonServiceBean;
    
    public class CGLIBProxyFactory implements MethodInterceptor {
    
        // 目标对象
        private Object targetObject;
    
        // 得到一个代理实例
        public Object createProxyIntance(Object targetObject) {
            this.targetObject = targetObject;
            // 该类用于生产代理对象
            Enhancer enhancer = new Enhancer();
            // 继承了目标对象,对目标类的所有非final方法进行覆盖,并加上自己的代码
            enhancer.setSuperclass(this.targetObject.getClass());
            enhancer.setCallback(this);
            return enhancer.create();
        }
    
        public Object intercept(Object proxy, Method method, Object[] args,
                MethodProxy methodProxy) throws Throwable {
            PersonServiceBean bean = (PersonServiceBean) this.targetObject;
    
            Object result = null;
            if (bean.getUser() != null) {
                result = methodProxy.invoke(targetObject, args);
            }
            return result;
        }
    }

    单元测试类:

    package ql.test;
    
    
    import org.junit.Before;
    import org.junit.Test;
    
    import ql.aop.CGLIBProxyFactory;
    import ql.service.impl.PersonServiceBean;
    
    public class ProxyTest {
    
        @Before
        public void setUp() throws Exception {
        }
    
        @Test
        public void testCGLIBProxyFactory1() {
            
            CGLIBProxyFactory cglibProxyFactory=new CGLIBProxyFactory();
            PersonServiceBean personServiceBean=(PersonServiceBean) cglibProxyFactory.createProxyIntance(new PersonServiceBean());
            personServiceBean.save("小明");
        }
        @Test
        public void testCGLIBProxyFactory2() {
            CGLIBProxyFactory cglibProxyFactory=new CGLIBProxyFactory();
            PersonServiceBean personServiceBean=(PersonServiceBean) cglibProxyFactory.createProxyIntance(new PersonServiceBean("xxxx"));
            personServiceBean.save("小明");
        }
    
    }
  • 相关阅读:
    Linux(实操篇)--- 实用指令-运行级别和找回root密码
    Python使用文件操作实现一个XX信息管理系统的示例
    python解释器安装教程的方法步骤
    python如何使用代码运行助手
    python 识别登录验证码图片功能的实现代码(完整代码)
    python线性插值解析
    python协程 详解
    maxcompute mapjoin
    spark split节点笔记
    安装和配置hadoop
  • 原文地址:https://www.cnblogs.com/ql211lin/p/4552169.html
Copyright © 2011-2022 走看看