SpringBoot2零基础到精通之自动配置底层分析及小技巧

 更新时间:2022年03月22日 14:58:24   作者:扎哇太枣糕  
SpringBoot是一种整合Spring技术栈的方式(或者说是框架),同时也是简化Spring的一种快速开发的脚手架,本篇让我们一起学习自动配置的底层分析与一些开发中的小技巧

1 自动配置底层分析

1.1 ​自动配置注解解析

@SpringBootApplication注解是SpringBoot的核心注解,他是由以下三个注解总和而成.

@SpringBootConfiguration

该注解底层有一个@Configuration注解,标明当前类是一个配置类

@EnableAutoConfiguration该注解又由以下两个注解组合而成

  • @AutoConfigurationPackage:底层使用@Import({Registrar.class})向容器中注册组件,Registrar.class里获取到主程序所在的包并将包下的所有组件导入进来,这也就间接说明了SpringBoot的默认包扫描规则: 主程序(MainApplication)所在的包及这个包的所有子包都会被扫描

  • @Import(AutoConfigurationImportSelector.class):AutoConfigurationImportSelector.class下有一个selectImports方法,方法里面又使用getAutoConfigurationEntry内部的getCandidateConfigurations方法获取需要注册的组件都有哪些,getCandidateConfigurations方法里面使用SpringFactoriesLoader.loadFactoryNames内层的loadSpringFactories方法里的getResources(“META-INF/spring.factories”)默认扫描当前系统里面所有jar包META-INF/spring.factories位置下的文件。后面发现spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面也有META-INF/spring.factories文件,文件里面有个EnableAutoConfiguratio配置项写死了spring-boot一启动就要给容器中加载的所有配置类。虽然我们127个场景中自动配置启动的时候默认全部加载所有的xxxxAutoConfiguration,但是最终按照条件装配规则(@Conditional)按需配置。

@ComponentScan 这个注解定义了包扫描的规则

1.2 修改默认配置

  SpringBoot默认会在底层配好所有的组件,但是如果用户自己配置了以用户的优先。使用@ConditionalOnMissingBean注解判断容器中是否存在该组件的话就使用默认的类进行配置

1.3 总结

● SpringBoot先通过xxxxxAutoConfiguration加载所有的自动配置类

● 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值,这个值就在xxxxProperties里面拿,xxxProperties和配置文件进行了绑定。

● 生效的配置类就会给容器中装配很多组件

● 只要容器中有这些组件,相当于这些功能就有了

● 定制化配置

○ 用户直接自己@Bean替换底层的组件

○ 在创建的配置文件中使用配置项修改默认的配置信息。比如说配置字符编码格式在HttpEncodingAutoConfiguration里的注解中可以得知

xxxxxAutoConfiguration —> 组件 —>

xxxxProperties里面拿值 ----> application.properties

1.4 最佳实践

根据上述自动配置原理总结SpringBoot的最佳项目实践流程

引入场景依赖

<dependency>
  	<groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

查看自动配置了哪些组件

  • 默认场景对应的自动配置一般都生效
  • 配置文件中debug=true开启自动配置报告,其中Positive(生效组件)、Negative(不生效组件)以及会显示不生效的原因是什么没有匹配到

修改配置项

组件修改

@Bean、@Component……注解

…………业务流程

2 开发小技巧

2.1 Lombok简化开发

第一步: 导入依赖(由于starter启动器中已经配置了版本,于是可以不去再次进行设置)

<dependency> 	
	<groupId>org.projectlombok</groupId> 	
	<artifactId>lombok</artifactId>
</dependency> 

第二步: 搜索安装lombok插件

第三步: 使用注解进行开发

JavaBean的注解 使用注解并不会直接自动生成代码,而是在编译期间将注解的方法补上。而且如果需要使用多参但不全构造器的话,没有注解可以完成,需要自己在源码上手写

  • @NoArgsConstructor: 无参构造器
  • @AllArgsConstructor: 全参构造器
  • @ToString: 全参数的toString方法
  • @Data: getter和setter方法

生成日志

  • 类上加注解@Slf4j
  • log.info方法打印日志

2.2 伪热更新

第一步: 导入依赖

<dependency> 	
	<groupId>org.springframework.boot</groupId> 	
	<artifactId>spring-boot-devtools</artifactId>
	<optional>true</optional>
</dependency> 

第二步: 使用热更新功能,在项目源码中更新了代码,不需要重启服务器,直接使用Ctrl+F9刷新项目信息,就可以使用更新之后的代码了。静态页面的改变使用Ctrl+F9,就是在服务器中直接更新页面信息,其他的信息改变就相当于使用按钮重启项目。如果想要实现不需任何操作就实时更新的话可以使用JRebel,但是缺点就是收费。

2.3 创建Spring Initailizr项目

  这个小技巧就是在使用IDEA的企业版开发的时候,直接创建一个springBoot项目,还可以自定义项目中所需要的技术,创建完成之后就会自动生成SpringBoot项目相应的主程序类、pom.xml文件等

右键创建项目的时候选择Spring Initailizr,主要就是勾选自己需要的技术

效果:

到此这篇关于SpringBoot2零基础到精通之自动配置底层分析及小技巧的文章就介绍到这了,更多相关SpringBoot2 自动配置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring boot2X Consul如何通过RestTemplate实现服务调用

    Spring boot2X Consul如何通过RestTemplate实现服务调用

    这篇文章主要介绍了spring boot2X Consul如何通过RestTemplate实现服务调用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • mybatis-generator生成多次重复代码问题以及解决

    mybatis-generator生成多次重复代码问题以及解决

    在使用MySQL数据库时,如果多个数据库中存在相同表名,即使在URL中配置了数据库名,也可能导致数据互相影响,解决这一问题的方法是在mapper-generator-config.xml文件中添加catalog属性,明确指定逆向工程代码所涉及表的数据库名
    2024-10-10
  • Java和JVM的重载识别,重写方法是怎样进行的

    Java和JVM的重载识别,重写方法是怎样进行的

    这篇文章主要介绍了Java和JVM的重载识别,重写方法是怎样进行的,违章围绕了Java和JVM的重载识别,重写方法展开相关资料,需要的小伙伴可以参考一下,希望对你的工作或学习有所帮助
    2022-01-01
  • SpringBoot整合模板引擎过程代码实例

    SpringBoot整合模板引擎过程代码实例

    这篇文章主要介绍了SpringBoot整合模板引擎过程代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • 详解Java Ajax jsonp 跨域请求

    详解Java Ajax jsonp 跨域请求

    本篇文章主要介绍了详解Java Ajax jsonp 跨域请求,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Java实现注册邮箱激活账户实例代码

    Java实现注册邮箱激活账户实例代码

    本篇文章主要介绍了Java实现邮箱激活账户实例代码,这里整理了详细的代码,具有一定的参考价值,有需要的小伙伴可以参考下。
    2017-07-07
  • SpringBoot 中的异步处理机制详解

    SpringBoot 中的异步处理机制详解

    本文介绍了异步处理的基础配置、线程池的自定义以及常见应用场景,在实际应用中,异步处理可以有效提升应用的性能,改善用户体验,但同时也需要我们合理管理线程池,确保系统资源的高效利用,感兴趣的朋友跟随小编一起看看吧
    2025-01-01
  • 浅谈Java设计模式之开放封闭原则

    浅谈Java设计模式之开放封闭原则

    本篇文章主要介绍了浅谈Java设计模式之开放封闭原则,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • java如何分布式锁实现和选型

    java如何分布式锁实现和选型

    文章介绍了分布式锁的重要性以及在分布式系统中常见的问题和需求,它详细阐述了如何使用分布式锁来确保数据的一致性和系统的高可用性,文章还提供了基于数据库、Redis和Zookeeper的分布式锁实现示例,分析了每种方法的优点和缺点
    2025-01-01
  • 解决IDEA Gradle构建报错''Cause: zip END header not found''

    解决IDEA Gradle构建报错''Cause: zip END header not found''

    这篇文章主要介绍了解决IDEA Gradle构建报错"Cause: zip END header not found"的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02

最新评论