Java注解是Java 5引入的一种新功能,用于为Java代码提供元数据。作为元数据,注解不直接影响代码的执行,但有些类型的注解可以用于此目的。注解为我们在代码中添加信息提供了一种形式化的方法,帮助我们更快捷地编写代码。

注解的作用

注解主要有以下四个作用:

  1. 生成文档:将元数据生成为Javadoc文档。
  2. 编译检查:编译器在编译阶段会对代码进行检查,例如@Override注解会提示编译器查看其是否重写了父类的方法。
  3. 编译时动态处理:用于动态生成代码,例如一些帮助类、方法,通过注解实现自动生成。
  4. 运行时动态处理:使用反射来注入实例。

Java提供的三种注解

  1. 标准注解:Java自带的注解,如@Override, @Deprecated, @SuppressWarnings等。
  2. 元注解:用于修饰注解的注解,如@Retention, @Target, @Inherited, @Documented, @Repeatable等。
  3. 自定义注解:用户可以根据需要自定义注解。

常见注解

一些Java及Spring等常见的注解如下:

  1. @Deprecated :标注内容不再被建议使用。
  2. @Override :只能标注方法,表示该方法覆盖父类中的方法。
  3. @SuppressWarnings :标注内容产生的警告,编译器会对这些警告保持静默。
  4. @interface :用于定义一个注解。
  5. @Documented :将标注内容包含到Javadoc中。
  6. @Inherited :只能用来标注“Annotation类型”,它所标注的Annotation具有继承性。
  7. @Retention :指定注解的保留阶段是源码、字节码还是运行期。
  8. @Target :指定注解的作用范围,如接口、类、字段、方法、构造函数等。
  9. @Repeatable :表明该注解可以多次作用于同一对象。

注解的生命周期

注解的生命周期分为以下三种:

  • SOURCE:注解只在源码中存在,编译时会被丢弃。
  • CLASS:注解在字节码文件中存在,但在运行时会被丢弃。
  • RUNTIME:注解在运行时也存在,JVM可以读取。

Spring的一些重要注解

  1. @Configuration :标注在类上,相当于Spring的XML配置文件中的<beans>,用来配置Spring容器。
  2. @Bean :标注在方法上,注册Bean对象,默认作用域为单例。
  3. @ComponentScan :标注在类上,用于对组件进行扫描。
  4. @Component :一般标注在类上,表明其是一个组件,告知Spring该类会创建Bean。
  5. @Repository :表明该对象是数据访问层使用的。
  6. @Service :表明该对象是业务逻辑层使用的。
  7. @Controller :表明该对象在展现层使用。

依赖注入相关注解

  1. @Resource :自动依赖注入(Spring容器去找依赖),默认按照Name注入。
  2. @Autowired :自动依赖注入(Spring容器去找依赖),按照Type注入。
  3. @Inject :手动依赖注入。

其他常见注解

  1. @Profile :指定类或方法在特定的Profile环境生效。
  2. @Data :注在类上,提供类的get、set、equals、hashCode、canEqual、toString方法。
  3. @AllArgsConstructor :注在类上,提供类的全参构造。
  4. @NoArgsConstructor :注在类上,提供类的无参构造。
  5. @Log4j/@Slf4j :注在类上,提供对应的Logger对象,变量名为log。
  6. @After :表明该方法在其他方法执行之后执行。
  7. @Before :表明该方法在其他方法执行之前执行。
  8. @Around :表明该方法在其他方法执行之前和之后都执行。
  9. @Conditional :类似于if...else...then,根据条件决定是否注册Bean。

@Qualifier与@Primary

  • @Primary :在存在多个相同类型的Bean时,@Primary注解定义了优先选择的Bean。
  • @Qualifier :指定特定名称的类型注入。

@Scope设置作用域

  • @Scope :可以将Bean的作用域设置为singleton、prototype、request、session、global session。

@PostConstruct与@PreDestroy

  • @PostConstruct :在Bean初始化后运行一次,执行顺序在构造函数之后。
  • @PreDestroy :在Bean销毁前运行一次,用于释放资源。

自定义注解

自定义注解可以减少代码量,使得代码结构更加简洁和清晰。例如:

  1. @Retention(RetentionPolicy.RUNTIME)
  2. @Target(ElementType.METHOD)
  3. public @interface LogExecutionTime {
  4. }

结合AOP和反射的思想,可以优雅地实现自定义注解的处理逻辑。

参考资料:
Java Annotations
Spring Framework Documentation