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("小明");
    }

}

 

posted @ 2015-06-04 16:18  加肥猫咪  阅读(609)  评论(0编辑  收藏  举报