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;
	}
相关推荐
小白|2 分钟前
cmake:昇腾CANN构建系统完全指南
java·c++·算法
weixin_512976177 分钟前
Java 面试宝典 Beta5.0
java
Ting-yu10 分钟前
Spring AI Alibaba零基础速成(5) ---- Memory(记忆)
java·人工智能·后端·spring
月落归舟12 分钟前
一文掌握Spring AOP:从入门到底层原理
java·后端·spring
QuZhengRong15 分钟前
【Luck-Report】缓存
java·前端·后端·vue·excel
XiYang-DING27 分钟前
【Spring】SpringMVC
java·后端·spring
想学习java初学者28 分钟前
SpringBoot整合GS1编码解码
java·spring boot·后端
日月云棠29 分钟前
2 快速入门实战指南
java·后端
日月云棠30 分钟前
3 Dubbo 2.7 高级配置:检查控制、版本策略与协议选择
java·后端
砍材农夫36 分钟前
物联网 基于netty构建mqtt协议规范(主题通配符订阅)
java·前端·javascript·物联网·netty