前言最近在复习spring特记录于此,欢迎大家交流指正---QQ:767872620
用的是简单的用jdk自带的Proxy实现动态代理模式!
横切性关注点
客户端-->代理对象-->目标对象(此处要求目标类必须实现一个接口)
1.接口
public interface PersonService {
public void save(String name);
public void update(String name,Integer personid);
public String getPersonName(Integer personid);
}
2.接口实现类
/**
*
* @author Mars
*1.拦截所有业务方法
*2。判断用户是否有权限,有权限就允许他执行业务方法,没有权限就不允许他执行业务方法
*是否有权限是根据user是否为null作为判断依据
*/
public class PersonServiceBean implements PersonService {
public PersonServiceBean(String user) {
super();
this.user = user;
}
public String getUser() {
return user;
}
public String user = null;
public PersonServiceBean(){
}
public String getPersonName(Integer personid) {
return "xxx";
}
public void save(String name) {
System.out.println("我是save方法");
}
public void update(String name, Integer personid) {
System.out.println("我是update方法");
}
}
3.拦截代理工厂类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import cn.itcast.service.imp.PersonServiceBean;
public class JDKProxyFactory implements InvocationHandler {
private Object targetObject;
public Object createProxyIntance(Object targetObject){
this.targetObject = targetObject;
/*ClassLoader loader, Class<?>[] interfaces, InvocationHandler h
* 参数1目标类对象装载器
* 参数2要实现目标对象的接口 ,目标对象的所有接口(目标类必须实现接口)
* 参数3回调的类,要求回调的类必须实现InvocationHandler接口和invoke(),
* 拦截调用过程:
* 1.当客户端调用代理对象的方法时,会被InvocationHandler的对象拦截到
* 2.会调用InvocationHandler这个对象的invoke()
* 3.在invoke()中再将调用委派给目标对象
*
*/
return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(), this.targetObject.getClass().getInterfaces(), this);
}
/**
*
* @param proxy 代理对象
* @param method 被拦截到的方法
* @param args 方法的输入参数
* @return
* @throws Throwable
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
PersonServiceBean bean = (PersonServiceBean)this.targetObject;
Object result = null;
if(bean.getUser() !=null){
result=method.invoke(targetObject, args);
}
return result;
}
}
4.测试类
package junit.test;
import org.junit.BeforeClass;
import org.junit.Test;
import cn.itcast.aop.JDKProxyFactory;
import cn.itcast.service.PersonService;
import cn.itcast.service.imp.PersonServiceBean;
public class AOPTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception{
}
@Test public void proxyTest(){
JDKProxyFactory factory = new JDKProxyFactory();
//有无权限的两种情况
PersonService service = (PersonService)factory.createProxyIntance(new PersonServiceBean());
// PersonService service = (PersonService)factory.createProxyIntance(new PersonServiceBean("xxxxx"));
service.save("999999999");
}
}