SpringBoot优点
- 创建独立Spring应用
- 内嵌web服务器
- 自动starter依赖,简化构建配置(各种依赖包)
- 自动配置Spring以及第三方功能(各种初始化类)
- 提供生产级别的监控、健康检查及外部化配置
- 无代码生成、无需编写XML
SpringBoot特点
- 依赖管理:父项目做依赖管理
- 按需加载自动配置项:存在对应的 start 则自动加载配置项
容器功能
@Configuration
#############################Configuration使用示例######################################################
@Configuration(proxyBeanMethods = false)
public class MyConfig {
@Bean
就是组件在容器中的实例
public User user01(){
User zhangsan = new User("zhangsan", 18);
zhangsan.setPet(tomcatPet());
return zhangsan;
}
@Bean("tom")
public Pet tomcatPet(){
return new Pet("tomcat");
}
}
################################@Configuration测试代码如下########################################
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan("com.atguigu.boot")
public class MainApplication {
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
String[] names = run.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
Pet tom01 = run.getBean("tom", Pet.class);
Pet tom02 = run.getBean("tom", Pet.class);
System.out.println("组件:"+(tom01 == tom02));
MyConfig bean = run.getBean(MyConfig.class);
System.out.println(bean);
User user = bean.user01();
User user1 = bean.user01();
System.out.println(user == user1);
User user01 = run.getBean("user01", User.class);
Pet tom = run.getBean("tom", Pet.class);
System.out.println("用户的宠物:"+(user01.getPet() == tom));
}
}
@Import
* @Import({User.class, DBHelper.class})
* 给容器中自动创建出这两个类型的组件、默认组件的名字就是全类名
*
*
*
*/
@Import({User.class, DBHelper.class})
@Configuration(proxyBeanMethods = false)
public class MyConfig {
}
@ImportResource
导入配置文件组件(Resource 下的xml资源文件,原来以xml配置各种对象的配置文件)
配置绑定
- @Component@ConfigurationProperties(prefix = “mycar”)
只有在容器中的组件,才可以使用@ConfigurationProperties
- @EnableConfigurationProperties + @ConfigurationProperties
@EnableAutoConfiguration 自动导入注解说明
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {}
- @AutoConfigurationPackage
将指定的一个包下的所有组件导入进来?MainApplication 所在包下。
- @Import(AutoConfigurationImportSelector.class)
1、利用getAutoConfigurationEntry(annotationMetadata);
给容器中批量导入一些组件
2、调用
List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes)
获取到所有需要导入到容器中的配置类
3、利用工厂加载
Map<String, List<String>> loadSpringFactories(@Nullable
ClassLoader classLoader);得到所有的组件
4、从META-INF/spring.factories位置来加载一个文件。
默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件
spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面也有
META-INF/spring.factories
不会,按照条件装配规则(@Conditional),最终会按需配置。