SpringBoot在配置上相比spring要简单许多,其核心在于spring-boot-starter,在使用spring boot来搭建一个项目时,只需要引入官方提供的starter,就可以直接使用,免去了各种配置。starter简单来讲就是引入了一些相关依赖和一些初始化的配置。
Spring官方提供了很多starter,第三方也可以定义starter。为了加以区分,starter从名称上进行了如下规范:
自动配置,就是无须手动配置xml,自动配置并管理bean,可以简化开发过程
自动配置涉及到如下几个关键步骤:
在我们常用的Starter下我们都可以找到一个叫做XXXAutoConfigure的自动配置类,都会存在一个@Configuration
注解(@org. springframework.context.annotation.Configuration
),其中写了很多的Bean
如:
@Configuration
class xxx{
@Bean
public xxx xxBean(){
}
}
@ConditionalOnClass
:某个class位于类路径上,才会实例化这个Bean@ConditionalOnBean
:仅在当前上下文中存在某个bean时,才会实例化这个Bean@ConditionalOnExpression
:当表达式为true的时候,才会实例化这个Bean@ConditionalOnMissingBean
:仅在当前上下文中不存在某个bean时,才会实例化这个Bean@ConditionalOnMissingClass
:某个class在类路径上不存在的时候,才会实例化这个Bean@ConditionalOnNotWebApplication
:不是web应用时才会实例化这个Bean@AutoConfigureAfter
:在某个bean完成自动配置后实例化这个bean@AutoConfigureBefore
:在某个bean完成自动配置前实例化这个bean当我们进行自动配置的时候需要获取yaml或properties文件中的配置参数,这样才能让Bean进行参数获取
例如在Mybatis中有个DataSourceAutoConfiguration的类用于进行数据源的的相关自动注入,上面有个@EnableConfigurationProperties
注解设置了以DataSourceProperties
这个类作为数据源的真实“映射”类@EnableConfigurationProperties(DataSourceProperties.class)
而在DataSourceProperties
这个类中有个@ConfigurationProperties(prefix = "spring.datasource")
的注解来获取yaml中的配置参数
spring boot默认扫描启动类所在的包下的主类与子类的所有组件,但并没有包括依赖包中的类,那么依赖包中的bean是如何被发现和加载的?
我们需要从Spring Boot项目的启动类开始跟踪,在启动类上我们一般会加入@SpringBootApplication
注解,其中的核心注解如下:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
根据源码跟踪我们会找到在SpringFactoryLoader
类中有一个loadFactoryNames
的方法,用于对Bean进行发现,在程序启动的时候会去查找resource/META-INFO/spring.factories
这个文件进行Bean的发现
在该文件中有标识了org.springframework.boot.autoconfigure. EnableAutoConfiguration = xxxxAutoConfiguration
以此来获取到自动配置类让Spring找到
在Spring Boot应用中要让一个普通类交给Spring容器管理,通常有以下方法:
@Configuration与@Bean
注解@Controller ,@Service ,@Repository ,@Component
注解标注该类并且启用@ComponentScan
自动扫描@Import
方法其中Spring Boot实现自动配置使用的是@lmport注解这种方式,AutoConfigurationImportSelector
类的selectlmports
方法返回一组从META-INF/spring.factories
文件中读取的bean的全类名,这样Spring Boot就可以加载到这些Bean并完成实例的创建工作。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
注意点:
我们需要删除starter中的spring-boot-maven-plugin
,就是这段配置
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
@Data
@AllArgsConstructor
@NoArgsConstructor
@ConfigurationProperties(prefix = "shower")
public class TestProperties {
private String msg;
private int code;
}
shower:
code: 110
msg: test for starter
@EnableConfigurationProperties(TestProperties.class)
@Configuration
public class TestAutoConfiguration {
//通过构造方法进行注入
private TestProperties testProperties;
public TestAutoConfiguration(TestProperties testProperties){
this.testProperties = testProperties;
}
@Bean
@ConditionalOnMissingBean
public TestService testService(){
return new TestService(testProperties.getMsg(), testProperties.getCode());
}
}
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.starter1.TestAutoConfiguration
<dependency>
<groupId>com.example</groupId>
<artifactId>starter1</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
当我们要使用的时候直接使用@Autowired
注解进行注入使用即可
@RestController
public class TestController {
@Autowired
private TestService testService;
@GetMapping("/test")
public String test(){
return testService.showInfo();
}
}