5个点轻松搞定Spring AOP底层实现原理

简介: AOP 也是 Spring 中一个较为重要的内容,相对于传统的 OOP 模式,AOP 有很多让人难以理解的地方,本篇文章将向大家介绍 AOP 的实现方法及其底层实现,内容包括:

前言

AOP 也是 Spring 中一个较为重要的内容,相对于传统的 OOP 模式,AOP 有很多让人难以理解的地方,本篇文章将向大家介绍 AOP 的实现方法及其底层实现,内容包括:

初始 AOP
AOP 的基本概念
AOP(concepts)术语
动态代理
通知介绍(前置、后置、返回、异常、环绕)
基于注解的方式配置通知

一、什么是AOP

AOP(Aspect-Oriented Programming), 即 面向切面编程, 它与 OOP( Object-Oriented Programming, 面向对象编程) 相辅相成, 提供了与 OOP 不同的抽象软件结构的视角在 OOP 中, 我们以类(class)作为我们的基本单元, 而 AOP 中的基本单元是 Aspect(切面)
二、AOP的基本概念

AOP框架具有如下两个特征:

个步骤之间的良好隔离性。

源代码无关性。
三、AOP concepts(AOP术语)
Aspect/Advisors(切面)

一个关注点的模块化,这个关注点可能会横切多个对象。在Spring AOP中,切面可以使用基于模式或者基于@Aspect注解的方式来实现。
Join point(连接点)

在程序执行期间的一点。在Spring AOP中,连接点总是表示方法执行。
Advice(通知)

在切面的某个特定的连接点上执行的动作。许多AOP框架(包括Spring)都是以拦截器做通知模型,并维护一个以连接点为中心的拦截器链。
Pointcut(切入点)

查找连接点的条件。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行。
Introduction(引入)

给一个类型声明额外的方法或属性。Spring允许引入新的接口(以及一个对应的实现)到任何被代理的对象。
Target object(目标对象)

被一个或者多个切面所通知的对象。也被称做被通知(advised)对象。 既然Spring AOP是通过运行时代理实现的,这个对象永远是一个被代理(proxied)对象。
AOP proxy

AOP框架创建的对象,用来实现切面契约(例如通知方法执行等等)。在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。
Weaving(织入)

织入是一个过程,是将切面应用到目标对象从而创建出AOP代理对象的过程,织入可以在编译期、类装载期、运行期进行。
Spring AOP

1、Spring AOP使用纯Java实现,它不需要专门的编译过程。Spring AOP不需要控制类加载器层次结构,因此适用于Servlet容器或应用程序服务器。

2、Spring AOP目前仅支持方法执行连接点。

3、Spring实现AOP的方法跟其他的框架不同。Spring并不是要提供最完整的AOP实现(尽管Spring AOP有这个能力),相反的,它其实侧重于提供一种AOP实现和Spring IoC容器之间的整合,用于帮助解决在企业级开发中的常见问题。

4、Spring AOP从来没有打算通过提供一种全面的AOP解决方案来与AspectJ竞争。我们相信无论是基于代理(proxy-based)的框架如Spring AOP或者是成熟的框架如AspectJ都是很有价值的,他们之间应该是互补而不是竞争的关系。
四、Spring框架的AOP的底层实现

Srping框架的AOP技术底层也是采用的代理技术,代理的方式提供了两种
基于JDK的动态代理

必须是面向接口的,只有实现了具体接口的类才能生成代理对象
基于CGLIB动态代理

对于没有实现了接口的类,也可以产生代理,产生这个类的子类的方式

Spring的传统AOP中根据类是否实现接口,来采用不同的代理方式

如果实现类接口,使用JDK动态代理完成AOP

. 如果没有实现接口,采用CGLIB动态代理完成AOP

对于没有实现了接口的类,也可以产生代理,产生这个类的子类的方式

Spring的传统AOP中根据类是否实现接口,来采用不同的代理方式

如果实现类接口,使用JDK动态代理完成AOP

如果没有实现接口,采用CGLIB动态代理完成AOP
基于Spring的AOP简单实现

注意一下,在讲解之前,说明一点:使用Spring AOP,要成功运行起代码,只用Spring提供给开发者的jar包是不够的,请额外上网下载两个jar包:

1、aopalliance.jar

2、aspectjweaver.jar
五、通过配置的方式实现aop通知效果
xml配置

// 定义切面 aspect

//定义 切入点

//通知 环绕通知 :around;前置通知 :before;后置通知:after;最终通知:after-returning;异常通知:after-throwing

logger.java

public Object record(ProceedingJoinPoint pjp){

Log log = new Log();

try {

log.setOperator("admin");

String mname = pjp.getSignature().getName();

log.setOperName(mname);

Object[] args = pjp.getArgs();

log.setOperParams(Arrays.toString(args));

//执行目标方法,返回的是目标方法的返回值,本例中 void

Object obj = pjp.proceed();

if(obj != null){

log.setResultMsg(obj.toString());

}else{

log.setResultMsg(null);

}

log.setOperResult("success");

System.out.println("1111");

return obj;

} catch (Throwable e) {

log.setOperResult("failure");

log.setResultMsg(e.getMessage());

} finally{

// logService.saveLog(log);

}

return null; 注意:这里如果是返回null即使你调用的时候返回是null,即使你的方法中含有返回值

}

}

JDK动态代理

接口

public interface UserService {

void save();

int select();

}

接口实现类

public class UserServiceImpl implements UserService {

@Override

public void save() {

System.out.println("保存用户信息成功");

}

@Override

public int select() {

System.out.println("查询用户信息成功");

return 10;

}

}

JDK动态代理工厂类

public class JdkProxyFactory implements InvocationHandler {

private Object target;

public JdkProxyFactory(Object target) {

this.target = target;

}

/**

  • 获取代理对象,当前类继承InvocationHandler

*

  • @return

*/

public Object getProxyObject() {

return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);

}

@Override

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

//添加功能

System.out.println("增强代码,添加日志功能");

//执行原有方法

return method.invoke(target, args);

}

}

测试JDK动态代理​

@Test

public void JdkProxyTest() {

//创建目标对象

UserService userService = new UserServiceImpl();

//创建工厂对象

JdkProxyFactory jdkProxyFactory = new JdkProxyFactory(userService);

UserService proxy = (UserService) jdkProxyFactory.getProxyObject();

proxy.save();

System.out.println("=========================");

proxy.select();

}

总结

以上就是我对Java开发大型互联网架构Spring AOP实现原理之Spring AOP底层实现 问题及其优化总结。

相关文章
|
1月前
|
XML Java 开发者
Spring Boot开箱即用可插拔实现过程演练与原理剖析
【11月更文挑战第20天】Spring Boot是一个基于Spring框架的项目,其设计目的是简化Spring应用的初始搭建以及开发过程。Spring Boot通过提供约定优于配置的理念,减少了大量的XML配置和手动设置,使得开发者能够更专注于业务逻辑的实现。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,为开发者提供一个全面的理解。
34 0
|
6天前
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
47 14
|
1月前
|
XML Java 数据安全/隐私保护
Spring Aop该如何使用
本文介绍了AOP(面向切面编程)的基本概念和术语,并通过具体业务场景演示了如何在Spring框架中使用Spring AOP。文章详细解释了切面、连接点、通知、切点等关键术语,并提供了完整的示例代码,帮助读者轻松理解和应用Spring AOP。
Spring Aop该如何使用
|
23天前
|
监控 安全 Java
什么是AOP?如何与Spring Boot一起使用?
什么是AOP?如何与Spring Boot一起使用?
46 5
|
27天前
|
Java 开发者 Spring
深入解析:Spring AOP的底层实现机制
在现代软件开发中,Spring框架的AOP(面向切面编程)功能因其能够有效分离横切关注点(如日志记录、事务管理等)而备受青睐。本文将深入探讨Spring AOP的底层原理,揭示其如何通过动态代理技术实现方法的增强。
53 8
|
27天前
|
Java 开发者 Spring
Spring AOP 底层原理技术分享
Spring AOP(面向切面编程)是Spring框架中一个强大的功能,它允许开发者在不修改业务逻辑代码的情况下,增加额外的功能,如日志记录、事务管理等。本文将深入探讨Spring AOP的底层原理,包括其核心概念、实现方式以及如何与Spring框架协同工作。
|
27天前
|
XML 监控 安全
深入调查研究Spring AOP
【11月更文挑战第15天】
41 5
|
27天前
|
Java 开发者 Spring
Spring AOP深度解析:探秘动态代理与增强逻辑
Spring框架中的AOP(Aspect-Oriented Programming,面向切面编程)功能为开发者提供了一种强大的工具,用以将横切关注点(如日志、事务管理等)与业务逻辑分离。本文将深入探讨Spring AOP的底层原理,包括动态代理机制和增强逻辑的实现。
39 4
|
1月前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
40 0
|
Java Spring
Spring原理学习系列之五:IOC原理之Bean加载
其实很多同学都想通过阅读框架的源码以汲取框架设计思想以及编程营养,Spring框架其实就是个很好的框架源码学习对象。我们都知道Bean是Spring框架的最小操作单元,Spring框架通过对于Bean的统一管理实现其IOC以及AOP等核心的框架功能,那么Spring框架是如何把Bean加载到环境中来进行管理的呢?本文将围绕这个话题进行详细的阐述,并配合Spring框架的源码解析。
Spring原理学习系列之五:IOC原理之Bean加载