死磕Spring AOP系列1:编程式实现AOP

简介:

这个系列是AOP源码分析级别的文章。由于现在AOP已经不是什么高深的技术,网上的例子也比比皆是,不论是xml schema,还是annotation声明式。相信用过Spring的朋友,都可以信手拈来。

本系列文章的原则

  1. 如何配置AOP不是重点

  2. AOP相关概念讲解不是重点

  3. AOP 底层代码设计才是重点

本篇的主要内容

  1. 认识ProxyFactory,并通过该工厂类,将“日志”和“安全校验”代码切入到业务逻辑中

  2. 分析代理对象的实现流程。

  3. 认识ProxyFactory相关对象



1.使用ProxyFactory,实现"AOP"效果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/**
  *模拟业务接口
  */
public  interface  UserService {
     public  void  updateUser();
}
 
/**
  *模拟具体业务
  */
public  class  UserServiceImpl  implements  UserService{
 
     @Override
     public  void  updateUser() {
         System.out.println( "$$$$$$执行业务逻辑$$$$$" );
     }
}
 
/**
  * 模拟切面1
  */
public  class  SecurityInterceptor  implements  MethodInterceptor {
     @Override
     public  Object invoke(MethodInvocation methodInvocation)  throws  Throwable {
         System.out.println( "==========执行安全校验====================" );
         return  methodInvocation.proceed();
     }
}
 
/**
  * 模拟切面2
  */
public  class  LoggerBeforeAdvice  implements  MethodBeforeAdvice {
     @Override
     public  void  before(Method method, Object[] args, Object target)  throws  Throwable {
         System.out.println( "=======保存更新日志=========" );
     }
}


Main类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public  static  void  main(String[] args) {
     //1.初始化源对象(一定要实现接口)
     UserService target = new  UserServiceImpl();
     //2.AOP 代理工厂
     ProxyFactory pf =  new  ProxyFactory(target);
     //3.装配Advice
     pf.addAdvice( new  SecurityInterceptor());
     //pf.addAdvice(new LoggerBeforeAdvice());
     pf.addAdvisor( new  DefaultPointcutAdvisor( new  LoggerBeforeAdvice()));
     ////4.获取代理对象
     UserService proxy =(UserService)pf.getProxy();
     //5.调用业务
     proxy.updateUser();
}

输出结果

==========执行安全校验====================
=======保存更新日志=========
$$$$$$执行业务逻辑$$$$$


通过结果确认,通过编程的方式实现了AOP切入的效果。逻辑很简单,无需过多解释。把重点放到ProxyFactory对象上。下面,重点分析下ProxyFactory。

2.分析ProxyFactory

wKioL1dQR2HAcFXEAABux8L80Z4236.png


ProxyFactory继承了ProxyCreatorSupport类,持有了AopProxyFactory,AdvisorChainFactory,

List<Advisor>。等



作用
AopProxyFactory 基于 AdvisedSupport 配置信息,生成AOP 代理对象.默认为“DefaultAopProxyFactory
AdvisorChainFactory advisor链。默认实现为DefaultAdvisorChainFactory,只有一个方法,获取Advised满足条件的MethodInterceptor列表或DynamicInterceptionAdvice列表
Advisor 持有AOP advice和filter
ProxyConfig
生成代理对象的配置元信息

3.AOP重点接口大杂烩

3.1Advice&Interceptor

wKiom1dQSz7D--fAAAAy0HpjvGI119.png

Interceptor VS Advice

Advice是AOP编程中某一个方面(Aspect)在某个连接点(JoinPoint)所执行的特定动作,这个连接点(JoinPoint)可以是自 定义的;而Spring中的Interceptor更多关注程序运行时某些特定连接点(属性访问,对象构造,方法调用)时的动作。确切的 说,Interceptor的范围更窄一些。

3.2 PointCut&Advisor

wKiom1dQTUuwsTKjAABGdxR8uqc708.png

概念列表

Terms Description
Aspect
A module which has a set of APIs providing cross-cutting requirements. For example, a logging module would be called AOP aspect for logging. An application can have any number of aspects depending on the requirement.
Join point This represents a point in your application where you can plug-in AOP aspect. You can also say, it is the actual place in the application where an action will be taken using Spring AOP framework.
Advice This is the actual action to be taken either before or after the method execution. This is actual piece of code that is invoked during program execution by Spring AOP framework.
Pointcut This is a set of one or more joinpoints where an advice should be executed. You can specify pointcuts using expressions or patterns as we will see in our AOP examples.
Introduction An introduction allows you to add new methods or attributes to existing classes.
Target object The object being advised by one or more aspects, this object will always be a proxied object. Also referred to as the advised object.
Weaving Weaving is the process of linking aspects with other application types or objects to create an advised object. This can be done at compile time, load time, or at runtime.

3.4Proxy&ProxyFactory

wKiom1dQTsySiRwNAAAjgjDsxmo266.png

4. ProxyFactory底层实现设计

弄清楚ProxyFactory的底层实现,也就基本上弄清了AOP的实现原理,不管使用XML Schema还是Annotation方式,归根结底核心就在这儿。主要差别,仅仅是使用PointCut差别而已。


Advisor是设计的核心元素,起到承上启下的作用,连接着Advice和Pointcut。默认实现是:DefaultPointCutAdvisor。需要知道2个接口ClassFilter,MethodMatcher,通过方法名,就可以判定他们的作用了,主要用在"匹配"上。

wKiom1dQT87z01lAAACpJxJJ9j4702.png


序列图

wKiom1dQT_uhGJ82AADfJFuvcQQ570.png

通过该序列图,可以清楚了解,代理的调用过程。整个过程就是围绕一个核心,构造匹配元素+反射调用。如果想搞清楚底层代理调用实现,可以看org.springframework.aop.framework .ReflectiveMethodInvocation。


接下来,将分析Spring Bean工厂是如何生成代理Bean的,以DefaultAdvisorAutoProxyCreator类为例,进行分析。




本文转自 randy_shandong 51CTO博客,原文链接:http://blog.51cto.com/dba10g/1785667,如需转载请自行联系原作者
相关文章
|
7月前
|
XML 安全 Java
使用 Spring 的 @Aspect 和 @Pointcut 注解简化面向方面的编程 (AOP)
面向方面编程(AOP)通过分离横切关注点,如日志、安全和事务,提升代码模块化与可维护性。Spring 提供了对 AOP 的强大支持,核心注解 `@Aspect` 和 `@Pointcut` 使得定义切面与切入点变得简洁直观。`@Aspect` 标记切面类,集中处理通用逻辑;`@Pointcut` 则通过表达式定义通知的应用位置,提高代码可读性与复用性。二者结合,使开发者能清晰划分业务逻辑与辅助功能,简化维护并提升系统灵活性。Spring AOP 借助代理机制实现运行时织入,与 Spring 容器无缝集成,支持依赖注入与声明式配置,是构建清晰、高内聚应用的理想选择。
714 0
|
8月前
|
Java API 开发者
Spring 控制反转与依赖注入:从玄学编程到科学管理
在传统开发中,手动`new`对象导致紧耦合、难以维护和测试。控制反转(IoC)将对象创建交给框架,实现解耦。Spring通过IOC容器自动管理对象生命周期,开发者只需声明依赖,无需关心创建细节。依赖注入(DI)是IoC的具体实现方式,支持构造器、Setter和字段注入。构造器注入推荐使用,保证依赖不可变且易于测试。对于多个同类型Bean,可用`@Qualifier`或`@Primary`解决冲突。此外,Spring还支持依赖查找(DL),开发者主动从容器获取Bean,适用于动态场景,但侵入性强。掌握IoC与DI,有助于构建灵活、可维护的Spring应用。
|
6月前
|
监控 Java Spring
AOP 切面编程
AOP(面向切面编程)通过动态代理在不修改源码的前提下,对方法进行增强。核心概念包括连接点、通知、切入点、切面和目标对象。常用于日志记录、权限校验、性能监控等场景,结合Spring AOP与@Aspect、@Pointcut等注解,实现灵活的横切逻辑管理。
1721 6
AOP 切面编程
|
6月前
|
XML Java 数据格式
《深入理解Spring》:AOP面向切面编程深度解析
Spring AOP通过代理模式实现面向切面编程,将日志、事务等横切关注点与业务逻辑分离。支持注解、XML和编程式配置,提供五种通知类型及丰富切点表达式,助力构建高内聚、低耦合的可维护系统。
|
8月前
|
监控 Java Spring
AOP切面编程快速入门
AOP(面向切面编程)通过分离共性逻辑,简化代码、减少冗余。它通过切点匹配目标方法,在不修改原方法的前提下实现功能增强,如日志记录、性能监控等。核心概念包括:连接点、通知、切入点、切面和目标对象。Spring AOP支持多种通知类型,如前置、后置、环绕、返回后、异常通知,灵活控制方法执行流程。通过@Pointcut可复用切点表达式,提升维护性。此外,结合自定义注解,可实现更清晰的切面控制。
657 5
|
8月前
|
人工智能 监控 安全
如何快速上手【Spring AOP】?核心应用实战(上篇)
哈喽大家好吖~欢迎来到Spring AOP系列教程的上篇 - 应用篇。在本篇,我们将专注于Spring AOP的实际应用,通过具体的代码示例和场景分析,帮助大家掌握AOP的使用方法和技巧。而在后续的下篇中,我们将深入探讨Spring AOP的实现原理和底层机制。 AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的核心特性之一,它能够帮助我们解决横切关注点(如日志记录、性能统计、安全控制、事务管理等)的问题,提高代码的模块化程度和复用性。
|
8月前
|
设计模式 Java 开发者
如何快速上手【Spring AOP】?从动态代理到源码剖析(下篇)
Spring AOP的实现本质上依赖于代理模式这一经典设计模式。代理模式通过引入代理对象作为目标对象的中间层,实现了对目标对象访问的控制与增强,其核心价值在于解耦核心业务逻辑与横切关注点。在框架设计中,这种模式广泛用于实现功能扩展(如远程调用、延迟加载)、行为拦截(如权限校验、异常处理)等场景,为系统提供了更高的灵活性和可维护性。
1010 0
|
9月前
|
Java Spring 容器
SpringBoot自动配置的原理是什么?
Spring Boot自动配置核心在于@EnableAutoConfiguration注解,它通过@Import导入配置选择器,加载META-INF/spring.factories中定义的自动配置类。这些类根据@Conditional系列注解判断是否生效。但Spring Boot 3.0后已弃用spring.factories,改用新格式的.imports文件进行配置。
1308 0
下一篇
开通oss服务