【Spring boot】SpringApplication三板斧
SpringBoot程序启动入口的核心注解@SpringBootApplication,这个注解是由三部分组成:
- @SpringBootConfiguration,这个注解主要是继承@Configuration注解,主要用于加载配置文件。
- @ComponentScan,主要用于组件扫描和自动装配。
- @EnableAutoConfiguration,这个注释启用了Spring Boot的自动配置功能,可以自动为您配置很多东西。
一、@EnableAutoConfiguration
作用
启用了Spring Boot的自动配置功能,根据你pom.xml引入的xxx-boot-starter可以自动为配置很多东西。
流程图
- 我们引入starter的依赖,会将自动配置的类的jar引入。
- @SpringBootApplication的注解中有一个是@EnableAutoConfiguration注解,这个注解有一个@Import({EnableAutoConfigurationImportSelector.class}),
- EnableAutoConfigurationImportSelector内部则是使用了SpringFactoriesLoader.loadFactoryNames方法进行扫描具有META-INF/spring.factories文件的jar包。
- 应用在启动时就会加载spring-boot-autoconfigure的jar包下面的META-INF/spring.factories文件中定义的autoconfiguration类。
- 将configuration类中定义的bean加入spring到容器中。就相当于加载之前我们自己配置组件的xml文件。而现在SpringBoot自己定义了一个默认的值,然后直接加载进入了Spring容器。
- spring-boot-autoconfigure的jar包里面通过condition的方式判断是否将xxxx-starter(比如aop、jdbc。。。)初始化。(pom.xml引入了jar包才能初始化)。
作用
根据定义的扫描路径,把符合扫描规则的类装配到spring的bean容器中。
- 自定扫描路径下边带有@Controller,@Service,@Repository,@Component注解加入spring容器
- 通过includeFilters加入扫描路径下没有以上注解的类加入spring容器
- 通过excludeFilters过滤出不用加入spring容器的类
- 自定义增加了@Component注解的注解方式
使用方法
basePackages与value: 用于指定包的路径,进行扫描
@ComponentScan(basePackages = “”) //单个 @ComponentScan(basePackages = {“qqq”,“www”,“…”}) //多个 @ComponentScan("com.baker.learning.*") //通配符匹配所有的包
basePackageClasses: 用于指定某个类的包的路径进行扫描
@ComponentScan(basePackageClasses = “”) //单个 @ComponentScan(basePackageClasses = {“qqq”,“www”,“…”}) //多个
nameGenerator: bean的名称的生成器
useDefaultFilters: 是否开启对@Component,@Repository,@Service,@Controller的类进行检测
includeFilters: 包含的过滤条件 FilterType.ANNOTATION:按照注解过滤,FilterType.ASSIGNABLE_TYPE:按照给定的类型,FilterType.ASPECTJ:使用ASPECTJ表达式,FilterType.REGEX:正则,FilterType.CUSTOM:自定义规则
excludeFilters: 排除的过滤条件,用法和includeFilters一样
scopedProxy
resourcePattern
scopeResolver
三、@SpringBootConfiguration
作用
SpringBootConfiguration是一个组合注解,SpringBootConfiguration注解可以实现spring中xml配置文件配置的效果,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到spring容器中,并且实例名就是方法名。(也可以重新指定)。
@SpringBootConfiguration public class RestTemplateConfig { /** * 设置 * * @param factory * @return */ @Bean public RestTemplate restTemplate(HttpComponentsClientHttpRequestFactory factory) { return new RestTemplate(factory); } @Bean public HttpComponentsClientHttpRequestFactory simpleClientHttpRequestFactory() { HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(); //达到最大请求时间,请求将自动视为失败,结束当前进程。 factory.setReadTimeout(20000); //单位为ms factory.setConnectTimeout(20000); //单位为ms return factory; } }