文章目录
注解的基本原理
以前,『XML』是各大框架的青睐者,它以松耦合的方式完成了框架中几乎所有的配置,但是随着项目越来越庞大,『XML』的内容也越来越复杂,维护成本变高。
JAVA 注解的基本原理
于是就有人提出来一种标记式高耦合的配置方式,『注解』。方法上可以进行注解,类上也可以注解,字段属性上也可以注解,反正几乎需要配置的地方都可以进行注解。
关于『注解』和『XML』两种不同的配置模式,争论了好多年了,各有各的优劣,注解可以提供更大的便捷性,易于维护修改,但耦合度高,而 XML 相对于注解则是相反的。
1.Java内置注解
@Override
@Target(ElementType.METHOD) //作用于方法
@Retention(RetentionPolicy.SOURCE)
public @interface Override{
}
它没有任何的属性,所以并不能存储任何其他信息。它只能作用于方法之上,编译结束后将被丢弃。
所以它就是一种典型的标记式注解,仅被编译器可知,编译器在对 java文件进行编译成字节码的过程中,一旦检测到某个方法上被修饰了该注解,就会去匹对父类中是否具有一个同样方法签名的函数,如果不是,自然不能通过编译。
@Deprecated
@SuppressWarnings
2.元注解
元注解:及注解的注解,其实也可以理解为Java的内置注解,元注解总共有5个,分别是@Retention、 @Target、 @Document、 @Inherited和@Repeatabl
下面我们将分别解释其作用和使用方法
@Target
Target在中文中所表达的意思为:目标,即作用的目标,也就是我们注解的作用范围,同样也是通过枚举类ElementType表达作用的类型。
@Target(ElementType.TYPE)作用接口、类、枚举、注解
@Target(ElementType.FIELD)作用属性字段、枚举的常量
@Target(ElementType.METHOD) 作用方法
@Target(ElementType.PARAMETER) 作用方法参数
@Target(ElementType.CONSTRUCTOR) 作用构造函数
@Target(ElementType.LOCAL_VARIABLE)作用局部变量
@Target(ElementType.ANNOTATION_TYPE)作用于注解(@Retention注解中就使用该属性)
@Target(ElementType.PACKAGE) 作用于包
@Target(ElementType.TYPE_PARAMETER) 作用于类型泛型,即泛型方法、泛型类、泛型接口 (jdk1.8加入)
@Target(ElementType.TYPE_USE) 类型使用.可以用于标注任意类型除了 class (jdk1.8加入)
@Ratention
Retention英文意思有保留、保持的意思,它表示注解存在阶段是保留在源码(编译期),字节码(类加载)或者运行期(JVM中运行)。
在@Retention注解中使用枚举类RetentionPolicy来表示注解保留时期
@Retention(RetentionPolicy.SOURCE),注解仅存在于源码中,在class字节码文件中不包含
@Retention(RetentionPolicy.CLASS), 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得
@Retention(RetentionPolicy.RUNTIME), 注解会在class字节码文件中存在,在运行时可以通过反射获取到
注意的是我们在代码中或多或少会使用自定义注解,但是如果我们将注解仅写在class字节码中,或者是源码中,那这个注解就无法发挥作用,所以我们需要在运行中使用。
@Ratention(RetentionPolicy.RUNTIME)
public @interface MyTestAnnotation {//需要符合大驼峰写法
}
@Documented
所标注内容可以出现在javadoc中,只能作用于注解,即注解的注解。
关于javadoc:小白都能看懂的javadoc使用教程
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented{
}
@Inherited
只能被用来标注“Annotation类型”,它所标注的Annotation具有继承性;Inherited的英文意思是继承,但是这个继承和我们平时理解的继承大同小异,一个被@Inherited注解了的注解修饰了一个父类,如果他的子类没有被其他注解修饰,则它的子类也继承了父类的注解。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited{
}
@Repeatabl
Repeatable的英文意思是可重复的。顾名思义说明被这个元注解修饰的注解可以同时作用一个对象多次,但是每次作用注解又可以代表不同的含义。
注解和反射
「java.lang.annotation.Annotation」:The common interface extended by all annotation types
所有的注解类型都继承自这个普通的接口(Annotation)
这句话阐释了注解即时继承了Annotation接口的接口
Spring常用注解
1. @Autowired:自动装配Bean,可用于构造方法、属性、方法和参数上。
2. @Controller:将类标识为Spring MVC的控制器。
3. @Service:将类标识为服务层的Bean。
4. @Repository:将类标识为数据访问层的Bean。
5. @Component:通用的Bean注解,可用于任何类。
6. @RequestMapping:定义请求的URL路径和HTTP请求方法。
7. @RequestParam:获取请求参数的值。
8. @ResponseBody:将方法返回的对象转换为HTTP响应的内容。
9. @PathVariable:获取URL路径中的变量值。
10. @Valid:启用参数校验。
11. @Transactional:启用事务管理。
12. @Aspect:声明切面,用于定义切点和通知。
13. @Value:注入属性值。
14. @Qualifier:指定注入Bean的名称。
15. @PostConstruct:在Bean初始化之后执行的方法。
16. @PreDestroy:在Bean销毁之前执行的方法。
17. @Configuration:声明配置类,用于替代XML配置文件。
18. @Bean:用于在配置类中声明Bean。
19. @Profile:根据当前环境激活或禁用Bean的注入。
20. @Conditional:根据条件选择是否注入Bean。
SpringBoot常用注解
Spring Boot中常用的注解有:
1. @SpringBootApplication:标识启动类,同时包含了@ComponentScan和@EnableAutoConfiguration注解。
2. @RestController:将类标识为控制器,并配合@RequestMapping注解处理HTTP请求。
3. @RequestMapping:定义请求的URL路径和HTTP请求方法。
4. @Autowired:自动装配Bean,可用于构造方法、属性、方法和参数上。
5. @Service:将类标识为服务层的Bean。
6. @Repository:将类标识为数据访问层的Bean。
7. @Component:通用的Bean注解,可用于任何类。
8. @RequestBody:接收HTTP请求的请求体内容。
9. @ResponseBody:将方法返回的对象转换为HTTP响应的内容。
10. @PathVariable:获取URL路径中的变量值。
11. @RequestParam:获取请求参数的值。
12. @Valid:启用参数校验。
13. @ConfigurationProperties:绑定配置文件或配置属性。
14. @Value:注入属性值。
15. @Bean:在配置类中声明Bean。
16. @ConditionalOnProperty:根据指定的属性值决定是否装配Bean。
17. @Transactional:启用事务管理。
18. @PostConstruct:在Bean初始化之后执行的方法。
19. @PreDestroy:在Bean销毁之前执行的方法。
20. @EnableAsync:启用异步方法。在这里插入代码片