AOP在Spring的实现
AOP一般用来做权限判断:
思考问题方法叫做:横切性关注点
1.拦截所有方法
2.判断用户是否有权限,有权限就允许执行业务方法,否者不执行。
假如不使用AOP框架,可以利用“代理模式”来解决
user-------代理对象---------目标对象
代理对象的创建:
1.静态代理(企业应用,很少用)
2.动态代理
前提是目标对象是面向接口
首先写一个接口:
public interface PersonService {public void save(String name);public void update(String name, Integer personid);public String getPersinName(Integer personid);}
提供一个业务Bean实现该接口:
public class PersonServiceBean implements PersonService {public String getUser() {return user;}public void setUser(String user) {this.user = user;}private String user=null;public PersonServiceBean(){}public PersonServiceBean(String user) {this.user = user;}public String getPersinName(Integer personid) {return "xxx";}public void save(String name) {System.out.println("I am save");}public void update(String name, Integer personid) {System.out.println("I am update");}}
现在需要拦截PersonServiceBean的所有方法,使用代理技术,需要使用的类:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
然后创建代理工厂
import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import cn.itcast.servrice.impl.PersonServiceBean;public class JDKProxyFactory implements InvocationHandler {private Object targetObject;public Object createProxyInstance(Object targetObject) {this.targetObject = targetObject;return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(),this.targetObject.getClass().getInterfaces(), this);}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;}}
创建测试函数
public class AOpTest {@BeforeClasspublic static void setUpBeforeClass() throws Exception {}@Test public void proxyTest(){JDKProxyFactory factory =new JDKProxyFactory();PersonService service = (PersonService)factory.createProxyInstance(new PersonServiceBean());service.save("888");}}