spring学习笔记5--简单模拟实现AOP(JDK版)

前言最近在复习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");
	}
}





 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值