说说自定义注解的场景及实现?
登陆、权限拦截、日志处理,以及各种
Java
框架,如
Spring
,
Hibernate
,
JUnit
提到注解就不能不说反射,
Java
自定义注解是通过运行
时靠反射获取注解。实际开发中,例如我们要获取某个方法的调用日志,可以通过
AOP
(动态代理机制)给方法添加切面,通过反射来获取方法包含的注解,如果包含日志
注解,就进行日志记录
Java代码展示:
#需要的依赖;
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjrt -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.9.5</version>
</dependency>
切点定义的方式:
package com.special.annotations.annations;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
/**
* @author liuYC
* @ClassName login
* @Description TODO
* @date 2021/5/6 23:22
*/
@Target({METHOD, FIELD, TYPE})
@Retention(RUNTIME)
@Documented
public @interface Login {
}
对切点进行的处理:
package com.special.annotations.aspect;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
/**
* @author liuYC
* @ClassName AuthAspect
* @Description TODO
* @date 2021/5/6 23:22
*/
//@Component
@Aspect
public class AuthAspect {
// 切点描述方法
@Before(value = "@within(com.special.annotations.annations.Login)||@annotation(com.special.annotations.annations.Login)")
public void login() {
validateLogin();
}
public void validateLogin(){
// 进行对应的方法的操纵进行定义
System.out.println("我的切点处理方法已经生效了!");
}
}
进行测试:注意吧注解@login写上,不然会测试一个寂寞!
package com.special.annotations;
import com.special.annotations.annations.Login;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author liuYC
* @ClassName Test
* @Description TODO
* @date 2021/5/6 23:29
*/
@Login
@RestController
public class Test {
@RequestMapping("/test")
public String test() {
System.out.println("test aspects ");
return "hello";
}
public static void main(String[] args) {
System.out.println("刘育超的测试成功:");
}
}
小伙伴们注意!这个不仅可以对方法进行切面。对属性和变量也是可以的,可以看参考的文章,具体有介绍:
项目代码:
https://gitee.com/daka1004/demo.git
参考文章: