SpringAOP[7]-基础的自动代理(AnnotationAwareAspectJAutoProxyCreator)
原文:SpringAOP联盟(7)-基础的自动代理(AnnotationAwareAspectJAutoProxyCreator) - 简书 (jianshu.com)
DefaultAdvisorAutoProxyCreator
和AspectJAwareAdvisorAutoProxyCreator
均实现了AbstractAdvisorAutoProxyCreator
接口。
自动代理实现的核心:在Spring容器中,bean找到“合格”Advisor。
在上文中可知,寻找Bean上“合格”的Advisors是AbstractAutoProxyCreator定义的抽象getAdvicesAndAdvisorsForBean
方法。具体逻辑由子类实现。
而真正实现被代理类
与增强器
解耦的自动代理器
,实际上是AbstractAdvisorAutoProxyCreator
去完成的。
AbstractAdvisorAutoProxyCreator寻找“合格”Advisor,那么它眼中的合格是什么样子的呢?
- 子类是否允许:子类可实现
isEligibleAdvisorBean(beanName)
方法,对Spring容器中所有的Advisor
类进行初次筛选。 - Advisor是否切入了Bean:每个Advisor(增强器)会根据Pointcut(切点)使用ClassFilter判断被代理类是否满足规则;使用MethodMatcher判断被代理类是否有方法满足规则;
当然在获得Bean上合格
的Advisors后,Spring允许子类进行扩展
和排序
。

InfrastructureAdvisorAutoProxyCreator——基建的自动生成器
测试方法
@Slf4j public class TService { public void run1() { System.out.println("This is a run1() Method!"); } @Transactional public void say() { log.info("说话..."); } }
@Configuration @EnableTransactionManagement//注册了ProxyTransactionManagementConfiguration public class MyConfig { @Bean("tService") public TService tService() { return new TService(); } }
public class TestSpringProxy { public static void main(String[] args) { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MyConfig.class); //可以使用@Primary指定元素,或直接使用name名获取。 TService bean = (TService)applicationContext.getBean("tService"); bean.say(); } }
源码分析
InfrastructureAdvisorAutoProxyCreator
实现了isEligibleAdvisorBean(beanName)
方法,即检索出Spring
中符合“要求”所有的Advisor
。public class InfrastructureAdvisorAutoProxyCreator extends AbstractAdvisorAutoProxyCreator { @Nullable private ConfigurableListableBeanFactory beanFactory; @Override protected void initBeanFactory(ConfigurableListableBeanFactory beanFactory) { super.initBeanFactory(beanFactory); this.beanFactory = beanFactory; } //在Spring容器中获取Advisor的Bean,然后判断是否是内部的bean对象。 @Override protected boolean isEligibleAdvisorBean(String beanName) { return (this.beanFactory != null && this.beanFactory.containsBeanDefinition(beanName) && this.beanFactory.getBeanDefinition(beanName).getRole() == BeanDefinition.ROLE_INFRASTRUCTURE); } }
而实际上,事务的Advisor和Advice均由Spring完成注册。
@Configuration public class ProxyTransactionManagementConfiguration extends AbstractTransactionManagementConfiguration { //注册了Advisor @Bean(name = TransactionManagementConfigUtils.TRANSACTION_ADVISOR_BEAN_NAME) @Role(BeanDefinition.ROLE_INFRASTRUCTURE) //声明的role为基础类(Spring内部使用的类) public BeanFactoryTransactionAttributeSourceAdvisor transactionAdvisor() { BeanFactoryTransactionAttributeSourceAdvisor advisor = new BeanFactoryTransactionAttributeSourceAdvisor(); advisor.setTransactionAttributeSource(transactionAttributeSource()); advisor.setAdvice(transactionInterceptor()); if (this.enableTx != null) { advisor.setOrder(this.enableTx.<Integer>getNumber("order")); } return advisor; } @Bean @Role(BeanDefinition.ROLE_INFRASTRUCTURE) public TransactionAttributeSource transactionAttributeSource() { return new AnnotationTransactionAttributeSource(); } //注册了Advice @Bean @Role(BeanDefinition.ROLE_INFRASTRUCTURE) public TransactionInterceptor transactionInterceptor() { TransactionInterceptor interceptor = new TransactionInterceptor(); interceptor.setTransactionAttributeSource(transactionAttributeSource()); if (this.txManager != null) { interceptor.setTransactionManager(this.txManager); } return interceptor; } }
分类:
SpringBoot
标签:
SpringAOP
, SpringBoot
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
2018-11-16 NumPy库