什么是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