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操作术语:

连接点:能够被增强的方法

切入点:实际上被增强的方法

通知(增强):实际被增强的部分

其类型有:

前置通知

后置通知

环绕通知

异常通知

最终通知

切面:指的是一个动作,是把通知应用到切入点的过程

仓库服务 (aliyun.com)

可以在这个网站下载jar包

posted @ 2021-08-24 10:08  北征愚人  阅读(176)  评论(0编辑  收藏  举报