当前位置: 首页 > news >正文

Spring AOP 基于注解源码整理

导入配置类

  1. EnableAspectJAutoProxy 注解导入 AspectJAutoProxyRegistrar
  2. ImportBeanDefinitionRegistrar#registerBeanDefinitions向容器中加入AnnotationAwareAspectJAutoProxyCreator
  3. AnnotationAwareAspectJAutoProxyCreator#initBeanFactory初始化ReflectiveAspectJAdvisorFactory
    protected void initBeanFactory(ConfigurableListableBeanFactory beanFactory) {super.initBeanFactory(beanFactory);if (this.aspectJAdvisorFactory == null) {this.aspectJAdvisorFactory = new ReflectiveAspectJAdvisorFactory(beanFactory);}this.aspectJAdvisorsBuilder =new BeanFactoryAspectJAdvisorsBuilderAdapter(beanFactory, this.aspectJAdvisorFactory);
    }
    

解析出所有的Advisor对象

  1. AbstractAutoProxyCreator#postProcessBeforeInstantiation
     public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) {Object cacheKey = getCacheKey(beanClass, beanName);if (!StringUtils.hasLength(beanName) || !this.targetSourcedBeans.contains(beanName)) {if (this.advisedBeans.containsKey(cacheKey)) {return null;}if (isInfrastructureClass(beanClass) || shouldSkip(beanClass, beanName)) {this.advisedBeans.put(cacheKey, Boolean.FALSE);return null;}}return null ;}
    
  2. AspectJAwareAdvisorAutoProxyCreator#shouldSkip
  3. AnnotationAwareAspectJAutoProxyCreator#findCandidateAdvisors
  4. BeanFactoryAspectJAdvisorsBuilder#buildAspectJAdvisors
  5. 获取Spring容器中被Aspect注解的bean, 通过ReflectiveAspectJAdvisorFactory#getAdvisors获取Advisor
    MetadataAwareAspectInstanceFactory factory =new BeanFactoryAspectInstanceFactory(this.beanFactory, beanName);
    List<Advisor> classAdvisors = this.advisorFactory.getAdvisors(factory);
    
  6. ReflectiveAspectJAdvisorFactory#getAdvisors(factory)
    public List<Advisor> getAdvisors(MetadataAwareAspectInstanceFactory aspectInstanceFactory) {Class<?> aspectClass = aspectInstanceFactory.getAspectMetadata().getAspectClass();String aspectName = aspectInstanceFactory.getAspectMetadata().getAspectName();MetadataAwareAspectInstanceFactory lazySingletonAspectInstanceFactory =new LazySingletonAspectInstanceFactoryDecorator(aspectInstanceFactory);List<Advisor> advisors = new ArrayList<>();for (Method method : getAdvisorMethods(aspectClass)) {Advisor advisor = getAdvisor(method, lazySingletonAspectInstanceFactory, 0, aspectName);if (advisor != null) {advisors.add(advisor);}}
    }
    

生产代理对象

  1. AbstractAutoProxyCreator#postProcessAfterInitialization
     public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) {Object cacheKey = getCacheKey(bean.getClass(), beanName);if (this.earlyProxyReferences.remove(cacheKey) != bean) {return wrapIfNecessary(bean, beanName, cacheKey);}return bean;}
    
  2. AbstractAutoProxyCreator#wrapIfNecessary
    protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) {// Create proxy if we have advice.Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null);this.advisedBeans.put(cacheKey, Boolean.TRUE);Object proxy = createProxy(bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean));this.proxyTypes.put(cacheKey, proxy.getClass());return proxy;
    }
    
获取符合条件的Advisor集合
  1. AbstractAdvisorAutoProxyCreator#getAdvicesAndAdvisorsForBean
    protected Object[] getAdvicesAndAdvisorsForBean(Class<?> beanClass, String beanName, @Nullable TargetSource targetSource) {List<Advisor> advisors = findEligibleAdvisors(beanClass, beanName);if (advisors.isEmpty()) {return DO_NOT_PROXY;}return advisors.toArray();
    }
    
  2. AbstractAdvisorAutoProxyCreator#findEligibleAdvisors
    protected List<Advisor> findEligibleAdvisors(Class<?> beanClass, String beanName) {List<Advisor> candidateAdvisors = findCandidateAdvisors();List<Advisor> eligibleAdvisors = findAdvisorsThatCanApply(candidateAdvisors, beanClass, beanName);extendAdvisors(eligibleAdvisors);if (!eligibleAdvisors.isEmpty()) {eligibleAdvisors = sortAdvisors(eligibleAdvisors);}return eligibleAdvisors;
    }
    
  3. AbstractAdvisorAutoProxyCreator#findAdvisorsThatCanApply
    protected List<Advisor> findAdvisorsThatCanApply(List<Advisor> candidateAdvisors, Class<?> beanClass, String beanName) {ProxyCreationContext.setCurrentProxiedBeanName(beanName);try {return AopUtils.findAdvisorsThatCanApply(candidateAdvisors, beanClass);}finally {ProxyCreationContext.setCurrentProxiedBeanName(null);}
    }
    
创建代理对象
  1. AbstractAdvisorAutoProxyCreator#createProxy
http://www.lryc.cn/news/181934.html

相关文章:

  • C语言 —— 函数栈帧的创建和销毁
  • Appleid苹果账号自动解锁改密(自动解锁二验改密码)
  • Conflicting peer dependency: eslint@8.50.0
  • Vue3 defineProps使用
  • 机器学习7:逻辑回归
  • 生活小记-纸张尺寸
  • 【MATLAB源码-第41期】基于压缩感知算法的OFDM系统信道估计和LS算法对比仿真。
  • 优思学院|六西格玛将烹饪和美味提升至极致
  • git stash
  • Flink Data Source
  • 怒刷LeetCode的第23天(Java版)
  • Golang 中的调试技巧
  • linux 监控内存利用率
  • 43 验证二叉搜索树
  • 深度学习笔记之微积分及绘图
  • java Spring Boot按日期 限制大小分文件记录日志
  • CSS 语法
  • Vue3+TS+ECharts5实现中国地图数据信息显示
  • PowerShell 内网不能直接安装SqlServer模块的处理办法
  • Git使用【下】
  • 自然语言处理的分类
  • Flutter笔记:手写并发布一个人机滑动验证码插件
  • RabbitMQ安装与简单使用
  • 不做静态化,当部署到服务器上的项目刷新出现404【已解决】
  • SpringBoot结合Redisson实现分布式锁
  • css字体属性
  • 云原生微服务治理 第四章 Spring Cloud Netflix 服务注册/发现组件Eureka
  • 【白细胞介素6(IL-6)】
  • 设计模式之抽象工厂模式--创建一系列相关对象的艺术(简单工厂、工厂方法、到抽象工厂的进化过程,类图NS图)
  • 大数据-玩转数据-Flink SQL编程实战 (热门商品TOP N)