Spring AOP原理分析

本文介绍Spring AOP的基础概念及其实现方式,包括基于代理的AOP、纯Java对象切面、@Aspect注解形式及注入形式的Aspect切面,并详细解析了Spring AOP的原理和技术细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

AOP基础概念

目标类(Target)

代理(Proxy)

连接点(Joinpoint)

切点(Pointcut)

通知(Advice):增加的功能

切面(Aspect):切点 + 通知

织入(Weaving):增强目标类的方法

引入(Introduction):增加新方法、属性

Spring AOP使用方式

1、基于代理的AOP

<!-- 切面=通知+切点 -->
<bean id="myAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="advice" ref="myAdvice"/>
<property name="pointcut" ref="myPointcut"/>
</bean>

<!-- 定义代理对象 -->
<bean id="aopProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="targetObject"/>
<property name="interceptorNames" value="myAdvisor"/>
</bean> 

2、纯简单Java对象切面

public class MyAdvice implements MethodBeforeAdvice

<bean id ="myAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
  <property name="advice" ref="myAdvice"></property>
  <property name="pattern" value=".*test"/>
</bean>

<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>

3@Aspect注解形式的

@Aspect
@Component
public class MyAspect {
    @Before("pointcut()")
    public void advice() {
        System.out.println("before advice");
    }

    @Pointcut("execution(* cn.zj90..*.*(..))")
    public void pointcut() {
    }
}

<aop:aspectj-autoproxy  proxy-target-class="true" />

4、注入形式的Aspcet切面

<aop:config>
  <aop:aspect ref="myAspect">
    <aop:before method="advice" pointcut="execution(* cn.zj90..*.*(..))"/>
  </aop:aspect>
</aop:config>

 Spring AOP原理

使用到的类

ProxyFactoryBean

DefaultAopProxyFactory

JdkDynamicAopProxy

ObjenesisCglibAopProxy

 

JdkDynamicAopProxy

实现了InvocationHandler接口,JDK动态代理的使用如下

Proxy.newProxyInstance(ClassLoader loader,
          Class<?>[] interfaces,
          InvocationHandler h)

invoke方法的实现

 

调用流程

时序图

初始化通知器链,然后获取目标对象的代理,如果目标类实现接口则获取JDK动态代理,否则获取Cglib代理

参考

http://blog.youkuaiyun.com/udbnny/article/details/5870076

转载于:https://www.cnblogs.com/zj90/p/7669134.html

### Spring AOP 实现原理及源码解析 Spring AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的一个重要特性,用于将横切关注点与业务逻辑分离。以下是关于Spring AOP实现原理及源码解析的详细说明: #### 1. AOP 的核心概念 在Spring AOP中,以下几个核心概念是理解其实现的关键: - **切面(Aspect)**:包含切入点和通知的类。 - **切入点(Pointcut)**:定义了连接点的具体位置。 - **通知(Advice)**:在特定的连接点执行的操作,如前置通知、后置通知等。 - **连接点(Join Point)**:程序执行过程中的某个点,例如方法调用或异常抛出。 - **代理(Proxy)**:通过动态代理机制创建的目标对象的代理对象。 #### 2. Spring AOP 的实现方式 Spring AOP 的实现依赖于两种主要的代理技术: - **JDK 动态代理**:适用于实现了接口的目标对象,通过反射机制生成代理类。 - **CGLIB 代理**:适用于没有实现接口的目标对象,通过字节码操作生成目标对象的子类。 在Spring中,`DefaultAopProxyFactory` 类会根据目标对象是否有接口来决定使用哪种代理方式[^4]。 #### 3. 源码分析 以下是Spring AOP实现的核心流程及其源码分析: ##### 3.1 切面注册 当使用 `@EnableAspectJAutoProxy` 注解时,Spring会引入 `AspectJAutoProxyRegistrar` 类,并在容器启动时调用 `registerBeanDefinitions()` 方法。该方法的主要作用是动态向Spring容器中注册与AOP相关的组件[^3]。 ##### 3.2 通知器链的构建 在AOP代理对象创建过程中,`ProxyFactoryBean` 会调用 `initializeAdvisorChain()` 方法来构建通知器链。此方法会遍历所有已注册的通知器,并将其按顺序组织成一个链表结构[^4]。 ##### 3.3 代理对象的生成 `DefaultAopProxyFactory` 的 `createAopProxy()` 方法负责生成代理对象。具体步骤如下: 1. 判断目标对象是否有接口,如果有则使用JDK动态代理,否则使用CGLIB代理。 2. 创建代理对象并为其绑定通知器链。 3. 在代理对象的方法调用时,拦截请求并执行相应的通知逻辑。 以下是一个简单的代码示例,展示如何使用Spring AOP: ```java @Aspect @Component public class LoggingAspect { @Before("execution(* com.example.service.*.*(..))") public void logBefore(JoinPoint joinPoint) { System.out.println("Method " + joinPoint.getSignature().getName() + " is called."); } } ``` ##### 3.4 通知逻辑的执行 当代理对象的方法被调用时,Spring会根据通知器链的顺序依次执行通知逻辑。例如,在方法执行前触发前置通知,在方法执行后触发后置通知。 #### 4. 总结 Spring AOP 的实现基于动态代理技术,通过切面、切入点和通知的概念将横切关注点从业务逻辑中分离出来。其核心源码涉及切面注册、通知器链构建以及代理对象的生成等关键步骤[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值