概要介绍:
spring aop是使用自己实现的动态代理来完成AOP的,有jdk动态代理,也有cglib。之所以引用了aspectj,主要是使用了其中的注解,并未用到其核心功能。
核心代码:
AbstractAutoProxyCreator.postProcessBeforeInstantiation()#267
Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(beanClass, beanName, targetSource); Object proxy = createProxy(beanClass, beanName, specificInterceptors, targetSource);
getAdvicesAndAdvisorsForBean是去找到使用了拦截配置的bean,核心代码如下:
BeanFactoryAspectJAdvisorsBuilder.buildAspectJAdvisors()#104
if (this.advisorFactory.isAspect(beanType))
判断是不是使用了@Aspect注解
再对所有拦截器进行排序
if (!eligibleAdvisors.isEmpty()) { eligibleAdvisors = sortAdvisors(eligibleAdvisors); }
至此查找所有aop拦截器的过程完成,接下来就是下一行createProxy,核心代码如下:
proxyFactory.getProxy(getProxyClassLoader());
很简单,就是在类加载时去创建代理类,可以从源码中看到只有两种实现:
CglibAopProxy(ObjenesisCglibAopProxy)、JdkDynamicAopProxy。
大体流程:
SPRING 通过注解实现AOP的过程的文字描述 - xml配置文件中声明自动发现注解(),spring默认启动时会注册注解解析器(AspectJAutoProxyBeanDefinitionParser),在注解解析器解析(parse)的过程中,会注册一个实现了BeanPostProcessor的后处理器(AspectJAwareAdvisorAutoProxyCreator),这个后处理器在目标对象实例化后进行拦截处理,拦截的流程是,先搜索所有已经注册的BeanDefiniton,从中找到标记了注解(@Aspect)的切面组成拦截器链,选择那些可以应用到目标对象的拦截器(过滤),如果拦截器链不为空,则为目标对象生成代理(JdkDynamicAopProxy或CglibAopProxy),当调用目标对象的指定拦截方法时,就会默认调用对应代理类的代理方法(invoke),这样就完成了AOP的整个流程。
------------------------------------------------------
原文:https://blog.csdn.net/c_unclezhang/article/details/78769426
参考:
【Spring源码分析-深入浅出AOP(图文分析)】
https://blog.csdn.net/c_unclezhang/article/details/78769426
PS:详细,相当详细
【AspectJ用法分析】
https://blog.mythsman.com/2017/12/21/1/
PS:重点讲了aspectj,便于对AOP有个整体的认识。
【spring AOP的实现原理】
https://www.cnblogs.com/CHENJIAO120/p/7080790.html
相关推荐
Spring容器高级主题 第6章 Spring AOP基础 第7章 基于@AspectJ和Schema的 第7章 AOP 第3篇 数据库访问 第8章 Spring对DAO的支持 第9章 Spring的事务管理 第10章 使用Spring JDBC访问数据库 ...
其次,Spring框架是一个全面的后端解决方案,它不仅仅是一个MVC框架,还是一个依赖注入(DI)和面向切面编程(AOP)的容器。Spring的核心是IoC(Inversion of Control),它允许开发者通过配置文件或注解来控制对象...
3. Spring AOP:提供面向切面编程支持,用于处理横切关注点。 4. Spring ORM:支持对象关系映射,包括对Hibernate和JDBC的封装。 5. Spring Web:提供了基于Spring的Web应用容器。 6. Spring Web MVC:提供了一套...
Spring的AOP模块提供了实现面向切面编程的能力。这一章会介绍如何定义和应用切面,包括通知(advises)、切点(pointcuts)以及如何利用AOP进行事务管理,提高代码的复用性和可维护性。 3. **Chapter 12:Spring ...
例如,Spring框架是Java集成开发中常用的工具,它提供了全面的企业应用开发解决方案,包括依赖注入、AOP(面向切面编程)、数据访问、事务管理等。 在这个压缩包中,可能包含的子文件可能涵盖以下几个方面: 1. **...
4. **Spring框架**:Spring是Java企业级应用开发的重要框架,涵盖了IoC(控制反转)、AOP(面向切面编程)、数据访问、Web应用以及Spring Boot和Spring Cloud等子项目,是Java集成开发中的核心部分。 5. **数据库...
Spring是一个强大的Java企业级应用开发框架,以其依赖注入(DI)和面向切面编程(AOP)闻名。这两份文档可能详细介绍了Spring的IoC容器、数据访问、事务管理、MVC模块等内容,是学习Spring的绝佳起点。 `深入浅出...
在软件工程实践中,JSP通常与其他框架结合使用,如Spring MVC和Struts,这些框架提供了更高级的功能,如依赖注入、AOP(面向切面编程)和异常处理。书中可能也会讨论如何将JSP与这些框架集成,以提高开发效率和代码...
7. **Spring框架**:Spring是Java开发中最常用的框架之一,它提供依赖注入、AOP(面向切面编程)、事务管理等功能,极大地简化了企业级应用的开发。 8. **MVC模式**:Model-View-Controller模式是Web应用开发的经典...
Spring是一个全面的后端框架,包含《Spring 技术手册》和《Spring 专业开发指南》,用于学习依赖注入、AOP等。Hibernate是对象关系映射(ORM)工具,有《精通 Hibernate》和《深入浅出 Hibernate》等书籍,帮助...