一文搞懂Java注解
- 作者
- Name
- 青玉白露
- Github
- @white0dew
- Modified on
- Reading time
- 4 分钟
阅读:.. 评论:..
Java注解是Java 5引入的一种新功能,用于为Java代码提供元数据。作为元数据,注解不直接影响代码的执行,但有些类型的注解可以用于此目的。注解为我们在代码中添加信息提供了一种形式化的方法,帮助我们更快捷地编写代码。
注解的作用
注解主要有以下四个作用:
- 生成文档:将元数据生成为Javadoc文档。
- 编译检查:编译器在编译阶段会对代码进行检查,例如
@Override
注解会提示编译器查看其是否重写了父类的方法。 - 编译时动态处理:用于动态生成代码,例如一些帮助类、方法,通过注解实现自动生成。
- 运行时动态处理:使用反射来注入实例。
Java提供的三种注解
- 标准注解:Java自带的注解,如
@Override
,@Deprecated
,@SuppressWarnings
等。 - 元注解:用于修饰注解的注解,如
@Retention
,@Target
,@Inherited
,@Documented
,@Repeatable
等。 - 自定义注解:用户可以根据需要自定义注解。
常见注解
一些Java及Spring等常见的注解如下:
- **@Deprecated **** **:标注内容不再被建议使用。
- **@Override **** **:只能标注方法,表示该方法覆盖父类中的方法。
- **@SuppressWarnings **** **:标注内容产生的警告,编译器会对这些警告保持静默。
- **@interface **** **:用于定义一个注解。
- **@Documented **** **:将标注内容包含到Javadoc中。
- **@Inherited **** **:只能用来标注“Annotation类型”,它所标注的Annotation具有继承性。
- **@Retention **** **:指定注解的保留阶段是源码、字节码还是运行期。
- **@Target **** **:指定注解的作用范围,如接口、类、字段、方法、构造函数等。
- **@Repeatable **** **:表明该注解可以多次作用于同一对象。
注解的生命周期
注解的生命周期分为以下三种:
- SOURCE:注解只在源码中存在,编译时会被丢弃。
- CLASS:注解在字节码文件中存在,但在运行时会被丢弃。
- RUNTIME:注解在运行时也存在,JVM可以读取。
Spring的一些重要注解
- **@Configuration **** **:标注在类上,相当于Spring的XML配置文件中的
<beans>
,用来配置Spring容器。 - **@Bean **** **:标注在方法上,注册Bean对象,默认作用域为单例。
- **@ComponentScan **** **:标注在类上,用于对组件进行扫描。
- **@Component **** **:一般标注在类上,表明其是一个组件,告知Spring该类会创建Bean。
- **@Repository **** **:表明该对象是数据访问层使用的。
- **@Service **** **:表明该对象是业务逻辑层使用的。
- **@Controller **** **:表明该对象在展现层使用。
依赖注入相关注解
- **@Resource **** **:自动依赖注入(Spring容器去找依赖),默认按照Name注入。
- **@Autowired **** **:自动依赖注入(Spring容器去找依赖),按照Type注入。
- **@Inject **** **:手动依赖注入。
其他常见注解
- **@Profile **** **:指定类或方法在特定的Profile环境生效。
- **@Data **** **:注在类上,提供类的get、set、equals、hashCode、canEqual、toString方法。
- **@AllArgsConstructor **** **:注在类上,提供类的全参构造。
- **@NoArgsConstructor **** **:注在类上,提供类的无参构造。
- @Log4j/**@Slf4j **** **:注在类上,提供对应的Logger对象,变量名为log。
- **@After **** **:表明该方法在其他方法执行之后执行。
- **@Before **** **:表明该方法在其他方法执行之前执行。
- **@Around **** **:表明该方法在其他方法执行之前和之后都执行。
- **@Conditional **** **:类似于
if...else...then
,根据条件决定是否注册Bean。
@Primary
@Qualifier与- **@Primary **** **:在存在多个相同类型的Bean时,@Primary注解定义了优先选择的Bean。
- **@Qualifier **** **:指定特定名称的类型注入。
@Scope设置作用域
- **@Scope **** **:可以将Bean的作用域设置为singleton、prototype、request、session、global session。
@PreDestroy
@PostConstruct与- **@PostConstruct **** **:在Bean初始化后运行一次,执行顺序在构造函数之后。
- **@PreDestroy **** **:在Bean销毁前运行一次,用于释放资源。
自定义注解
自定义注解可以减少代码量,使得代码结构更加简洁和清晰。例如:
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface LogExecutionTime { }
结合AOP和反射的思想,可以优雅地实现自定义注解的处理逻辑。