Spring Boot是Spring框架对“约定优于配置(Convention Over Configuration)”理念的最佳实践产物。一个典型的Spring Boot应用本质上就是一个基于Spring框架的应用。Spring Boot使用注解的方式对Bean和配置进行收集,注册,分析和组装。简化了基于XML配置文件的开发。能够快速地构建出一个应用程序。以下注释基于Spring Boot 1.5.8.RELEASE。
通过以下注解,也可以了解Spring Boot的工作机制。
该注解是启动Spring Boot应用的注解,实际上它是一个复合Annotation。其实现如下:
@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 {
......
}
这其中我们需要关注的,只有三个Annotation:
@SpringBootConfigration
@EnableAutoConfiguration
@ComponentScan
如果我们使用以上三个annotation替换@SpringBootAnnotation,则与之前功能对等。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
}
该注解继承自@Configuration,两者的功能也一致,就是标注当前类为一个配置类。会将当前类声明的一个或多个以@Bean注解标记的方法实例纳入到Spring容器中,并且实例名就是方法名。
其父注解@Configuration就是JavaConfig形式的Spring Ioc容器配置类使用的那个@Configuration。Spring Boot启动时,需要加载的IoC容器的配置即由此定义。
@EnableAutoConfiguration的理念就是借助@Import的支持,收集和注册特定场景相关的Bean的定义。比如:
而@EnableAutoConfiguration也是借助@Import的帮助,将所有复合自动配置条件的Bean定义加载到IoC容器。仅此而已。
该注解定义如下:
@SuppressWarnings("deprecation")
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
......
}
其中最关键的要属@Import(EnableAutoConfigurationImportSelector.class),借助EnableAutoConfigurationImportSelector这个类,@EnableAutoConfiguration可以帮助Spring Boot应用将符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器。
具体的加载方式是通过SpringFactoriesLoader从指定的配置文件:META-INF/spring.factories加载配置。
所以,@EnableAutoConfiguration自动配置就变成了:从classpath中搜寻所有的META-INF/spring.factories配置文件,并将其中org.springframework.boot.autoconfigure.EnableAutoConfiguration对应的配置项通过反射实例化为对应的标注了@Configuration的JavaConfig形式的IoC容器配置类,然后汇总并加载到IoC容器中。
@ComponentScan的功能其实就是自动扫描并加载符合条件的组件或Bean定义,并最终将这些Bean定义加载到容器中。其作用是:
在Spring框架中,我们可使用@Conditional配合@Configuration或者@Bean等注解来干预一个配置或者Bean定义是否生效,其最终实现效果或者语义如下:
if(符合@Conditional规定的条件) {
加载当前配置或者注册当前Bean定义;
}
要实现基于条件的配置,我们只需要通过@Conditional指定自己的Condition实现类就可以了:
@Conditional({TheCondition1.class, TheCondition2.class, ...})
@Conditional可以作为父注解来标注其他注解实现类,从而构建各种各样的复合注解。SpringBoot实现了一批这样的注解用于简化开发:
有了这些复合注解的配合,我们就可以结合@EnableAutoConfiguration实现基于条件的自动配置了。这也就是所谓的“智能”自动配置。
在实现自动配置的过程中,除了基于条件配置,我们还需要提供配置或组件加载的顺序,从而让这些配置或者组件之间的依赖分析和组装可以顺利完成。
@AutoConfigureBefore让当前配置或组件在某个组件之前运行。
@AutoConfigureAfter让当前配置或组件在某个组件之后运行。
在Spring Boot中,有些变量需要根据需要配置在application.properties中,那我们可以通过@Value注解读取这些变量并注入。该注解可以注入:
其中在application.properties文件中配置的变量,Spring Boot在启动时自动加载。如果是自定义属性的文件应该如何加载呢?
@PropertySource用于读取指定目录下的文件,并加载。如:
@PropertySource(value = {"classpath:system-config.properties"},encoding="utf-8")
@Autowired是Spring 3.0引入的一个注解,可以标注在类的属性上,这样Spring容器就会以byType的方式来注入对应的Bean。
如果某个Type实现了多个Bean,则使用@Autowired时,需要根据@Qualifier注解来指定需要注入哪个实现类。也可以采用List或Map的方式将所有实现类一起注入。如果注入的是Map,则key为该Bean的id。
@Resource默认按照ByName自动注入,由J2EE提供,需要导入包javax.annotation.Resource。
@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为Bean的名字,而type属性则解析为Bean的类型。所以:
@Component用于将类实例化并注入IoC中。其他注解@Controller,@Service,@Respository的用法跟@Component差不多,比@Component带有更多的语义,他们分别对应了控制层,业务层和持久层的类。
@RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。 该注解有六个属性:
该注解用在方法的参数前面。其作用是获取request.getParameter(方法参数)的值,并将取得的值付给该参数。
路径变量。参数与大括号里的名字一样要相同。如:
@RequestMapping("user/get/user/{address}")
public String getByUserAddress(@PathVariable String address){
//do something;
}
使用@ResponseBody表示该方法的返回结果直接写入HTTP response body中。
@RequestBody用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上;再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。