目录
配置优先级
命令行参数>java系统属性properties>yml>yaml
SpringBoot 除了支持配置文件属性配置,还支持Java系统属性和命令行参数的方式进行属性配置。
1.
Bean管理
获取bean
默认情况下,Spring项目启动时,会把bean都创建好放在IOC容器中,如果想要主动获取这些bean,可以通过如下方式:
单元测试中:
@SpringBootTest
class SpringbootWebConfig2ApplicationTests {@Autowired
private ApplicationContext applicationContext; //IOC容器对象//获取bean对象
@Test
public void testGetBean(){
//根据bean的名称获取
DeptController bean1 = (DeptController) applicationContext.getBean("deptController");
System.out.println(bean1);//根据bean的类型获取
DeptController bean2 = applicationContext.getBean(DeptController.class);
System.out.println(bean2);//根据bean的名称 及 类型获取
DeptController bean3 = applicationContext.getBean("deptController", DeptController.class);
System.out.println(bean3);
}
bean作用域
作用域 | 说明 |
singleton | 容器内同 名称 的 bean 只有一个实例(单例)(默认) |
prototype | 每次使用该 bean 时会创建新的实例(非单例) |
@Lazy
public DeptController(){
sout("DeptController constructor ....");
}
//bean的作用域
@Test
public void testScope(){
for (int i = 0; i < 10; i++) {
DeptController deptController = applicationContext.getBean(DeptController.class);
System.out.println(deptController);
}
}@Autowired
private SAXReader saxReader;
第三方bean
如果要管理的bean对象来自于第三方(不是自定义的),是无法用 @Component 及衍生注解声明bean的,就需要用到 @Bean注解。
启动类:
//声明第三方bean
@Bean //将当前方法的返回值对象交给IOC容器管理,成为IOC容器的bean
public SAXReader saxReader(){
return new SAXReader();
}
测试类:
/第三方bean的管理
@Test
public void testThirdBean() throws Exception {
//SAXReader saxReader = new SAXReader();Document document = saxReader.read(this.getClass().getClassLoader().getResource("1.xml"));
Element rootElement = document.getRootElement();
String name = rootElement.element("name").getText();
String age = rootElement.element("age").getText();System.out.println(name + " : " + age);
}
@Test
public void testGetBean2(){
Object saxReader = applicationContext.getBean("reader");
System.out.println(saxReader);
}
底层原理
起步依赖
自动配置原理
springBoot的自动配置就是当spring容器启动后,一些配置类、bean对象就自动存入到了IOC容器中,不需要我们手动去声明,从而简化了开发,省去了繁琐的配置操作。
springBoot只能扫描启动类 所在包及其子包 ,扫描不到其他包
自动配置原理核心在SpringBootApplication注解上,里面底层包含3个注解,最为核心的是EnableAutoConfiguration,这个注解的底层封装了一个注解import,里面指定了一个类:ImportSelector这个接口的实现类,在实现类当中,需要去实现ImportSelector这个接口当中的一个方法selectImports,这个方法返回值代表的就是我需要将哪些类交给spring的IOC容器进行管理,此时,会读取两份配置文件AutoConfiguration.import文件当中定义的就是配置类的全类名,在这个配置类当中,我们可以通过bean注解,来声明一个一个bean对象,最终项目启动,加载配置文件当中所配置的配置类,将配置类信息封装到String类型的数组当中,最终通过import注解,将配置类全部加载到spring的IOC容器当中,交给IOC容器进行管理
方式1:@ComponentScan 组件扫描(不推荐)
方式2:@Import 导入。使用@Import导入的类会被Spring加载到IOC容器中,导入形式主要有以下几种:
导入 普通类 @Import({TokenParser.class})
导入 配置类@Import({HeaderConfig.class})
导入 ImportSelector 接口实现类@Import({MyImportSelector.class})
@EnableXxxx注解,封装@Import注解 @EnableHeaderConfig
源码跟踪
@SpringBootApplication
该注解标识在SpringBoot工程引导类上,是SpringBoot中最最最重要的注解。
该注解由三个部分组成:
@SpringBootConfiguration:该注解与 @Configuration 注解作用相同,用来声明当前也是一个配置类。
@ComponentScan:组件扫描,默认扫描当前引导类所在包及其子包。 @EnableAutoConfiguration:SpringBoot实现自动化配置的核心注解。
条件装配的注解
(在所有的配置类当中所有的bean不是全部加载到spring的IOC容器当中,里面注解开头为
自定义starter
场景:在实际开发中,经常会定义一些公共组件,提供给各个项目团队使用。而在SpringBoot的项目中,一般会将这些公共组件封装为SpringBoot 的 starter。