注解,对于一个从事 Java 开发行业的软件工程师而言,可以说是再熟悉不过了,在 SpringBoot 项目中,我们经常使用各种各样的注解:@Component
、@Bean
等。
注解一般在底层框架里使用居多,但你有了解过注解是如何工作的吗?注解对于我们的日常开发有什么特别之处呢?本文将带领你一探究竟,使你能够轻松使用注解进行实战开发。
注解通常以 @
符号开头,后跟注解名,如下示例定义了一个名为MyAnnotation
的注解。
public @interface MyAnnotation {
}
Java 中的注解本身并不具备任何功能,但我们可以基于注解实现一些常见的功能,注解常见的用法有以下两种:编译时检查、运行时处理。
如常见的使用 @Override
注解可以帮助编译器检查是否正确重写了父类方法,如果我们想自定义实现编译时检查,需要使用到注解处理器。
Java 提供了注解处理器(Annotation Processor),用于在编译期间处理注解。可以使用 javax.annotation.processing
包中的工具来创建自定义注解处理器。在后续的文章中,我们将实现这一功能。
可以通过反射在运行时访问注解,比如我定义了一个名为LogTag
的注解,结合 Aop 切面,当检测到方法上有这个注解时,可以在方法执行前后打印日志。
注解定义
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface LogTag {
}
Aop
切面
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class LogAspect {
@Pointcut("@annotation(com.gumei.webapp.Annotations.LogTag)")
public void logPointcut() {
}
@Before("logPointcut()")
public void logPrint(JoinPoint joinPoint){
System.out.println("方法执行前打印日志:" + joinPoint.getSignature().getName());
}
}
在方法上使用注解
@Controller
@CrossOrigin
public class ControllerTest {
@LogTag
@ResponseBody
@RequestMapping("/test")
public Response test(Param param){
Response response = new Response();
response.setAge(param.age);
response.setName(param.name);
response.setDate(new Date());
response.setLocalDateTime(LocalDateTime.now());
return response;
}
}
当我们在访问test
接口时,切面检测到注解,便会执行对应的逻辑。
元注解是用于定义其他注解的注解。Java 提供了几个元注解:
因篇幅问题不能全部显示,请点此查看更多更全内容
怀疑对方AI换脸可以让对方摁鼻子 真人摁下去鼻子会变形
女子野生动物园下车狼悄悄靠近 后车司机按喇叭提醒
睡前玩8分钟手机身体兴奋1小时 还可能让你“变丑”
惊蛰为啥吃梨?倒春寒来不来就看惊蛰
男子高速犯困开智能驾驶出事故 60万刚买的奔驰严重损毁