1. SpringBoot中配置文件的优先级?
properties>yml>yaml
2. SpringBoot中配置端口有哪些方式,优先级是怎样的?
命令行参数>Java系统属性>用配置文件
- 命令行参数(--xxxx=xxxx)
- Java系统属性(-Dxxxx=xxxx)
3. 能够说出bean的两种常见的作用域及如何设置作用域
singleton:容器内同 id 的 bean 只有一个实例(单例)(默认)
prototype:每次使用该 bean 时会创建新的实例(非单例)
4. 怎么使用@Bean注解来管理第三方bean
如果要管理的对象是来自于第三方的(不是自定义的),是无法直接使用 @Component 及衍生注解来声明 bean 对象的,就需要用到 @Bean注解。
@SpringBootApplication
public class SpringbootThirdbeanApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootThirdbeanApplication.class, args);
}
@Bean
public BASE64Decoder base64Decoder(){
return new BASE64Decoder();
}
}
如果要管理的第三方 bean 比较多,建议对这些bean进行集中分类配置,可以通过 @Configuration 注解声明一个配置类。
@Configuration
public class CommonConfig {
@Bean
public BASE64Encoder base64Encoder(){
return new BASE64Encoder();
}
@Bean
public BASE64Decoder base64Decoder(){
return new BASE64Decoder();
}
}
注意事项:通过 @Bean 注解的name属性 或 value 属性可以声明 bean 的名称,如果不指定,默认bean的名称就是方法名。
@Component 及衍生注解与 @Bean注解的使用场景:
- 项目中自定义的,直接使用@Component及其衍生注解来声明bean即可。
- 项目中引入的第三方的,使用@Bean注解声明bean即可。
5. @Conditional注解和@Import注解的作用是什么?
5.1 @Conditional
SpringBoot 提供了很多@Conditional10nXxx注解,来判断当达成某一条件后,才加载对应的Bean。
作用:按照一定的条件进行判断,需要声明的Bean,在满足给定条件后才会注册到Spring IOC容器中
@Conditional本身还是一个父注解,派生出大量的子注解:
- @ConditionalOnClass:判断环境中是否有对应字节码文件,才注册bean到IOC容器。
- @ConditionalOnMissingBean:判断环境中没有对应的bean ,才注册bean到IOC容器。
- @ConditionalOnProperty:判断配置文件中是否有对应属性和值,才注册bean到IOC容器。
5.2 @import
@Import注解用于导入一些Bean 和 配置类到IOC容器中。
问题:SpringBoot是否能够直接加载第三方Bean?
不能。因为第三方Bean很大可能和当前项目包结构不匹配。故而可以采用@Import注解导入
@Import注解主要可以导入形式有以下几种:
- Bean
- 配置类
- ImportSelector接口子类
SpringBoot自动配置采用的是第三种。
6. 简要的说出springboot自动配置的原理?
当SpringBoot 程序启动时,引导类上 @SpringBootApplication 注解生效,该注解由三个注解组成
1. @SpringBootConfiguration:引导类也是一个配置类
2. @ComponentScan:包扫描
3. @EnableAutoConfiguration:自动配置。
底层为:@Import(AutoConfigurationImportSelector.class),通过@Import导入配置类
SpringBoot程序在启动时会自动加载META-INF/spring.factories 文件 和
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件
并导入其中定义的所有配置类。由于这些配置类上都加了Condition条件注解,所以不会将所有Bean 加载到IOC容器中,只有满足条件的Bean才会加载。