Aop
Aop:面向切面编程,是opp:面向对象编程的加强
想要增强原方法的功能而不修改源代码
有一接口,有方法service,传递参数name
package com.company.service; public interface IService { public void service(String name) throws Exception; }
有一实现类,实现了方法,具体是实现成了:输出传递进去的参数name,这个方法是个普通方法,传递的参数name需要手动调用方法
package com.company.service; public class ServiceImplA implements IService{ @Override public void service(String name) throws Exception { System.out.println("ServiceImplA name"+name); } }
package com.company.service;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
创建一个动态代理类,实现了接口 InvocationHandler,该接口有一个方法invoke,要增强的内容就卸载invoke方法里。
public class DynaProxyServiceA implements InvocationHandler {生成动态代理对象
private Object target;//目标对象,就是要加强的对象 public Object bind(Object object){ this.target=object;
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException
loader: 一个ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载
interfaces: 一个Interface对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口,如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了
h: 一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上
代理对象对于原先类里的每一个方法都起到了增强作用 Object obj= Proxy.newProxyInstance(this.target.getClass().getClassLoader(),this.target.getClass().getInterfaces(),this); return obj; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result=null; System.out.println("method:"+method); System.out.println("args:"+args); System.out.println("target:"+this.target); System.out.println("log start"); try{ result=method.invoke(this.target,args); }catch (Exception e){ throw e; } System.out.println("log end"); return result; } }
@Test public void testAop() throws Exception { IService service= (IService)new DynaProxyServiceA().bind(new ServiceImplA());//动态代理对象绑定了目标对象serviceImplA· service.service("CYN");//当动态代理对象调用自己的方法时,就会自动调用invoke方法 }
Aop操作术语:
连接点:能够被增强的方法
切入点:实际上被增强的方法
通知(增强):实际被增强的部分
其类型有:
前置通知
后置通知
环绕通知
异常通知
最终通知
切面:指的是一个动作,是把通知应用到切入点的过程
可以在这个网站下载jar包
本文来自博客园,作者:北征愚人,转载请注明原文链接:https://www.cnblogs.com/xukd/p/15179045.html