springboot2——3 自动配置的源码解析及开发技巧

1 @SpringBootApplication

@SpringBootApplication注解标注在主程序类上,其底层有@SpringBootConfiguration、@EnableAutoConfiguration 、@ComponentScan:

  • @SpringBootConfiguration:@SpringBootConfiguration底层有一个@Configuration,表明当前类是一个配置类;
  • @ComponentScan:指定要扫描哪些包
  • @EnableAutoConfiguration:由@AutoConfigurationPackage和@Import组成。

@AutoConfigurationPackage底层是@Import({Registrar.class}),是利用Registrar将主程序所在的包及其子包的所有组件注册到容器中,这也就解释了springboot包扫描的默认规则即默认扫描主程序所在的包及其子包。
@Import利用其中的方法,首先在springboot一启动时给容器中加载的所有自动配置类,共计127个,这127个自动配置类是写死在文件中的,之后利用条件装配规则(@Conditional)完成按需配置。
在这里插入图片描述

		@Bean//组件名就叫方法名multipartResolver
        @ConditionalOnBean({MultipartResolver.class})//容器中有该类型才生效
        @ConditionalOnMissingBean(
            name = {"multipartResolver"}
        )//容器中没有multipartResolver这个名字的组件才生效
        public MultipartResolver multipartResolver(MultipartResolver resolver) {
            //@Bean的方法中的参数从容器中找
            return resolver;
        }
        //最终结果是如果用户自己配的multipartResolver不叫multipartResolver
        //可以自动变成multipartResolver,达到规范配置的效果

通过查看底层源码,发现springboot默认会配置好所有的组件,但是如果用户也配置了以用户的优先。

1.1 总结

  • springboot会先加载所有自动配置类 xxxxxAutoConfiguration
  • 每个自动配置类按条件生效,而且默认会绑定配置文件指定的值,这个值在xxxxProperties里面拿,xxxProperties和配置文件进行了绑定
  • 生效的自动配置类会向容器中注册许多组件
  • 有了组件就有了相应的功能,但是只要用户也配置了组件,以用户的优先
  • 定制化配置两种方法:直接在配置类中用@Bean替换组件;在创建的配置文件中使用配置项修改默认的配置信息。比如说配置字符编码格式在HttpEncodingAutoConfiguration里的注解中可以得知

1.2 springboot使用步骤

在简单了解了自定配置的原理后,总结了springboot的使用流程如下:

  • 引入场景依赖
  • 查看自动配置了哪些(选做),可以自己分析,默认场景对应的自动配置一般都生效,或者在application.properties配置文件中用debug=true开启自动配置报告,其中Positive(生效组件)、Negative(不生效组件)
  • 查看是否需要修改配置项:可以通过查看文档 配置项参考文档进行修改,或者自己分析xxxxProperties里对应的前缀
  • 如果修改配置项不能满足要求,可以直接用@Component和@Bean往容器中添加组件,或者用自定义器 xxxCustomizer

2 开发技巧

2.1 lombok

简化javabean的开发,省去gettersetter方法、tostring方法、无参构造、全参构造方法、日志等
使用步骤:

  • 导入依赖
<dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
</dependency>
  • 在IDE下载插件
  • 在javabean加上注解,其中@Data取代gettersetter方法、@NoArgsConstructor取代无参构造、@AllArgsConstructor取代全参构造、@ToString取代toString方法、@EqualsAndHashCode取代hashcode方法
  • 在类上加注解@Slf4j,通过log.info方法可以打印日志

2.2 dev-tools

dev-tools是伪热更新,本质上是重新编译项目
使用步骤:

  • 导入依赖
dependency> 	
	<groupId>org.springframework.boot</groupId> 	
	<artifactId>spring-boot-devtools</artifactId>
	<optional>true</optional>
</dependency> 
  • Crtl F9进行重新编译

2.3 Spring Initailizr(项目初始化向导)

直接创建一个springBoot项目,可以对需要的场景进行勾选,创建完成之后就会自动生成SpringBoot项目相应的主程序类、pom.xml文件等,其中resource文件下的statics放静态资源,templates放页面。
注意,生成项目后,删掉.mvn文件夹下的properties文件,之后更改maven的设置
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值