AOP编程的实现与原理

1、问题描述:拦截所有业务方法,判断用户是否有权限,有权限就允许他执行业务方法。

1.1定义一个UserServcie业务接口

public interface UserService {
 public void save();
 public void update(String name,Integer userid);
 public String getUserName(Integer userid);
}

 

1.2、编写实现UserServcie接口的类

public class UserServiceBean implements UserService {
	private String user = null;
	
	public UserServiceBean (String user){
		this.user = user;
	}
	public UserServiceBean (){
		
	}
	public String getUserName(Integer userid) {
		return "xxx";
	}
	public String getUser() {
		return user;
	}
	public void save() {
	//	if(user!=null){System.out.println("我是save()方法");}
		System.out.println("我是save()方法");

	}
	public void update(String name, Integer userid) {
		System.out.println("我是update()方法");
	}
}

 

2、编写JDKProxyFactory代理工厂类,要求实现java.lang.reflect.InvocationHandler接口,实现invoke方法.

public class JDKProxyFactory implements InvocationHandler{

	private Object targetObject;
	
	//创建目标对象的代理类
	public Object createProxyInstance(Object targetObject){
		this.targetObject = targetObject;
		return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(),
				//實現目標對象的所有接口,InvocationHandler是回調
				this.targetObject.getClass().getInterfaces(), this);
	}
	//當客戶端調用代理對象方法的時候,會先調用this的這個方法invoke
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		PersonServiceBean bean = (PersonServiceBean)this.targetObject;
		Object result = null;
		if(bean.getUser()!=null){
			//最終方法的調用委派給目標對象targetObject
		   result = method.invoke(targetObject, args);
		}else{
			System.out.println("沒有權限,退出程序.....");
		}	
		return result;
	}
}

  2.2 第二种方式,创建 CGlibProxyFactory代理工厂,要求实现MethodInterceptor接口,并实现其中的intercept方法.

(注:要加入cglib相关jar包)

public class CGlibProxyFactory implements MethodInterceptor{
	private Object targetObject;
	
	public Object createProxyInstance(Object targetObject){
		this.targetObject = targetObject;
		Enhancer enhancer = new Enhancer();
		enhancer.setSuperclass(this.targetObject.getClass());//继承目标类,重写final方法
		enhancer.setCallback(this);
		return enhancer.create();
	}

	//类似struts2拦截器
	public Object intercept(Object proxy, Method method, Object[] args,
			MethodProxy methodProxy) throws Throwable {
		UserServiceBean bean = (UserServiceBean)this.targetObject;
		Object result = null;
		if(bean.getUser()!=null){
		   result = method.invoke(targetObject, args);
		}else{
                                      System.out.println("沒有權限,退出程序.....");
                                } 	
		return result;
	}
}

 

3、编写测试类

public class AOPTest extends TestCase {
	@Test
	public void proxyTest(){
		//测试JDKProxy
		System.out.println("----------测试JDKProxy----------");
		JDKProxyFactory factory = new JDKProxyFactory();
		UserService userService = (UserService )factory.createProxyInstance(new UserServiceBean());
		userService .save();
		userService = (UserService )factory.createProxyInstance(new UserServiceBean("test"));
		userService .save();
		
		//测试CGlibProxy
		System.out.println("----------测试CGlibProxy----------");
		CGlibProxyFactory factory2 = new CGlibProxyFactory();
		userService = (UserServiceBean)factory2.createProxyInstance(new PersonServiceBean());
		userService .save();
		userService = (UserServiceBean)factory2.createProxyInstance(new UserServiceBean("test"));
		userService .save();
	}
}

运行结果:

----------测试JDKProxy----------
沒有權限,退出程序.....
我是save()方法
----------测试CGlibProxy----------
沒有權限,退出程序.....
我是save()方法

 

你可能感兴趣的:(AOP,编程,bean)