手动模拟实现Spring-AOP

Spring中AOP设计思路是这样的.

在BeaFactory.getBean()时,调用方法initBean();
在该方法中判断当前Bean是否含有满足SpEL表达式的Method, 没有的话, 返回原始的Bean,
有的话, 会对当前Bean做动态代理,
当代理对象的方法被调用时,会发送通知到Aop拦截器,进而实现Aop的功能.

本篇文章思路接着上篇文章,
(手动模拟实现Spring-MVC)
https://blog.csdn.net/yangsnow_rain_wind/article/details/80223158


本次手动模拟Spring-Aop思路如下;
1.添加类FLAopProxy, 该类实现接口InvocationHandler, 用来实现Bean的动态代理功能
2.添加类FLAopConfig, 记录每个被代理Bean下所有满足条件的Method,并记录下其对应的aspject通知
3.修改类FLBeanWrapper, 为该包装类添加新属性FLAopProxy,用来记录Bean的代理配置

本次模拟类的包含关系如下图:
这里写图片描述

整个关系如下;
每个FLBeanWrapper包含属性_originalBean(存储原始bean对象), _wrapperedBean(存储动态代理后的对象), FLAopProxy对象(用来生成动态代理).
每个FLAopProxy对象包含一个target属性, ()用来保存原始bean对象引用),包含一个FLAopConfig对象(保存Bean符合SpEl条件的method,及该method被调用时的aspect通知.)

下面是源码:

1. FLAopProxy

public class FLAopProxy implements InvocationHandler {
   

  private FLAopConfig config = new FLAopConfig();
   private Object target;

   //对原始对象生成动态代理,
   public Object getProxy(Object instance) {
       this.target = instance;
       Class<?> clazz = instance.getClass();
       return Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), this);
   }

   @Override
   public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

       //当前的Method是代理后的method
       Method originalMethod=this.target.getClass().getMethod(method.getName(),method.getParameterTypes());

       //如果动态代理对象的方法属于config中配置的方法, 则调用前置通知
       if (
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值