【Java5 特性】4.注解

1、注解概念

注解Annontation,是Java5引入的特性,位于java.lang.annotation包下。它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。

注解也是一种说明、配置、描述性的信息,与具体业务无关,也不会影响正常的业务逻辑,但我们可以用反射机制来进行校验、赋值等操作。注解经常用于类,接口,方法,方法参数,属性字段等上面,注解常见的用途有:

  • 编译时进行格式检查:如@Override、@SuppressWarnings等;
  • 编译时进行代码生成补全:如Lombok插件提供的注解@Data、@Setter、@Getter等;
  • 跟踪代码的依赖性,实现替代配置文件功能:如Spring中的@ComponentScan、@Bean、@Configuration等;

以@RestController注解为例,分析下注解的语法格式:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
    @AliasFor(
        annotation = Controller.class
    )
    String value() default "";
}
  • @RestController注解由@interface标识,修饰符为public,内部的方法可能会指定默认值,因此注解本质上也是一个接口,可能有接口方法;
  • @Target、@Retention、@Documented这三个注解是元注解,用于标识@RestController用于何处、用于何种策略对应生命周期、是否包含在JavaDoc中(下面元注解会分析到);
  • @Controller、@ResponseBody组合在一起构成了@RestController,内部value()方法上的@AliasFor的annotation属性指明了@Controller注解是@RestController的父注解,@RestController和@Controller是一种继承关系;

2、元注解

元注解就是用来注解 注解 的注解,简单点说就是为自定义注解提供的注解。java.lang.annotation包下主要提供了5种元注解:@Documented、@Inherited、@Retention、@Target、@Repeatable,作用分别为:

@Documented表示是否将该注解的相关信息添加到javadoc文档中,无接口方法;

@Inherited表示允许注解的类的子类也继承该注解,无接口方法;

@Target表示该注解作用的范围(如ElementType.TYPE表示该注解只能用于类/接口/注解/枚举上。ElementType.METHOD表示该注解只能注解方法上。等等),有个vaule()方法;

@Retention表示该注解的生命周期(如RetentionPolicy.SOURCE表示仅存在于源代码中,编译阶段会被丢弃,不会包含于class字节码文件中。RetentionPolicy.RUNTIME表示始终不会丢弃,可以使用反射获得该注解的信息,最常用的方式。等等),有个vaule()方法;

@Repeatable是Java8引入的元注解,用于解决在类上可以使用同一种注解的问题,有个vaule()方法。

以扫描包路径的注解@ComponentScans 和 注解@ComponentScan为例,注解的源码及如何使用注解分析如下:

// @ComponentScans:用于程序运行时,在类/接口/注解/枚举上使用,相关注解信息添加到javadoc中
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
public @interface ComponentScans {
    ComponentScan[] value();
}


// @ComponentScan具有@ComponentScans的元注解特性
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
    // @AliasFor表示了basePackages和value互为别名
    @AliasFor("basePackages")
    String[] value() default {};
    @AliasFor("value")
    String[] basePackages() default {};
    ...;
}

// SpringBoot启动类上就可以重复使用同一个@ComponentScan注解
@SpringBootApplication
@ComponentScan("com.xxwei.demo.controller")
@ComponentScan("com.xxwei.demo.service")
@ComponentScan("com.xxwei.demo.dao")
public class MySportHealthyApplication {

	public static void main(String[] args) {
		SpringApplication.run(MySportHealthyApplication.class, args);
	}

}

3、Spring注解盘点

注解和XML一样本身是没有功能的,只是一种说明、配置、描述性的信息,可以简单理解为注解是一种标记。在Spring框架流行的后端,掌握常用的注解,理解注解的用途是必备的技能,下面按用途来划分下常用的注解:

声明Bean的角色:@Component(无明确角色,通用)、@Controller(控制器层角色)、@Service(逻辑业务处理层角色)、@Repository(数据访问层角色)等;

注入Bean到Spring IOC容器:@Autowired、@Inject、@Resource、@Qualifier 等;

声明配置类:@Bean、@Configuration 及整合特定组件使用到的注解,如整合RabbitMQ时Spring提供的@EnableRabbit、@Exchange等;

Spring AOP相关:@Aspect、@PointCut、@After、@Before、@Around、@EnableAspectJAutoProxy等;

Spring Web MVC:@RestController、@Controller、@CrossOrigin、@ModelAttribute、@RequestMapping、@GetMapping、@RequestParam 等;

Spring Boot:@SpringBootApplication、@EnableAutoConfiguration、@Conditional、@ConditionalOnResource、@ConditionalExpression等。

小结一下

本篇对注解是什么,怎么组成的,怎么用,以及Spring框架内常用注解等基础知识做了一下总结,为后面的SpringBoot启动原理分析做些基础铺垫吧。

有时候在想,想要真正明白某个注解代表的含义,建议先不要去百度(因为我觉得不去自行探索的东西容易形成先入为主的观念,会养成拿来就用的习惯,有时候还会认识出现偏差),而尝试性的去阅读源码是个好办法。比如@Autowired这个注解,之前脑海里的印象就是去注解字段的,标记要注入IOC容器中的Bean,打开@Autowired源码后可能会重新认识它,它不光可以注解字段,也可以注解方法、注解方法参数、注解构造器,更可以注解注解等,而且唯一的required()方法默认为true(这里指的是按某种类型注入Bean)。如果好奇与@Resource区别,继续打开@Resource源码,根据源码注释可以看到@Resource注入Bean方式有按名称(name()方法)和按类型(type()方法)等方式,这样一对比记不住都难啊,哈哈哈!不积硅步无以至千里,点滴付出终将有所收获,共同进步~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值