@SpringBootApplication
public class MysteelEnglishWebApplication {
public static void main(String[] args) {
SpringApplication.run(MysteelEnglishWebApplication.class, args);
}
}
@SpringBootApplication: Springboot应用标注在某个类上说明这个类是springboot的主配置类,springboot就是运用这个类的main方法来启动springboot应用。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {}
@SpringBootConfiguration:Springboot的配置类,标注在某个类上,表示这是一个SpringBoot的配置类;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {}
@Configuration:spring配置类,相当于xml中的
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
String value() default "";
}
@Component: spring组件,自身交给spring IOC容器托管,相当于
@EnableAutoConfiguration:开启自动装配功能
以前我们需要配置的东西,现在Springboot帮我们自动配置:@EnableAutoConfiguration告诉springboot开启自动装配功能。
@EnableAutoConfiguration
------------------->
@Import(EnableAutoConfigurationImportSelector.class)
@AutoConfigurationPackage
——————----->
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {}
@AutoConfigurationPackage:自动配置包路径
@AutoConfigurationPackage注解的功能是由@Import注解实现的,它是spring框架的底层注解,它的作用就是给容器中导入某个组件类,例如@Import(AutoConfigurationPackages.Registrar.class),它就是将Registrar这个组件类导入到容器中,可查看Registrar类中registerBeanDefinitions方法,这个方法就是导入组件类的具体实现 :
@AutoConfigurationPackage注解的主要作用就是将主程序类所在包及所有子包下的组件到扫描到spring容器中。
@Import(EnableAutoConfigurationImportSelector.class)
@Import(EnableAutoConfigurationImportSelector.class): 给容器导入组件
AutoConfigurationImportSelector:导入哪些组件的选择器;
将所有需要导入的组件以全类名的方式返回;这些组件会被添加其中
会给容器中导入非常多的自动配置类(xxxAutoConfiguration):就是给容器中导入这个场景需要的所有组件,并配置好这些组件
List<String> configurations = getCandidateConfigurations(annotationMetadata,
attributes);
//通过该方法获取所有配置
SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class,beanClassLoader)(loadFactoryNames)方法,用类加载器获取配置资源
获取springboot-auto-configuration.jar下的的META-INF/spring.factories资源
结论:SpringBoot不需要写配置文件的原因是,SpringBoot所有配置都是在启动的时候进行扫描并加载,Springboot的自动配置类都在spring.factories里面,但是不一定生效,生效前需要判断条件是否成立(通过@ConditionalOnClass,@ConditionalOnMissingBean,@ConditionalOnProperty进行判断),只需要导入对应的start的jar包,就有了对应的启动器,有了启动器就能帮我们自动装配了。
Spring的自动装配原理:Spring Boot启动的时候会通过@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自动配置类,并对其进行加载,这些自动配置类都是以AutoConfiguration结尾来命名的,它实际上就是一个JavaConfig形式的Spring容器配置类,通过@Bean导入到Spring容器中,以Properties结尾命名的类是和配置文件进行绑定的。它能通过这些以Properties结尾命名的类中取得在全局配置文件中配置的属性,我们可以通过修改配置文件对应的属性来修改自动配置的默认值,来完成自定义配置
启动类的@SpringBootApplication注解由@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan三个注解组成,三个注解共同完成自动装配;
在SpringBoot中,约定大于配置可以从以下两个方面来理解:
开发人员仅需规定应用中不符合约定的部分
在没有规定配置的地方,采用默认配置,以力求最简配置为核心思想总的来说,上面两条都遵循了推荐默认配置的思想。当存在特殊需求的时候,自定义配置即可。这样可以大大的减少配置工作,这就是所谓的“约定”。
详情看这