什么是AOP?AOP配置需要哪些依赖?

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代理。

  1. JDK动态代理:如果目标类实现了至少一个接口,Spring将使用JDK动态代理。它基于Java的反射机制,创建一个实现了目标接口的代理类。这个代理类中的方法调用会被重定向到实际的目标对象,同时可以在方法调用前后插入额外的逻辑。

  2. 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切面。

   注意:具体的依赖库版本可能会根据你的项目和框架的版本而有所不同。因此,建议查看官方文档或使用构建工具(如Maven或Gradle)来管理依赖。

猜你喜欢

转载自blog.csdn.net/qq_58647634/article/details/132491786
AOP