Spring Boot从一开始就告诉咱们,她更喜欢基于Java的配置,即注解的方式。因此她提供了一大堆注解,并让咱们习惯使用注解。其最大的特色是无需 XML 配置文件,能自动扫描包路径装载并注入对象,并能作到根据 classpath 下的 jar 包自动配置。这个过程摒弃了spring以往项目中大量繁琐的配置,经过自身默认配置,极大的下降了项目搭建的复杂度。一样在spring boot中,大量注解的使用,使得代码看起来更加简洁,提升开发的效率。这些注解不光包括spring boot自有,也有一些是继承自spring的。java
若是说注释是写给人看的,那么注解就是写给程序看的。它更像一个标签,贴在一个类、一个方法或者字段上。它的目的是为当前读取该注解的程序提供判断依据。好比程序只要读到加了@Test的方法,就知道该方法是待测试方法,又好比@Before注解,程序看到这个注解,就知道该方法要放在@Test方法以前执行。
注解就像一个标签,是贴在程序代码上供另外一个程序读取的。因此三者关系是程序员
注解就像标签,是程序判断执行的依据。好比,程序读到@Test就知道这个方法是待测试方法,而@Before的方法要在测试方法以前执行
注解须要三要素:定义、使用、读取并执行。
注解分为自定义注解、JDK内置注解和第三方注解(框架)三种。自定义注解通常要咱们本身定义、使用、并写程序读取,而JDK内置注解和第三方注解咱们只要懂得使用,定义和读取这些咱们交给它们,初学者别管太多,先攻城略地。
大多数状况下,三角关系中咱们只负责使用注解,无需定义和执行,框架会将注解类和读取注解的程序隐藏起来,除非阅读源码,不然根本看不到。平时见不到定义和读取的过程,光顾着使用注解,这样就很容易让咱们忘了注解如何起做用了spring
public @interface 注解名称{ 属性列表; }
大体分为三类:自定义注解、JDK内置注解、还有第三方框架提供的注解。
自定义注解就是咱们本身写的注解。JDK内置注解,好比@Override检验方法重载,@Deprecated标识方法过时等。第三方框架定义的注解好比SpringMVC的@Controller等。app
在某种意义上,注解和反射实际上是很类似的。所谓反射实际上是Java 在程序运行时,对于任意一个类,都可以知道这个类的全部属性和方法;而对于任意一个对象,都可以调用它的任意一个方法和属性。这种动态的获取信息以及动态调用对象的方法 的功能称为 java 的反射机制。
反射机制很重要的一点就是“运行时”,其使得咱们能够在程序运行时加载、探索以及使用编译期间彻底未知的 .class 文件。换句话说,Java 程序能够加载一个运行时才得知名称的 .class 文件,而后获悉其完整构造,并生成其对象实体、或对其 fields(变量)设值、或调用其 methods(方法)。框架
Indicates that a class declares one or more @Bean methods and may be processed by the Spring container to generate bean definitions and service requests for those beans at runtime
org.springframework.context.annotation.Configurationide
这是 Spring 3.0 添加的一个注解,用来代替 applicationContext.xml 配置文件,全部这个配置文件里面能作到的事情均可以经过这个注解所在类来进行注册。咱们不妨看看下面几个相关注解也是很是重要的!学习
Indicates that a method produces a bean to be managed by the Spring container.测试
用来代替 XML 配置文件里面的 <bean ...> 配置。spa
若是有些经过类的注册方式配置不了的,能够经过这个注解引入额外的 XML 配置文件,有些老的配置文件没法经过 @Configuration 方式配置的很是管用。3d
用来引入额外的一个或者多个 @Configuration 修饰的配置文件类。
这个注解就是 @Configuration 注解的变体,只是用来修饰是 Spring Boot 配置而已,或者可利于 Spring Boot 后续的扩展,源码以下。
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration public @interface SpringBootConfiguration { }
Configures component scanning directives for use with @Configuration classes. Provides support parallel with Spring XML’s <context:component-scan> element.
org.springframework.context.annotation.ComponentScan
这是 Spring 3.1 添加的一个注解,用来代替配置文件中的 component-scan 配置,开启组件扫描,即自动扫描包路径下的 @Component 注解进行注册 bean 实例到 context 中。
另外,@ComponentScans 是可重复注解,便可以配置多个,用来配置注册不一样的子包。
Enable auto-configuration of the Spring Application Context, attempting to guess and configure beans that you are likely to need. Auto-configuration classes are usually applied based on your classpath and what beans you have defined.
org.springframework.boot.autoconfigure.EnableAutoConfiguration
看全路径就知道,这是自 Spring Boot 诞生时添加的注解,用来提供自动配置,上面的两个都是 spring-context 包下的,不属于 Spring Boot,因此 Spring 3.0 以后的去 XML 配置方式已经为 Spring Boot 埋下了伏笔!
其实这个 @SpringBootApplication 注解就包含了以上 3 个主要注解,平时没有自定义配置的需求,则使用 @SpringBootApplication 注解彻底就能够了!
让咱们来看下 @SpringBootApplication 注解的源码
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan( excludeFilters = {@Filter( type = FilterType.CUSTOM, classes = {TypeExcludeFilter.class} ), @Filter( type = FilterType.CUSTOM, classes = {AutoConfigurationExcludeFilter.class} )} ) public @interface SpringBootApplication { @AliasFor( annotation = EnableAutoConfiguration.class ) Class<?>[] exclude() default {}; @AliasFor( annotation = EnableAutoConfiguration.class ) String[] excludeName() default {}; @AliasFor( annotation = ComponentScan.class, attribute = "basePackages" ) String[] scanBasePackages() default {}; @AliasFor( annotation = ComponentScan.class, attribute = "basePackageClasses" ) Class<?>[] scanBasePackageClasses() default {}; }
观察下面这张图,咱们能够更加直观切深入的感觉到SpringBootApplication的源码中的注入依赖关系:)
参考资料:
- Spring Boot 最核心的 3 个注解详解https://link.zhihu.com/?target=http%3A//www.imooc.com/article/254495
- Spring注解https://zhuanlan.zhihu.com/p/60941426
- spring注解学习https://www.jianshu.com/p/7905decddb8e