您的位置:首页 > 运维架构

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

2015-06-04 16:18 731 查看
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("小明");
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: