首页 > 代码库 > aop技术
aop技术
粗粒度,细粒度
使用代理
客户端------>代理对象----->目标对象
代理放行了,就调用目标对象的方法
静态代理(很少用),动态代理
为目标对象创建动态代理对象,Proxy类,jdk提供
InvocationHandler其实是回调
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); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // TODO Auto-generated method stub System.out.println("begin invoking...."); PersonServiceBean personService=(PersonServiceBean)this.targetObject; Object result=null; if(personService.getUser()!=null){ result=method.invoke(targetObject, args); }else{ System.out.println("你没有权限"); } System.out.println("end invoking...."); return result; }}
测试代码
@Test public void proxyTest(){ JDKProxyFactory factory=new JDKProxyFactory(); PersonService service=(PersonService) factory.createProxyInstance(new PersonServiceBean("aaa")); service.save("bbb"); }
输出:
begin invoking....
save
end invoking....
如果目标对象没有实现任何接口
使用cglib-nodep-2.1_3.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()); enhancer.setCallback(this); return enhancer.create(); } @Override public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { // TODO Auto-generated method stub PersonServiceBean bean=(PersonServiceBean) this.targetObject; Object result=null; if(bean.getUser()!=null){ result=methodProxy.invoke(this.targetObject, args); } return null; }}
aop技术
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。