承接上一篇,注解应用于属性,本篇定义了一个用于方法的注解,结合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属性