spring的aop学习
1、关于拦截权限
1、拦截类中所有的业务方法
2、判断用户是否有权限,有就允许执行业务方法,否则不准
PersonService.java
/**
* 书本:【SSH】
* 功能:spring的aop学习
* 文件:PersonService.java
* 时间:2015年3月23日08:52:08
* 作者:cutter_point
*/
package cn.cutter_point.service;
public interface PersonService
{
public void save(String name);
public void update(String name, Integer personid);
public String getPersonName(Integer personid);
}
PersonServiceBean.java
/**
* 书本:【SSH】
* 功能:spring的aop学习
* 文件:PersonServiceBean.java
* 时间:2015年3月23日08:52:08
* 作者:cutter_point
*/
package cn.cutter_point.service.impl;
import cn.cutter_point.service.PersonService;
public class PersonServiceBean implements PersonService
{
private String user = null;
public PersonServiceBean() {}
public PersonServiceBean(String user)
{
this.user = user;
}
public void save(String name)
{
// TODO Auto-generated method stub
if(user != null)
{
System.out.println("cutter_point save() 方法!!!");
}
}
public void update(String name, Integer personid)
{
// TODO Auto-generated method stub
if(user != null)
{
System.out.println("cutter_point update()方法!");
}
}
public String getPersonName(Integer personid)
{
// TODO Auto-generated method stub
if(user != null)
{
System.out.println("cutter_point getPersonName()方法!");
}
return "cutter_point";
}
}
但是这样做显然是不行的,如果我们要控制更多的业务bean的业务方法,那么这个会出现在各个业务bean中,所以这个方法就不灵活,并且如果我们不是用user是不是为空来判断是否有权限的话,那么我们就都得改,那么久更麻烦了
2、使用代理来控制权限
那么这个代理对象如何去创建呢???
这个时候jdk中有一个Proxy的类,这个类有一个方法就是创建代理实例的,其中这个方法有三个参数。
1、类的装载器
2、要实现的接口
3、回调的接口实现,拦截到方法之后会触发这个类
<pre name="code" class="java">/**
* 书本:【SSH】
* 功能:spring的aop学习
* 文件:JDKProxyFactory.java
* 时间:2015年3月23日09:26:03
* 作者:cutter_point
*/
package cn.aop;
import java.lang.reflect.Proxy;
public class JDKProxyFactory
{
public Object targetObject; //目标对象
private ProxyWays pw; //实现拦截方法处理
public Object createProxyIntance(Object targetObject)
{
this.targetObject = targetObject;
pw = new ProxyWays(targetObject);
//返回一个代理实例,类装载器,要拦截的接口,方法, 拦截之后执行的方法
return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(), this.targetObject.getClass().getInterfaces(), pw);
}
}
拦截到的时候我们有一个pw的实例来处理事务
/**
* 书本:【SSH】
* 功能:spring的aop学习,拦截到对象之后要执行的方法
* 文件:ProxyWays.java
* 时间:2015年3月23日09:26:03
* 作者:cutter_point
*/
package cn.aop;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import cn.cutter_point.service.impl.PersonServiceBean;
public class ProxyWays implements InvocationHandler
{
Object targetObject;
public ProxyWays(Object targetObject)
{
this.targetObject = targetObject;
}
@Override
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;
}
}
3、测试
package junit.test;
import static org.junit.Assert.*;
import org.junit.BeforeClass;
import org.junit.Test;
import cn.aop.JDKProxyFactory;
import cn.cutter_point.service.PersonService;
import cn.cutter_point.service.impl.PersonServiceBean;
public class AOPTest
{
@BeforeClass
public static void setUpBeforeClass() throws Exception
{}
@Test
public void test()
{
//fail("Not yet implemented");
JDKProxyFactory factory = new JDKProxyFactory(); //创建一个代理工厂
PersonService service = (PersonService) factory.createProxyIntance(new PersonServiceBean("cutter"));
service.save("point");
}
}