Java框架--SpringBoot

Java框架--SpringBoot

基本介绍

  • 官方文档

    官网: https://spring.io/projects/spring-boot

    学习文档: https://docs.spring.io/spring-boot/docs/current/reference/html/

    离线文档: spring-boot-reference.pdf

    在线 API: https://docs.spring.io/spring-boot/docs/current/api/

  • Spring Boot是什么?

    第一句话: Spring Boot 可以轻松创建独立的、生产级的基于 Spring 的应用程序

    第二句话: Spring Boot 直接嵌入 Tomcat、Jetty 或 Undertow ,可以"直接运行" Spring Boot 应用程序

  • 快速入门(代码仓库源代码实现)小结

    SpringBoot 比较传统的 SSM 开发, 简化整合步骤, 提高开发效率

    简化了 Maven 项目的 pom.xml 依赖导入, 可以说是一键导入

    引入一个spring-boot-starter-web,到底发生了什么(导入了web开发常用jar文件包)

    内置Tomcat ,简化服务器的配置(Tomcat服务映射为成为一个类进行服务启动和管理)

  • Spring SpringMVC SpringBoot 的关系

    • 关系梳理

      1. Spring Boot > Spring > Spring MVC (>是包含之意)
      2. Spring MVC只是Spring处理WEB层请求的一个模块/组件, Spring MVC的基石是Servlet
      3. Spring 的核心是 IOC 和 AOP, IOC 提供了依赖注入的容器 , AOP 解决了面向切面编程
      4. Spring Boot 是为了简化开发, 推出的封神框架(约定优于配置[COC],简化了 Spring 项目的配置流程), SpringBoot 包含很多组件/框架,Spring就是最核心的内容之一,也包含 Spring MVC
      5. Spring 家族,有众多衍生框架和组件例如 boot、security、jpa 等, 他们的基础都是 Spring
    • 如何理解 -约定优于配置

      1. 约定优于配置(Convention over Configuration/COC),又称按约定编程,是一种软件设计规范, 本质上是对系统、类库或框架中一些东西假定一个大众化合理的默认值(缺省值)
      2. 例如在模型中存在一个名为 User 的类,那么对应到数据库会存在一个名为 user 的表, 只有在偏离这个约定时才需要做相关的配置 (例如你想将表名命名为 t_user 等非 user 时才需要写关于这个名字的配置)
      3. 简单来说就是假如你所期待的配置与约定的配置一致,那么就可以不做任何配置,约定不符合期待时, 才需要对约定进行替换配置
      4. 约定优于配置理念【解读:为什么要搞一个约定优于配置】约定其实就是一种规范,遵循了规范,那么就存在通用性,存在通用性,那么事情就会变 得相对简单,程序员之间的沟通成本会降低,工作效率会提升,合作也会变得更加简单,生活中,这样的情况,大量存在

依赖管理和自动配置

依赖管理

  • 什么是依赖管理
    • spring-boot-starter-parent 还有父项目, 声明了开发中常用的依赖的版本号
      <!--父工程引入,为了规定统一版本,如果需要正式依赖,还是需要dependencies引入-->
      <parent>
          <artifactId>spring-boot-starter-parent</artifactId>
          <groupId>org.springframework.boot</groupId>
          <version>2.5.3</version>
      </parent>
    
    • 自动版本仲裁:即如果程序员没有指定某个依赖 jar 的版本,则以父项目指定的版本为准
  • 修改自动仲裁/默认版本号
    • 使用<properties><mysql.version>5.1.49</mysql.version></properties>
    • 或者显示声明dependency依赖,根据依赖就近优先原则,以自己指定的为准

场景启动器

  • 介绍

    • 开发中我们引入了相关场景的 starter,这个场景中所有的相关依赖都引入进来了,比如我们做 web 开发引入了,该 starter 将导入与 web 开发相关的所有包

    • 依赖树 : 可以看到 spring-boot-starter-web ,帮我们引入了 spring-webmvc,spring-web 开发模块,还引入了 spring-boot-starter-tomcat 场景,spring-boot-starter-json 场景,这些 场景下面又引入了一大堆相关的包,这些依赖项可以快速启动和运行一个项目,提高开发 效率

    • 所有场景启动器最基本的依赖就是 spring-boot-starter , 前面的依赖树分析可以看到,这个依赖也就是 SpringBoot 自动配置的核心依赖

  • 官方提供starter

      <!--引入启动环境SB-->
      <dependencies>
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-web</artifactId>
              <!--因自己要创建tomcat对象并启动,所以排除内嵌的tomcat对象-->
              <exclusions>
                  <exclusion>
                      <groupId>org.springframework.boot</groupId>
                      <artifactId>spring-boot-starter-tomcat</artifactId>
                  </exclusion>
              </exclusions>
          </dependency>
      </dependencies>
    
  • 第三方 starter

    • SpringBoot 也支持第三方 starter
    • 第三方 starter 不要从 spring-boot 开始,因为这是官方 spring-boot 保留的命名方式的。 第三方启动程序通常以项目名称开头。例如,名为 thirdpartyproject 的第三方启动程序项 目通常被命名为 thirdpartyproject-spring-boot-starter。
    • 也就是说:xxx-spring-boot-starter 是第三方为我们提供的简化开发的场景启动器
  • 自动配置

    • 学习 SSM 整合时,需要配置 Tomcat 、配置 SpringMVC、配置如何扫描包、配置字符过滤器、配置视图解析器、文件上传等,而在

      SpringBoot 中,存在自动配置机制,提高开发效率

  • SpringBoot 自动配置了哪些?

  • 如何修改SpringBoot默认配置?

    • 修改增加扫描包:@SpringBootApplication(scanBasePackages = "com.szl")
    • resources\application.properties配置大全,SpringBoot 项目最重要也是最核心的配置文件就是 application.properties,所有的框架配置都可以在这个配置文件中说明(https://blog.csdn.net/pbrlovejava/article/details/82659702)

容器功能

Spring 注入组件的注解

  • @Component、@Controller、 @Service、@Repository

    • 这些在 Spring 中的传统注解仍然有效,通过这些注解可以给容器注入组件
  • @Configuration

    • 通过@Configuration 创建配置类来注入组件

      //@Configuration 标识这是一个配置类: 等价 配置文件 
      @Configuration 
      public class BeanConfig { 
          / 1. @Bean : 给容器中添加组件 
          * 2. monster01() : 默认方法名作为组件的 id 
          * 3. Monster: 返回类型就是组件类型, 返回的值就是 new Monster(100, "牛魔王", 500, "芭蕉扇") 
          * 4. @Bean("monster_nmw"): 重新指定组件的 id = “monster_nmw” 
          * 5. 配置类里面使用@Bean 标注在方法上给容器注册组件,默认是单实例的 
          */ 
          // @Bean("monster_nmw") 
          @Bean 
          public Monster monster01() { return new Monster(100, "牛魔王", 500, "芭蕉扇"); } }
      
    • 配置类本身也是组件, 因此也可以获取

    • SpringBoot2新增特性:proxyBeanMethods指定Full模式和Lite模式

      代理 bean 的方法

      (1) Full(proxyBeanMethods = true)、【保证每个@Bean 方法被调用多少次返回的组件都是 单实例的, 是代理方式】
      (2) Lite(proxyBeanMethods = false)【每个@Bean 方法被调用多少次返回的组件都是新创 建的, 是非代理方式】
      (3) 特别说明: proxyBeanMethods 是在 调用@Bean 方法 才生效,因此,需要先获取 BeanConfig 组件,再调用方法而不是直接通过 SpringBoot 主程序得到的容器来获取 bean, 注意观察直接通过 ioc.getBean() 获取 Bean, proxyBeanMethods 值并没有生效
      (4) 如何选择: 组件依赖必须使用 Full 模式默认。如果不需要组件依赖使用 Lite 模
      (5) Lite 模 也称为轻量级模式,因为不检测依赖关系,运行速度快

    • 配置类可以有多个, 就和 Spring 可以有多个 ioc 配置文件是一个道理

  • @Import

    • 通过 @Import 来注入组件

      /** Import 可以传入一个数组,可以一次注入多个组件 
      * public @interface Import { 
      * Class<?>[] value(); 
      * } 
      * 注意@Import 方式注入的组件, 默认组件的名字就是全类名 
      */ 
      @Import({Dog.class, Cat.class}) 
      @Configuration(proxyBeanMethods = false) 
      public class BeanConfig {}
      
  • @Conditional

    • 条件装配:满足 Conditional 指定的条件,则进行组件注入
    • @Conditional 是一个根注解,下面有很多扩展注解
  • @ImportResource

    • 原生配置文件引入, 也就是可以直接导入 Spring 传统的 beans.xml ,可以认 为是 SpringBoot 对 Spring 容器文件的兼容
  • 配置绑定

    • 使用 Java 读取到 SpringBoot 核心配置文件 application.properties 的内容,并且把它封装到 JavaBean 中

    • @ConfigurationProperties(prefix = "xxxx") 需要配合@Component注入标识一起使用,或者配合配置类(带有配置类标识的类)上增加@EnableConfigurationProperties(指向的类.class)来使用

    • 注意1:配置文件 application.properties 的内容如:furn01.id=100,id要对应bean中的属性名称,否则赋值失败为空

    • 注意2:如果 application.properties 有中文, 需要转成 unicode 编码写入, 否则出现乱码

    • 注意3:使用 @ConfigurationProperties(prefix = "furn01") 会提示not configured,不影响使用,若想去除可以在项目pos文件中增加以下代码

      <dependency> 
          <groupId>org.springframework.boot</groupId> 
          <artifactId>spring-boot-configuration-processor</artifactId> 
          <optional>true</optional> 
      </dependency>
      
posted @   邵泽龙  阅读(729)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示