当前位置: 首页 > 后端技术 > Java

SpringBoot&@SpringBootApplication

时间:2023-04-02 09:17:45 Java

SpringBootSpringBoot是Java应用程序的开发框架。基于Spring4.0的设计,继承了Spring框架原有的优良特性,通过简化配置,进一步优化了Spring应用的整个构建和开发过程。SpringBoot集成了大量的框架。解决了依赖包版本冲突和引用不稳定的问题。SpringBoot特性创建独立的Spring应用程序,内嵌Tomcat或Jetty和其他Servlet容器。应用打包后,可以直接运行。提供一系列预设配置,尽可能简化配置。自动配置Spring容器和三方类库,以提供生产就绪的功能,例如指标、健康检查和外部配置。不需要代码生成,也不需要XML配置。自动组装就是从spring.factories文件中获取对应的需求自动组装类,生成对应的Bean对象,然后交给spring容器管理。自动装配是SpringBoot的核心。我们只需要引入一个starter组件依赖即可实现自动组装依赖org.springframework.bootspring-boot-starter-parent2.6.3Startupclass@SpringBootApplicationpublicclassDemoApplication{publicstaticvoidmain(String[]args){SpringApplication.run(DemoApplication.class,args);}}@SpringBootApplication@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@SpringBootConconfiguration@EnableAutoConfiguration@ComponentScan(excludeFilters={@Filter(type=FilterType.CUSTOM,classes=TypeExcludeFilter.class),@Filter(type=FilterType.CUSTOM,classes=AutoConfigurationExcludeFilter.class)})public@interfaceSpringBootApplication{//内容省略}从源码可以看出,@SpringBootApplication其实是由3个关键注解组成的@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan@SpringBootConfiguration@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Configuration@Indexedpublic@interfaceSpringBootConfiguration{//内容省略}从源码可以看出,@SpringBootConfiguration其实是一个@Configuration注解,就是让当前类作为配置类被Spring的IOC容器管理@ComponentScan@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.TYPE})@Documented@Repeatable(ComponentScans.class)public@interfaceComponentScan{//内容省略}从源码可以看出@ComponentScan相当于在配置context:component-scanxml文件,SpringBoot会默认扫描当前类包及其子包中注解为@Component、@Service、@Controller等的所有类@EnableAutoConfiguration@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@AutoConfigurationPackage@Import(AutoConfigurationImportSelector.class)public@interfaceEnableAutoConfiguration{//内容省略}从源码看,@EnableAutoConfiguration是@的组合AutoConfigurationPackage和@Import注解,以及AutoConfigurationImportSelector是自动装配的核心;AutoConfigurationImportSelector实现顶层接口ImportSelector。在selectImports方法中,首先判断SpringBoot是否开启自动配置。如果启用,则会进一步获取需要自动组装的类。@OverridepublicString[]selectImports(AnnotationMetadataannotationMetadata){if(!isEnabled(annotationMetadata)){返回NO_IMPORTS;}AutoConfigurationEntryautoConfigurationEntry=getAutoConfigurationEntry(annotationMetadata);返回StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());}protectedAutoConfigurationEntrygetAutoConfigurationEntry(AnnotationMetadataannotationMetadata){如果(!isEnabled(annotationMetadata)){返回EMPTY_ENTRY;}安otationAttributes属性=getAttributes(annotationMetadata);List配置=getCandidateConfigurations(annotationMetadata,attributes);配置=removeDuplicates(配置);Setexclusions=getExclusions(annotationMetadata,attributes);checkExcludedClasses(配置,排除);配置.removeAll(排除);配置=getConfigurationClassFilter().filter(配置);fireAutoConfigurationImportEvents(配置,排除);returnnewAutoConfigurationEntry(configurations,exclusions);}protectedListgetCandidateConfigurations(AnnotationMetadatametadata,AnnotationAttributesattributes){List配置=SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),getBeanClassLoader());Assert.notEmpty(configurations,"在META-INF中找不到自动配置类/spring.factories.如果你“+”使用的是自定义包装,确保文件是正确的。”);returnconfigurations;}关键点在代码行SpringFactoriesLoader.loadFactoryNamespublicfinalclassSpringFactoriesLoader{/***看的位置用于工厂。*

可以存在于多个JAR文件中。*/publicstaticfinalStringFACTORIES_RESOURCE_LOCATION="META-INF/spring.factories";privatestaticfinalLoglogger=LogFactory.getLog(SpringFactoriesLoader.class);staticfinalMap>>cache=newConcurrentReferenceHashMap<>();privateSpringFactoriesLoader(){}至此可以看出为什么SpringBoot的依赖中会有.factories文件,loadFactoryNames方法会到META-INF/spring.factories文件中根据EnableAutoConfiguration的全限定类名获取我们需要导入的类,EnableAutoConfiguration类的全限定类名是org.springframework.boot.autoconfigure.EnableAutoConfiguration@AutoConfigurationPackage@AutoConfigurationPackage注解会加上这个注解类所在的包作为自动配置包进行管理。也就是说,当SpringBoot应用启动时,默认会使用启动类所在的包作为自动配置包。总结SpringBoot是一个基于Spring的框架SpringBoot预置了很多依赖,简化了Spring独创的配置,让开发更简单快捷SpringBoot通过AutoConfigurationImportSelector和META-INF/spring.factories省去部分类的配置过程,实现自动组装