• AOP简单实现


    1.引入自定义注解pom

    
        org.aspectj
        aspectjweaver
        1.9.6
    
    
    
        org.springframework
        spring-context
        5.3.18
    

    2.创建自定义注解

    1. import java.lang.annotation.ElementType;
    2. import java.lang.annotation.Retention;
    3. import java.lang.annotation.RetentionPolicy;
    4. import java.lang.annotation.Target;
    5. @Target({ElementType.METHOD,ElementType.TYPE})
    6. @Retention(RetentionPolicy.RUNTIME)
    7. public @interface MyAn {
    8. String value() default "";
    9. }

    3.增加Aop

    1. import org.aspectj.lang.annotation.*;
    2. import org.springframework.stereotype.Component;
    3. @Component
    4. @Aspect
    5. public class LogAspect {
    6. // @Pointcut("execution(* com.csj.springdemo.controller..*(..))")
    7. @Pointcut("@annotation(org.jh.common.system.api.MyAn)")
    8. public void logPoint(){//这就是个标志,爱叫啥叫啥,给下面用的
    9. }
    10. @Before("logPoint()")
    11. public void beforeAop(){
    12. System.out.println("前置通知...");
    13. }

    4.在方法上试用

    1.@Target

        这个注解就是表明该注解类能够作用的范围,也就是能够注解在哪,比如 类、方法、参数等。

        下面是他的一些参数:

        @Target(ElementType.TYPE) //接口、类、枚举、注解

        @Target(ElementType.FIELD) //字段、枚举的常量

        @Target(ElementType.METHOD) //方法

        @Target(ElementType.PARAMETER) //方法参数

        @Target(ElementType.CONSTRUCTOR) //构造函数

        @Target(ElementType.LOCAL_VARIABLE)//局部变量

        @Target(ElementType.ANNOTATION_TYPE)//注解

        @Target(ElementType.PACKAGE) ///包

    里面的方法是可以多选的,例如:

        @Target({ElementType.METHOD,ElementType.TYPE})。

     2.@Retention

        这个注解是保留说明,也就是表明这个注解所注解的类能在哪里保留,他有三个属性值:

        RetentionPolicy.SOURCE —— 这种类型的Annotations只在源代码级别保留,编译时就会被忽略

        RetentionPolicy.CLASS —— 这种类型的Annotations编译时被保留,在class文件中存在,但JVM将会忽略

        RetentionPolicy.RUNTIME —— 这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他使用反射机制的代码所读取和使用。

    3. @Documented

        @Documented 注解表明这个注解应该被 javadoc工具记录. 默认情况下,javadoc是不包括注解的. 但如果声明注解时指定了 @Documented,则它会被 javadoc 之类的工具处理, 所以注解类型信息也会被包括在生成的文档中。

    4.@Order

        @Order标记定义了组件的加载顺序,这个标记包含一个value属性。属性接受整形值。如:1,2 等等。值越小拥有越高的优先级。Ordered.HIGHEST_PRECEDENCE这个属性值是最高优先级的属性,它的值是-2147483648,对应的最低属性值是Ordered.LOWEST_PRECEDENCE,它的值是2147483647。

      

    5.@Aspect:作用是把当前类标识为一个切面供容器读取

    @Pointcut:Pointcut是植入Advice的触发条件。每个Pointcut的定义包括2部分,一是表达式,二是方法签名。方法签名必须是 public及void型。可以将Pointcut中的方法看作是一个被Advice引用的助记符,因为表达式不直观,因此我们可以通过方法签名的方式为 此表达式命名。因此Pointcut中的方法只需要方法签名,而不需要在方法体内编写实际代码。

    @Around:环绕增强,相当于MethodInterceptor

    @AfterReturning:后置增强,相当于AfterReturningAdvice,方法正常退出时执行

    @Before:标识一个前置增强方法,相当于BeforeAdvice的功能,相似功能的还有

    @AfterThrowing:异常抛出增强,相当于ThrowsAdvice

    @After:final增强,不管是抛出异常或者正常退出都会执行

    JoinPoint:对象封装了SpringAop中切面方法的信息,在切面方法中添加JoinPoint参数,就可以获取到封装了该方法信息的JoinPoint对象.
    常用api:
    方法名 功能
    Signature getSignature(); 获取封装了署名信息的对象,在该对象中可以获取到目标方法名,所属类的Class等信息
    Object[] getArgs(); 获取传入目标方法的参数对象
    Object getTarget(); 获取被代理的对象
    Object getThis(); 获取代理对象

  • 相关阅读:
    SK 简化流行编程语言对 生成式AI 应用开发的支持
    【网络】五中IO模型介绍 + 多路转接中select和poll服务器的简单编写
    WPF-控件的常用属性-单例-隧道事件
    通过java.netHttpURLConnection类实现java发送http请求
    理解HTTP、HTTPS、TCP、UDP与OSI七层模型:网络访问的基础
    数据库 备份和恢复
    【算法】Median of Two Sorted Arrays
    基于C语言的哈夫曼转化软件
    新学期——学习计划大挑战
    一些JDK自带的性能分析利器
  • 原文地址:https://blog.csdn.net/qq_60547244/article/details/127430359