Spring源码-AOP

1、spring aop和aspectJ什么关系?

  1. aop是编程思想,spring aop被aspectJ都是aop思想的具体实现。
  2. spring aop为了不重复造轮子,通过一定的取舍选取了aspectJ中适合自己的注解。spring初期版本的aop只支持通过实现aop接口的方式来实现切面增强,后续版本增加支持XML配置方式,最新版本支持aspect的相关注解来定义切面。

2、spring aop的aspect注解引入

  1. spring通过@EnableAspectJAutoProxy注解,采用@import+ImportBeanDefinitionRegistrar方式将AnnotationAwareAspectJAutoProxyCreator.class类注册到容器。
  2. AnnotationAwareAspectJAutoProxyCreator实现了SmartInstantiationAwareBeanPostProcessor接口,通过重新BeanPostProcessor的postProcessBeforeInstantiation方法来做aop增强处理。

注:想要向spring容器注入自己的类对象除了这种方式外,还可以通过bean定义后置增强处理器BeanDefinitionRegistryPostProcessor进行注册。

class AspectJAutoProxyRegistrar implements ImportBeanDefinitionRegistrar {/*** Register, escalate, and configure the AspectJ auto proxy creator based on the value* of the @{@link EnableAspectJAutoProxy#proxyTargetClass()} attribute on the importing* {@code @Configuration} class.*/@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry);AnnotationAttributes enableAspectJAutoProxy =AnnotationConfigUtils.attributesFor(importingClassMetadata, EnableAspectJAutoProxy.class);if (enableAspectJAutoProxy != null) {if (enableAspectJAutoProxy.getBoolean("proxyTargetClass")) {AopConfigUtils.forceAutoProxyCreatorToUseClassProxying(registry);}if (enableAspectJAutoProxy.getBoolean("exposeProxy")) {AopConfigUtils.forceAutoProxyCreatorToExposeProxy(registry);}}}}

AbstractAutoProxyCreator#postProcessBeforeInstantiation源码:

@SuppressWarnings("serial")
public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupportimplements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware {
@Overridepublic 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;}}// Create proxy here if we have a custom TargetSource.// Suppresses unnecessary default instantiation of the target bean:// The TargetSource will handle target instances in a custom fashion.TargetSource targetSource = getCustomTargetSource(beanClass, beanName);if (targetSource != null) {if (StringUtils.hasLength(beanName)) {this.targetSourcedBeans.add(beanName);}Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(beanClass, beanName, targetSource);Object proxy = createProxy(beanClass, beanName, specificInterceptors, targetSource);this.proxyTypes.put(cacheKey, proxy.getClass());return proxy;}return null;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/50536.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nginx 最常用的命令

目录 一、Nginx 安装与配置 1.1 下载与安装 1.2 配置文件 二、Nginx 基本操作 2.1 启动与停止 2.2 重启与重新加载 三、日志管理 3.1 访问日志 3.2 错误日志 四、虚拟主机管理 4.1 配置虚拟主机 4.2 管理虚拟主机 五、性能优化 5.1 缓存配置 5.2 连接优化 Nginx…

Redis(三)

1. java连接redis java提高连接redis的方式jedis. 我们需要遵循jedis协议。 引入依赖 <!--引入java连接redis的驱动--><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.3.1</version&g…

Android Framework 之AMS

它管理了系统的四大组件:Activity、Service、ContentProvider、Broadcast。 它除了管理四大组件外&#xff0c;同时也负责管理和调度所有的进程 AMS相关目录结构 AMS代码主要在下面几个目录(AndroidQ上AMS相关部分功能移到了wm下)&#xff1a; frameworks/base/core/java/andro…

记录|LabVIEW从0开始

目录 前言一、表达式节点和公式节点二、脚本与公式2.1 公式 三、Excel表格3.1 位置3.2 案例&#xff1a;波形值存入Excel表中3.3 案例&#xff1a;行写入&#xff0c;列写入 四、时间格式化4.1 获取当前时间4.2 对当前时间进行格式化 更新时间 前言 参考视频&#xff1a; LabVI…

【STL】之 vector 使用方法及模拟实现

前言&#xff1a; 本文主要讲在C STL库中vector容器的使用方法和底层的模拟实现~ 成员变量的定义&#xff1a; 对于vector容器&#xff0c;我们首先采用三个成员变量去进行定义&#xff0c;分别是&#xff1a; private:iterator _start; // 指向数据块的开始iterator _finish…

React类组件生命周期与this关键字

类组件生命周期 参考链接 一图胜千言&#xff08;不常用的生命周期函数已隐藏&#xff09; 代码&#xff1a; //CC1.js import { Component } from "react";export default class CC1 extends Component {constructor(props) {super(props);console.log("con…

【Vue3】watchEffect

【Vue3】watchEffect 背景简介开发环境开发步骤及源码 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日子。本文…

【代码随想录第37天| 完全背包,518. 零钱兑换 II ,377. 组合总和 Ⅳ,70. 爬楼梯 (进阶)】

完全背包 完全背包中&#xff0c;每件物品都有无数件&#xff1b;这主要影响了遍历背包容量时的遍历顺序&#xff0c;应该从小到大去遍历&#xff0c;这样才能包括有多件相同物品的情况。 思路 先遍历物品&#xff0c;再遍历背包 for(int i 0; i < weight.size(); i) {…

pnpm 设置国内源

pnpm config set registry https://registry.npmmirror.com/

16、DDD系列-向微服务迈进

在本章中&#xff0c;我们将探讨如何从传统的单体架构向微服务架构演进。这个过程需要考虑许多因素&#xff0c;包括微服务的驱动力、所需条件、服务粒度的确定以及系统复杂性的治理。 1、目的&#xff1a;微服务的驱动力 微服务的主要驱动力是业务需求的快速变化和系统的可扩…

[Mysql-数据库基本知识了解]

为什么学习数据库&#xff1f; 数据的保存&#xff1a; 大量程序产生的数据在程序 运行时和程序结束运行后 数据应该怎么保存&#xff1f; 数据的完整性 &#xff1a;数据和数据之间的结构关系&#xff0c; 数据和程序之间的依赖关系&#xff0c; 如何能让这些关系持久维系…

C++初学(7)

7.1、字符串 字符串是存储在内存的连续字节中的一系列字符。C处理字符串的方式有两种&#xff0c;第一种是来自C语言&#xff0c;常被称为C风格字符串&#xff0c;另一种则是基于string类库的方法。 存储在连续字节中的一系列字符意味着可以将字符存储在char数组中&#xff0…

微信小程序开发 快速学习 这篇就够了

目录 一、配置篇 &#xff08;1&#xff09;官网链接&#xff1a; &#xff08;2&#xff09;项目分析 &#xff08;3&#xff09;调试器 &#xff08;4&#xff09;预览体验 &#xff08;5&#xff09;配置文件 &#xff08;6&#xff09;配置pages &#xff08;7&…

vue3组件通信(二)

组件通信 一.$attrs(祖>孙间接&#xff09;二、$refs()父>子&#xff0c; $parent()子>父三.provide&#xff0c;inject(祖>孙直接&#xff09;四.pinia五.slot1.默认插槽2.具名插槽3.作用域插槽 一.$attrs(祖>孙间接&#xff09; $attrs用于实现当前组件的父组…

实习心得—20240725

在实习的过程中&#xff0c;遇到了很多问题&#xff0c;对于fpga开发来说&#xff0c;我一开始值懂得一些皮毛&#xff0c;仅限于读懂代码或者写一些简单的代码&#xff0c;当接触到一个大的项目的时候&#xff0c;我发现很多事情并不是想象中的那么容易。 一个大的项目是由许…

CSRF Token 原理

CSRF 攻击 CSRF 攻击成功的关键是&#xff0c;恶意网站让浏览器自动发起一个请求&#xff0c;这个请求会自动携带 cookie &#xff0c;正常网站拿到 cookie 后会认为这是正常用户&#xff0c;就允许请求。 防范 如果在请求中加一个字段&#xff08;CSRF Token&#xff09;&am…

鸿蒙开发—黑马云音乐之Music页面

目录 1.外层容器效果 2.信息区-发光效果 3.信息区-内容布局 4.播放列表布局 5.播放列表动态化 6.模拟器运行并配置权限 效果&#xff1a; 1.外层容器效果 Entry Component export struct MuiscPage {build() {Column() {// 信息区域Column() {}.width(100%)// .backgroun…

kubernetes管理GUI工具Lens

从github上可以知道&#xff0c;lens的前端是用electron做的客户端工具&#xff0c;打开安装路径你会发现kubectl.exe,没错&#xff0c;就是你经常用的kubectl命令行的客户端工具。kubectl本来就能输出json的数据类型&#xff0c;集成前端更方便了。看到这里你是不是发现&#…

MATLAB学习日志DAY23

创建矩阵 MATLAB 提供了许多函数&#xff0c;用于创建各种类型的矩阵。 例如&#xff0c;可以使用基于帕斯卡三角形的项创建一个对称矩阵&#xff1a; A pascal(3) A 1 1 1 1 2 3 1 3 6 也可以创建一个非对称幻方矩阵&#xff0c;它的行总和与列总和相等&#xff1a; B…

操作系统(系统简介、库文件、环境变量、编译器、系统特性)

一、UNIX系统介绍 诞生于1971年美国AT&T公司的贝尔实验室&#xff0c;主要开发者是丹尼斯.里奇、肯.汤普逊。 该系统的主要特点是支持多用户、多任务&#xff0c;并支持多种处理器架构&#xff0c;同时具有高安全性、高可靠性、高稳定性&#xff0c;既可以构建大型关键业…