springaop是什么意思_javaaop原理

springaop是什么意思_javaaop原理什么是AOP?AOP(Aspect-OrientedProgramming),即面向切面编程,它与OOP(Object-OrientedProgramming,面向对象编程)相辅相成,提供了与OOP不同的抽象软件结构的视角.例如日志功能,日志往往横向分部在各个对象层次之中,这种分部与主要业务功能又无关,在OOP中会导致出现大量重复代码,而AOP采用以封装形式将这些可被复用的…_javaaop是啥

什么是AOP?

AOP(Aspect-Oriented Programming), 即 面向切面编程, 它与OOP( Object-Oriented Programming, 面向对象编程) 相辅相成, 提供了与OOP 不同的抽象软件结构的视角. 例如日志功能,日志往往横向分部在各个对象层次之中,这种分部与主要业务功能又无关,在OOP中会导致出现大量重复代码,而AOP采用以封装形式将这些可被复用的代码放在一块,即被称为”Aspect”。在 OOP 中 我们以类(class)作为我们的基本单元, 而 AOP 中的基本单元是 Aspect(切面)

什么是Aspect?

aspect 由 pointcount 和 advice 组成, 它既包含了横切逻辑的编写, 也包
括了连接点的定义. Spring AOP 就是负责实施切面的框架, 它将切面所定义的横
切逻辑编织到切面所指定的连接点中, 这里包含两个工作:
1、如何通过 pointcut 和 advice 定位到特定的 joinpoint 上 2、如何在
advice 中编写切面代码.
可以简单地认为, 使用 @Aspect 注解的类就是切面.在这里插入图片描述

什么是切点(PointCut)?

PointCut是对匹配连接点的一个条件定义,一般来讲,所有方法都有自己的连接点,而我们并不希望对每个方法进行横切处理,通过PointCut定义了需要进行Advice的方法。

什么是连接点(JoinPoint)?

JoinPoint是在方法执行过程中的一个切入的点,切面代码可以通过这个点对方法进行抛出异常、修改参数等操作。

什么是通知(Advice)?

Advice是指在拦截到连接点之后要执行的代码,SpringAOP中有5中通知类型:
1、@Before – 这些类型的 Advice 在 joinpoint 方法之前执行
2、@After Returning – 这些类型的 Advice 在连接点方法正常执行后执行
3、@After Throwing – 这些类型的 Advice 仅在 joinpoint 方法通过抛出异常退出时使用
4、@After (finally) – 这些类型的 Advice 在连接点方法之后执行,无论方法退出是正常还是异常返回
5、@Around – 这些类型的 Advice 在连接点之前和之后执行
什么是织入(Weave)?
是指将切面与目标对象连接起来,并生成proxy的过程。

一个简单的Aspect:

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
@Component
@Aspect
@Slf4j
public class AspectTest {
    /**
     * 这里我们使用注解的形式
     * 当然,我们也可以通过切点表达式直接指定需要拦截的package,需要拦截的class 以及 method
     * 切点表达式:   execution(...)
     */
    @Pointcut("@annotation(com.example.demo.anno.SysLog)")
    public void logPointCut() {}
    @Around("logPointCut()")
    public Object method(ProceedingJoinPoint point) {
        List<Object> args = Arrays.asList(point.getArgs());
        Object result = null;
        try {
            log.error("执行参数=>{}", args);
            Object[] newArgs = {10, 20};//修改参数
            result = point.proceed(newArgs);
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        return result;
    }
    @AfterReturning(value = "execution(* com.example.demo.service.AspectTestService.*(..))", returning = "res")
    public void afterMethod(JoinPoint point, Object res) {
        List<Object> arg = Arrays.asList(point.getArgs());
        log.error("执行参数=>{}", arg);
        log.error("执行结果=>{}", res);
    }
}

/**
 * 定义切面注解
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SysLog {
    String value() default "";
}

SpringAOP的两种代理方法:
JDK动态代理:默认的代理方式,实现了对任何接口的代理
Cglib动态代理:当需要代理的类不是接口时,springAOP会切换为这种代理方式。
SpringAop动态代理是在运行时以反射获取到对象,并生成对应代理对象,减少了对内存空间的浪费。而代理方法代理逻辑与业务逻辑互不关联,没有耦合,只是作为方法的增强

今天的文章springaop是什么意思_javaaop原理分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/59181.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注