读书人

AOP在Spring的兑现

发布时间: 2012-10-26 10:30:59 作者: rapoo

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");}}


读书人网 >编程

热点推荐