【java自定义注解2】java自定义注解结合Spring AOP

承接上一篇,注解应用于属性,本篇定义了一个用于方法的注解,结合Spring AOP 实现 切面编程。

以下demo演示使用了SpringBoot,与SSM中使用方式大致相同,效果如下:

1、自定义注解(用于方法)

/**
 * 自定义注解
 * @author Zx
 *
 */
@Target(ElementType.METHOD)//作用于方法
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MethodAonn {
    //注解属性
    String name()  default "";;
    String prot() default "";;
    String value() default "默认值";
}

2、自定义Controller,使用自定义注解

/**
 * 测试用控制器
 */
@RestController
@RequestMapping("asp")
public class WorkController {
    
    @RequestMapping("/exec")
    //使用自定义注解
    @MethodAonn(name = "注解name属性")
    public void extcute() {
        System.out.println("extcute()方法执行");
    };
    @RequestMapping("/stop")
    @MethodAonn(name = "被注解方法开始执行")
    public void stop() {
        System.out.println("stop()方法执行");
    };
}

3、创建切面

@Aspect // 注解声明一个切面
@Component // 受spring管理的容器
public class MethodAspect {
    @Pointcut("@annotation(com.xxx.ann.simple2.MethodAonn)") // 注解声明切点,注解的全限定名
    public void annotationPointcut() {
    };

    @After("annotationPointcut()")
    public void after(JoinPoint joinPoint) {
        MethodSignature methodSignature = (MethodSignature)joinPoint.getSignature();
        Method method = methodSignature.getMethod();
        String name = method.getName();
        MethodAonn annotation = method.getAnnotation(MethodAonn.class);
        System.out.println("拦截 : " + name+"方法执行");
        System.out.println(">>>: " + annotation.name());
    }
}

4、启动类启动容器

@SpringBootApplication
@Configuration //注册被spring管理
@EnableAspectJAutoProxy //注解开启对aspectJ的支持
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

5、启动后通过req访问测试:

http://localhost:8080/asp/exec

6、拦截结果:

extcute()方法执行
拦截 : extcute方法执行
>>>: 注解name属性