1. **什么是AOP?**
AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,它与传统的面向对象编程(OOP)相辅相成。AOP的核心思想是将程序的功能划分为不同的关注点(concerns),然后通过横切关注点的方式将这些关注点模块化,以便于在不同的地方重用和管理。AOP引入了概念如下:
- **切面(Aspect,切面类、拦截处理类、增强处理类):** 切面是关注点的模块化单元。它定义了一系列的通知(Advice),以及切点(Pointcut),指定在何处应用这些通知。
- **通知(Advice 增强处理 前置,后置,异常,最终):** 在不同场景下拦截的功能 ,通知是切面中具体的操作或行为,它定义了在切点上执行的代码。通知可以在切点之前、之后或周围执行。
- **切点(Pointcut,拦截规则,拦截什么拦截谁):** 切点是一个表达式,它定义了在程序中哪些地方应用通知。通常,切点用于匹配方法调用、特定的类、特定的包等。
如:
expression属性定义需要增强的方法的规则
execution值定义具体拦截谁切入哪一个方法或哪一个类或哪一个包,或所有
execution(访问修饰符 返回值类型 包名(两个点是包括子包).类名.方法名(参数列表)))
execution(* *..*.*(..)) 所有返回值类型 所有包下的所有类的所有方法 不论有没有参数
- **连接点(Join Point具体被拦截到的方法):** 连接点是程序执行过程中的一个特定点,如方法调用或异常抛出等。通知可以与连接点关联。
- **织入(Weaving由spring完成切面类包裹住对象,创建出代理对象):** 织入是将切面的通知插入到程序的执行流程中的过程。它可以在编译时、加载时或运行时进行。
- **代理对象 中间人,可以拦截对原始对象方法的调用,并在调用前后执行额外增强处理的操作
它不需要修改原始类的代码,它用于在调用方法时执行额外的逻辑。这些代理对象通常用于实现不同种类的横切关注点,比如日志记录、事务管理、安全性等
spring实现代理的方式:
Spring框架主要使用两种类型的代理对象:JDK动态代理和CGLIB代理。
-
JDK动态代理:如果目标类实现了至少一个接口,Spring将使用JDK动态代理。它基于Java的反射机制,创建一个实现了目标接口的代理类。这个代理类中的方法调用会被重定向到实际的目标对象,同时可以在方法调用前后插入额外的逻辑。
-
CGLIB代理:如果目标类没有实现任何接口,Spring将使用CGLIB代理。CGLIB是一个强大的第三方库,它通过创建目标类的子类来实现代理。代理类继承自目标类,因此可以覆盖目标类的方法,并在其中添加拦截逻辑。
举个例子,假设你有一个Service类,你想要在调用其方法时记录日志。使用Spring的代理功能,你可以创建一个日志记录的代理对象,这个代理对象会包装原始的Service对象。当你调用代理对象的方法时,它会先记录日志,然后再将调用传递给实际的Service对象。
在拿JDK动态代理举例来说,假设你有一个名为 UserService
的目标类,它提供了一些用户相关的方法,比如 getUserById(int id)
和 createUser(User user)
。如果你想在调用这些方法前后添加日志记录,你可以创建一个代理对象来实现这个功能。首先,你需要定义一个代理接口,如 UserServiceProxy
,其中包含与 UserService
相同的方法签名。然后,使用 JDK 动态代理创建一个实现了 UserServiceProxy
接口的代理类,这个代理类会包装实际的 UserService
对象,并在方法调用前后插入日志记录逻辑。
总之,代理接口是目标类的方法签名定义,它是为了在动态代理中创建代理对象时使用的。被代理的目标类需要实现这个接口,以便代理对象可以重定向方法调用到实际的目标对象,并实现相同的方法签名。
总之,Spring的代理对象允许你在不修改原始类代码的情况下,对方法调用进行拦截和增强,从而实现各种横切关注点的功能(日志记录、事务管理、安全性、性能监控)。
AOP的主要目标是解耦关注点,使得代码更易维护、扩展和理解。典型的应用包括日志记录、性能监控、事务管理等。
aop的简单配置aop.xml:
'''xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd" > <context:annotation-config></context:annotation-config> <context:component-scan base-package="org.example.service"></context:component-scan> <aop:config> <aop:aspect ref="userService"> <aop:pointcut id="pt" expression="execution(public void org.example.service.impl.UserServiceimpl.insertUser())"/> <aop:before method="begin" pointcut-ref="pt"/> <aop:after-returning method="commit" pointcut-ref="pt"/> <aop:after-throwing method="rollback" pointcut-ref="pt" throwing="e"/> <aop:after method="close" pointcut-ref="pt"/> </aop:aspect> </aop:config> <!-- 1.切面 拦截处理类 2.切入点 拦截规则 前置,后置,异常,最终 3.连接点 具体被拦截到的方法 4.通知 在不同场景下拦截的功能 5.织入 由spring完成切面类包裹住对象,创建出代理对象 --> </beans>
'''
2. **AOP配置需要哪些依赖?**
在Java中,AOP的实现通常依赖于特定的AOP框架。两个主要的AOP框架是Spring AOP和AspectJ。每个框架都需要一组依赖库来支持AOP功能。
**Spring AOP:**
如果你使用Spring框架,Spring AOP通常是默认选择。配置Spring AOP需要以下依赖:
- **spring-core.jar:** Spring核心库,包括IoC容器的实现。
- **spring-aop.jar:** Spring AOP模块,提供AOP功能。
- **spring-aspects.jar(可选):** 包含一些常用的AspectJ切面,如果需要使用这些切面,则需要包含这个库。
- **aspectjweaver.jar(可选):** 如果你希望使用基于注解的AspectJ风格的AOP,需要包含AspectJ的weaver库。
**AspectJ:**
如果你希望使用更强大的、纯粹的AOP功能,可以选择AspectJ。配置AspectJ需要以下依赖:
- **aspectjrt.jar:** AspectJ运行时库,用于支持AspectJ切面的运行。
- **aspectjweaver.jar:** AspectJ编织器,用于将切面织入到目标程序中。
- **aspectjtools.jar(可选):** AspectJ工具,用于编译AspectJ切面。文章来源:https://www.toymoban.com/news/detail-670679.html
注意:具体的依赖库版本可能会根据你的项目和框架的版本而有所不同。因此,建议查看官方文档或使用构建工具(如Maven或Gradle)来管理依赖。文章来源地址https://www.toymoban.com/news/detail-670679.html
到了这里,关于什么是AOP?AOP配置需要哪些依赖?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!