SpringBoot3依靠管理,自动配置

tsx81428  金牌会员 | 2024-6-27 21:59:29 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 946|帖子 946|积分 2840


1. 项目新建



  • 直接建Maven项目
  • 通过官方提供的Spring Initializr项目创建

2. 相干pom依靠

  1.     <!--    所有springboot项目都必须继承自 spring-boot-starter-parent -->
  2.         <parent>
  3.             <groupId>org.springframework.boot</groupId>
  4.             <artifactId>spring-boot-starter-parent</artifactId>
  5.             <version>3.0.5</version>
  6.         </parent>
  7.         <dependencies>
  8.     <!--        web开发的场景启动器 -->
  9.             <dependency>
  10.                 <groupId>org.springframework.boot</groupId>
  11.                 <artifactId>spring-boot-starter-web</artifactId>
  12.             </dependency>
  13.         </dependencies>
  14.     <!--    SpringBoot应用打包插件-->
  15.         <build>
  16.             <plugins>
  17.                 <plugin>
  18.                     <groupId>org.springframework.boot</groupId>
  19.                     <artifactId>spring-boot-maven-plugin</artifactId>
  20.                 </plugin>
  21.             </plugins>
  22.         </build>
复制代码
3. 依靠管理机制


导入 starter 全部相干依靠都会导入进来



  • 需要开发什么场景就导入什么场景启动器
  • Maven依靠通报原则。A-B-C,A依靠B,B依靠C,则A也依靠了C
  • 导入场景启动器,场景启动器会自动把这个场景的全部核心依靠全部导入进来
为什么版本号都不用写?



  • 每个boot项目都有一个父项目 spring-boot-starter-parent
  • parent的父项目是 spring-boot-dependencies
  • 父项目具有 版本仲裁中心,会把全部常见的jar的依靠版本都声明好了,比方:mysql-connector-j
如何自界说版本号



  • 使用maven的就近原则

    • 直接在当前项目properties标签中声明父项目的版本属性的key
    • 直接在导入依靠的时候声明版本

第三方的jar包



  • boot父项目没有管理的需要自行声明好,比方:
  1.     <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
  2.     <dependency>
  3.         <groupId>com.alibaba</groupId>
  4.         <artifactId>druid</artifactId>
  5.         <version>1.2.16</version>
  6.     </dependency>
复制代码
4. 自动配置机制



  • 自动配置的 Tomcat、SpringMVC 等

    • 导入场景,容器中就会自动配置好这个场景的核心组件。
    • 从前:DispatcherServlet、ViewResolver、CharacterEncodingFilter…
    • 现在:自动配置好的这些组件

  • 验证:容器中有了什么组件,就具有什么功能
  1. public class Boot302DemoApplication {
  2.     public static void main(String[] args) {
  3.         // Java10:局部变量类型的自动推断
  4.         var ioc = SpringApplication.run(Boot302DemoApplication.class, args);
  5.         // 1、获取容器中所有组件的名字
  6.         String[] names = ioc.getBeanDefinitionNames();
  7.         // 2、遍历查看
  8.         // SpringBoot把以前配置的核心组件现在都自动配好了
  9.         for (String name:
  10.              names) {
  11.             System.out.println(name);
  12.         }
  13.     }
  14. }
复制代码


  • 默认扫描规则

    • @SpringBootApplication 标注的累就是主程序类
    • SpringBoot只会扫描主程序所在的包及其下面的子包,自动的componet-scan功能
    • 自界说扫描路径

      • @SpringBootApplication(scanBasePackages = “com.xxx”) 指定即可
      • @ComponentScan(“com.xxx”) 直接指定扫描的路径


  • 配置默认值

    • 配置文件的全部配置项是和某个类的对象值进行一一绑定
    • 绑定了配置文件中每一项值的类:配置属性类
    • 比如:

      • ServerProperties类绑定了全部Tomcat服务器有关的配置
      • MultipartProperties类绑定了全部文件上床相干的配置
      • …参照官方文档 或者参照绑定的属性类


  • 按需加载自动配置

    • 导入场景spring-boot-starter-web
    • 场景启动器除了会导入相干功能依靠,导入一个spring-boot-starter,是全部starter的starter,底子核心starter
    • spring-boot-starter导入了一个包 spring-boot-autoconfigure。包里面都是各种场景的AutoConfiguration自动配置类
    • 虽然全场景的自动配置都在 spring-boot-autoconfigure这个包,但是不是全都开启的。

      • 导入哪个场景就开启哪个自动配置


总结 导入场景启动器、触发 spring-boot-autoconfigure这个包的自动配置生效、容器中就会具有相干场景的功能

5. 核心注解

@ConditionalOnXxx
@ConditionalOnClass:如果类路径中存在这个类,则触发指定行为
@ConditionalOnMissingClass:如果类路径中不存在这个类,则触发指定行为
@ConditionalOnBean:如果容器中存在这个Bean(组件),则触发指定行为
@ConditionalOnMissingBean:如果容器中不存在这个Bean(组件),则触发指定行为
  1. 场景:
  2. ● 如果存在FastsqlException这个类,给容器中放一个Cat组件,名cat01,
  3. ● 否则,就给容器中放一个Dog组件,名dog01
  4. ● 如果系统中有dog01这个组件,就给容器中放一个 User组件,名zhangsan
  5. ● 否则,就放一个User,名叫lisi
复制代码
@ConditionalOnBean(value=组件范例,name=组件名字):判断容器中是否有这个范例的组件,并且名字是指定的值

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

tsx81428

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表