spring是如何组织切面的

一、关键点理解

如果有切面,spring会为对象生成代理对象,如果一个对象匹配多个切面,还是只生成一个代理对象。

一个代理对象对应一个 {@link org.springframework.aop.framework.Advised},每个代理对象持有一个AdvisedSupport。

一个advised,包含一个List<Advisor>。

一个Advisor,包含一个Pointcut,一个Advice。

一类注解对应一个Advisor,一个切面对应一个Advisor,所以项目中advisor并不会很多

二、关键源码

1、AbstractAutoProxyCreator#postProcessAfterInitialization()

java 复制代码
	public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) {
		if (bean != null) {
			Object cacheKey = getCacheKey(bean.getClass(), beanName);
			if (this.earlyProxyReferences.remove(cacheKey) != bean) {
				return wrapIfNecessary(bean, beanName, cacheKey);
			}
		}
		return bean;
	}
java 复制代码
// bean是原始对象,	

protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) {
		if (StringUtils.hasLength(beanName) && this.targetSourcedBeans.contains(beanName)) {
			return bean;
		}
		if (Boolean.FALSE.equals(this.advisedBeans.get(cacheKey))) {
			return bean;
		}
		if (isInfrastructureClass(bean.getClass()) || shouldSkip(bean.getClass(), beanName)) {
			this.advisedBeans.put(cacheKey, Boolean.FALSE);
			return bean;
		}

		// Create proxy if we have advice.
		Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null);
		if (specificInterceptors != DO_NOT_PROXY) {
			this.advisedBeans.put(cacheKey, Boolean.TRUE);
			Object proxy = createProxy(
					bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean));
			this.proxyTypes.put(cacheKey, proxy.getClass());
			return proxy;
		}

		this.advisedBeans.put(cacheKey, Boolean.FALSE);
		return bean;
	}
相关推荐
ltl3 小时前
【大模型基础设施工程】22:大模型网关
后端
信徒_3 小时前
ID 生成技术选型
java
a8a3023 小时前
Laravel8.x新特性全解析
java·spring boot·后端
XiYang-DING3 小时前
【Java EE】CAS(Compare And Swap)
java·开发语言·java-ee
白露与泡影3 小时前
Spring Boot 完整流程
java·spring boot·后端
空中海4 小时前
第二章:Maven进阶篇 — 依赖管理与构建生命周期
java·maven
Mr.Rice.Fool4 小时前
rust面试经验1
后端·面试·职场和发展·rust
xun-ming4 小时前
AI时代Java程序员自救手册
java·开发语言·人工智能
DavidSoCool4 小时前
GB28181 PTZCmd 完整指令对照表(8 位 16 进制)+ 详细注释 + 使用说明
java·sip·gb28181