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;
	}
相关推荐
大鸡腿同学9 小时前
【成长类】《只有偏执狂才能生存》读书笔记:程序员的偏执型成长地图
后端
0xDevNull9 小时前
MySQL数据冷热分离详解
后端·mysql
一定要AK9 小时前
Spring 入门核心笔记
java·笔记·spring
A__tao9 小时前
Elasticsearch Mapping 一键生成 Java 实体类(支持嵌套 + 自动过滤注释)
java·python·elasticsearch
AI袋鼠帝9 小时前
OpenClaw(龙虾)最强开源对手!Github 40K Star了,又一个爆火的Agent..
后端
KevinCyao9 小时前
java视频短信接口怎么调用?SpringBoot集成视频短信及回调处理Demo
java·spring boot·音视频
凯尔萨厮9 小时前
创建SpringWeb项目(Spring2.0)
spring·mvc·mybatis
迷藏4949 小时前
**发散创新:基于Rust实现的开源合规权限管理框架设计与实践**在现代软件架构中,**权限控制(RBAC)** 已成为保障
java·开发语言·python·rust·开源
wuxinyan12310 小时前
Java面试题47:一文深入了解Nginx
java·nginx·面试题
新知图书10 小时前
搭建Spring Boot开发环境
java·spring boot·后端