手动实现一个AOP

maven依赖:

		<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>5.3.1</version>
        </dependency>

目标类:

public class UserService {

    public Object insert() {
        System.out.println("=====================插入成功=====================");
        //int i = 1/0;
        return "null";
    }
}

生成代理类:

public class ProxyFactory {
    //目标对象
    private Object target;

    //通知集合,把通知放到集合中
    private List<BaseAdvice> advices;
    public ProxyFactory() {
        advices = new ArrayList<BaseAdvice>();
        advices.add(new ThrowAdvice());
        advices.add(new AfterAdvice());
        advices.add(new AfterReturningAdvice());
        advices.add(new BeforeAdvice());
    }
	//创建代理对象
    public UserService getProxy(final Object target) {
        this.target = target;
        UserService userService = (UserService) Enhancer.create(target.getClass(), new MethodInterceptor() {
            public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
                //通过调用链的方式,调用通知!
                Chain chain = new Chain(advices, method, args, target);
                chain.chainProceed();
                return null;
            }
        });
        return userService;
    }
}

执行链:Chain

public class Chain {
    //存放通知的集合
    private List<BaseAdvice> adviceList;

    private Method method; //目标方法
    private Object[] args; // 目标方法参数
    private Object target; // 目标对象
    public Chain(List<BaseAdvice> advices,Method method,Object[] args,Object target) {
        this.adviceList = advices;
        this.method = method;
        this.args = args;
        this.target = target;
    }
    //记录list下标
    public int index = -1;
    //遍历list,执行通知方法
    public Object chainProceed() throws Throwable {
        if (index == adviceList.size() - 1) {
            //执行我们的目标方法
            //所有通知都依次调用完成,才会进入到这个if
            //通过反射调用目标方法
            return method.invoke(target,args);
        }
        return adviceList.get(++index).execute(this);//调用通知方法
    }
}

通知:

public class BeforeAdvice extends BaseAdvice{
    @Override
    public Object execute(Chain chain) throws Throwable {
        //前置通知执行方法
        System.out.println("前置通知~");
        //如果chain链中还有通知,就继续调用
        chain.chainProceed();
        return null;
    }
}
public class AfterReturningAdvice extends BaseAdvice {
    @Override
    public Object execute(Chain chain) throws Throwable {

        Object o = chain.chainProceed();
        //如果上面执行没有报异常,执行后置通知
        System.out.println("后置通知~");
        return null;
    }
}
public class AfterAdvice extends BaseAdvice{
    @Override
    public Object execute(Chain chain) throws Throwable {
        try {
            return chain.chainProceed();
        }finally {
            System.out.println("最终通知~");
        }
    }
}
public class ThrowAdvice extends BaseAdvice{
    @Override
    public Object execute(Chain chain) throws Throwable {
        try {
            return chain.chainProceed();
        } catch (Throwable ex) {
            System.out.println("异常通知~");
            throw ex;
        }
    }
}

测试:

public class Main {
    public static void main(String[] args) throws Throwable {

        UserService proxyUserService = new ProxyFactory().getProxy(new UserService());
        proxyUserService.insert();
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值