Springboot 注解运行原理
参考链接
注解的本质就是一个继承了 Annotation 接口的接口
注解(Annotation)也被称为元数据(metadata),它是一种用于在代码中添加元数据、说明和标记的特殊语法。注解可以用来指示编译器进行额外的检查、生成代码等操作,也可以在运行时对代码进行解析和处理。 注解本质上就是一个接口,它继承自 Annotation 接口。该接口中定义了注解的属性(element),每个属性都有一个名称和类型。注解中的属性可以有默认值。注解使用 @interface 关键字来声明,类似于定义接口。 在使用注解时,需要通过注解处理器来解析和处理注解信息。Java 提供了一些标准的注解(如 @Override、@Deprecated、@SuppressWarnings 等),也允许用户自定义注解。
在 Spring Boot 中,注解起到了非常重要的作用,Spring Boot 通过注解来配置和管理应用程序中的各种组件和功能。以下是一些常见的 Spring Boot 注解:
- @SpringBootApplication:标记应用程序的主类,表示这是一个 Spring Boot 应用程序,并自动扫描包以配置 Spring 环境。
- @RestController:将控制器类标记为 RESTful Web 服务的处理程序。
- @RequestMapping:将请求映射到处理程序方法上。
- @Autowired:将依赖项自动装配到使用它的类中。
- @ConfigurationProperties:将应用程序属性绑定到 POJO 类中。
在Spring Boot中,注解传递的值方式
直接赋值:在注解上直接赋值即可,如:
@Service("myService")
public class MyServiceImpl implements MyService {
// ...
}
使用表达式:使用Spring表达式语言(SpEL)可以在注解中使用表达式,如:
@Value("#{systemProperties['user.timezone']}")
private String timezone;
引用其他bean:可以在注解中引用其他bean,
@Autowired
private SomeDependency dependency;
通过工厂方法传递:可以通过调用工厂方法的方式来传递值,如:
@Bean
public SomeBean someBean() {
return new SomeBean(someValue);
}
注解与反射的关系
注解是通过反射机制实现的。反射是指程序可以访问、检测和修改它本身状态或行为的一种能力。
下面以Springboot中的@Controller注解为例:
@Controller @RequestMapping("/hello")
public class HelloController {
@GetMapping
public String hello() {
return "hello";
}
}
上述代码中,
@Controller是一个注解,它告诉Spring框架这是一个控制器类。
@RequestMapping("/hello")表示将该控制器映射到/hello路径。
@GetMapping表示当请求方法为GET时,将调用hello()方法。
在Springboot启动时,它会扫描所有带有@Controller注解的类,并且使用反射机制来获取这些类的信息。
通过反射,Spring框架可以获取这些类的注解信息,包括注解的名称、内容等。
例如,可以通过以下代码获得HelloController类的@Controller注解:
Class<HelloController> clazz = HelloController.class;
Annotation annotation = clazz.getAnnotation(Controller.class);
注解本质上是一种特殊的接口类型,并且可以通过反射机制来处理它们。
因此,我们可以使用反射API来获取注解所包含的元数据信息,例如注解的值、属性等。
例如,通过以下代码可以获取@RequestMapping注解的值:
RequestMapping requestMapping = clazz.getAnnotation(RequestMapping.class);
String value = requestMapping.value()[0];
总之,Springboot中注解和反射的关系可以简单地描述为:Springboot通过反射机制获取注解信息,从而实现了自动化配置和依赖注入