`

springAOP代理实现

阅读更多

继续上一篇

 

追踪了一下代码,找到了springAOP启动时注册的代理类

AnnotationAwareAspectJAutoProxyCreator 是处理切面xml配置spirngaop或者注解创建代理类的容器。

其父类AbstractAutoProxyCreator中根据配置的通知类型执行

postProcessBeforeInstantiation postProcessAfterInitialization 方法

 

然后调用wrapIfNecessary方法将需要切面的方法存入map advisedBeans

 

 

/**
* Wrap the given bean if necessary, i.e. if it is eligible for being proxied.
* @param bean the raw bean instance
* @param beanName the name of the bean
* @param cacheKey the cache key for metadata access
* @return a proxy wrapping the bean, or the raw bean instance as-is
*/
protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) {
if (beanName != null && this.targetSourcedBeans.containsKey(beanName)) {
returnbean;
}
if (Boolean.FALSE.equals(this.advisedBeans.get(cacheKey))) {
returnbean;
}
if (isInfrastructureClass(bean.getClass()) || shouldSkip(bean.getClass(), beanName)) {
this.advisedBeans.put(cacheKey, Boolean.FALSE);
returnbean;
}
 
// 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());
returnproxy;
}
 
this.advisedBeans.put(cacheKey, Boolean.FALSE);
returnbean;
 
}
 

 

 

 

其中

Object proxy = createProxy(bean.getClass(), beanNamespecificInterceptorsnew SingletonTargetSource(bean));

通过代理的方式将所要切面处理的对象代理出来

代理的方式分为JDK原声的代理,以及cglib

JDK:所代理的对象实现了接口

cglib:所代理的对象没有接口实现

 

至此,springaop代理对象已成功,

当调用到切点所在的方法时,反射代理对象的方法,

再根据通知的类型来执行代理对象的前后操作

调用JdkDynamicAopProxy类中的

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

。。。

方法

 

 

 

分享到:
评论

相关推荐

    反射实现 AOP 动态代理模式(Spring AOP 的实现原理)

    Spring框架中的AOP模块使用了动态代理来实现AOP概念。Spring AOP允许开发者定义切面,并在这些切面中指定拦截的方法。Spring AOP支持不同的代理策略,包括JDK动态代理和CGLIB代理。如果被代理的类没有实现接口,...

    反射实现 AOP 动态代理模式(Spring AOP 的实现 原理) - Java 例子 -

    总结来说,Spring AOP通过动态代理实现了面向切面编程,利用反射在运行时生成代理对象并插入通知代码。这种设计让开发者能够专注于业务逻辑,而不必关心横切关注点的实现细节,提高了代码的可维护性和复用性。理解...

    Spring AOP实现机制

    总之,Spring AOP通过代理技术实现了面向切面编程,使得开发者能够更专注于业务逻辑,而将通用的横切关注点剥离出来,提高了代码的可读性和可维护性。通过深入理解Spring AOP的实现机制,我们可以更好地利用这一强大...

    死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理(csdn)————程序.pdf

    在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态代理。 JDK 动态代理是基于接口的,它要求被代理的目标对象必须实现至少一个接口。Spring 使用 `java.lang.reflect.Proxy`...

    spring aop jar 包

    Spring默认使用运行时织入,通过动态代理实现。 6. **代理(Proxy)**:代理是AOP的核心,它是目标对象的增强版本,负责在调用目标方法前后执行通知。 在使用Spring AOP时,我们可以通过XML配置或注解的方式来定义...

    springAop默认代理方式.zip

    Spring AOP会为每个目标对象创建一个子类,并覆盖其方法,添加AOP代理逻辑。 4. **代理模式的创建**:Spring AOP 使用`org.springframework.aop.framework.ProxyFactoryBean`或`@EnableAspectJAutoProxy`注解来配置...

    springAOP配置动态代理实现

    动态代理则是Spring AOP实现的核心技术之一,它允许我们在运行时创建具有额外行为的对象。下面将详细阐述Spring AOP的配置以及动态代理的实现。 一、Spring AOP基础知识 1. **什么是AOP**:AOP是一种编程范式,...

    spring之AOP(动态代理)

    在Spring中,AOP主要通过两种动态代理技术实现:JDK动态代理和CGLIB动态代理。 首先,让我们详细了解一下JDK动态代理。JDK动态代理基于Java的接口实现,它适用于目标对象实现了至少一个接口的情况。在运行时,JDK...

    初探spring aop内部实现 java

    Spring AOP的实现主要依赖于两种技术:动态代理和AspectJ。对于接口,Spring使用Java动态代理(JDK Proxy)创建代理对象;而对于类,Spring则使用CGLIB库生成子类代理。这两种方式都是在运行时生成代理对象,从而在...

    Spring AOP 16道面试题及答案.docx

    Spring AOP代理是框架为实现切面功能创建的对象,它在运行时实现切面协议。Spring提供了两种代理方式:JDK动态代理和CGLIB代理。JDK代理适用于那些实现了接口的类,而CGLIB代理则适用于没有实现接口的类。 引介...

    Spring AOP框架实现的结构分析

    最后,本文的目标是从实现的角度来认识 SpringAOP 框架,观察的角度是从外部接口、内部实现、组成部分、执行过程四个方面来认识 SpringAOP 框架。本文的风格是首先列出 AOP 的基本概念,然后介绍框架所涉及到的核心...

    springAop的配置实现

    - **代理(Proxy)**:Spring AOP通过代理模式来实现切面功能,有JDK动态代理和CGLIB代理两种方式。 **2. JDK 动态代理** - 当目标类实现了接口时,Spring AOP会选择使用JDK动态代理。它会生成一个实现了目标类所有...

    一个简单的spring AOP的实现

    7. AOP代理(AOP Proxy):Spring提供了两种类型的代理,即JDK动态代理和CGLIB代理。JDK代理用于实现接口的类,而CGLIB代理则在没有接口的情况下创建目标对象的子类。 实现Spring AOP通常有两种方式: 1. 注解驱动...

    Spring AOP的简单实现

    在Spring配置中,我们需要开启AOP代理,以便Spring能够识别并处理切面。如果使用的是基于注解的配置,可以在`@Configuration`类中添加`@EnableAspectJAutoProxy`注解。 5. **装配切面** 最后,我们需要将`...

    简单spring aop 例子

    在Spring AOP中,切面主要通过两种方式实现:代理(Proxies)和织入(Weaving)。 1. **代理**:Spring AOP支持两种类型的代理:JDK动态代理和CGLIB代理。JDK代理用于实现了接口的类,而CGLIB代理则用于没有接口或...

    SpringAop学习笔记以及实现Demo

    1. **经典代理模式Demo**:演示了如何通过CGLIB代理实现方法的拦截,以及在方法调用前后执行自定义操作。 2. **基于注解的AOP Demo**:展示了如何在切面类中使用注解定义通知,并在运行时自动织入切面。 3. **基于...

    AOP代理 用Spring框架实现

    以下是一个简单的Spring AOP代理实现示例: ```java // 定义切面 @Aspect @Component public class LoggingAspect { @Before("execution(* com.example.service.*.*(..))") public void logBefore(JoinPoint ...

    Spring AOP代理详细介绍

    Spring AOP代理详细介绍 前言: 一开始我对spring AOP还是属于一知半解的状态,这几天遇到一个问题,加上又查看了一些Spring相关知识,感觉对这个问题有了更深刻的认识。所以写下来分享一下。 我们知道,Spring支持...

    Spring AOP完整例子

    在测试方法中,可以注入需要的bean,然后调用方法来触发AOP代理。这样,通知将在适当的时候被调用,我们可以验证其预期行为。 为了更深入地理解这些概念,你可以查看压缩包中的具体代码,例如,`ExampleAspect`类...

    Spring AOP的底层实现技术

    4. **AOP代理的创建** Spring AOP在启动时会根据配置创建代理对象。如果目标类实现了接口,将使用JDK动态代理;否则,使用CGLIB代理。代理对象在调用目标方法时会插入通知逻辑。 5. **代理对象的工作原理** 当...

Global site tag (gtag.js) - Google Analytics