Java – SpringBoot 3 快查

SpringBoot 运行概念

版本集成

SpringMvc 优点很明显,但是缺点也很明显,最大的弊端是配置非常繁琐,每一个三方依赖的整合都需要做大量的配置工作,在早期单体应用的时代,一个项目只服务一个应用时,一个项目只需配置一次即可,但随着微服务的发展,开发者希望在单个项目中引入多个应用时,配置就显得非常乏力,每一个模块项目中都要再做一次配置,因此当年Spring差点玩完。

后来Spring推出SpringBoot概念,即利用Maven父pom预先定义好Spring框架及其所需要的第三方依赖由Spring团队预先测定最合适的稳定版本并集成在Maven的pom配置文件中,我们只需要把pom项目的配置文件父项目指定为Spring团队提供的pom配置中,我们的pom便能快速自由地引用Spring团队提前选好的三方依赖。

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.1.1</version>
    </parent>

 

 

Starter 是什么

Starter 是一种慨念。我们开发的每一种应用,都有可能包含好几种重要的依懒,每一种依懒都有它的配置项。比如我们要开发一个SpringMvc应用,不是只要引入SpringMvc依赖就可以的,紧随它后的还有 Tomcat、Spring、Aop、TX、Json 等等非常多的辅助依赖,而它们也有属于自己的配置。

依赖管理模块化:

Starter 诣希望我们只需要以“应用”为模板,若我们希望开发一个web应用时,我们只需要引入“Web”的依赖,那么紧跟其后的各种必要的辅助依赖都能通过Maven一并引入。

自动配置:

除了对依赖进行集成,Starter的慨念还包括自动配置,每一个Starter依赖都是经过特殊配置的,它不单只包含开发所需的引用,还包含了该依赖的官方最佳调整好的配置文件,SpringBoot加载依赖后会按照约定规则执行第三方依赖的配置类,当我们没有做自定义配置的情况下,会自动装载该依赖的默认配置。

约定大于配置:

因为每一个Starter依赖中都包含了自身的配置项,因此大部分的三方依赖可以0配置直接使用,部分三方依赖也只需要配置个性化的配置就可以使用,并且SpringBoot参照多年的开发者习惯,对开发项目的架构做了预先的配置,只要我们约定好使用相同的项目架构开发,那么我们就可以不需要任何的配置,SpringBoot在约定内已经为我们做好一切能做的配置。

应用类型模块化:

SpringBoot还针对不同开发者可能用于不同的平台开发,所以还把各种不同平台的依赖做成模块,当我希望用于Web开发时,则只需要引入Web的Starter即可,若我的Web包含MySQL数据库,我只需要再引入具体的平台的Starter包即可。

所有Strater包可查阅以下地址:https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.build-systems.starters

 

Starter 的命名规则

SpringBoot 为了规范 Starter 的命名方式,以区分第三方Starter和官方的Starter.

SpringBoot 有以下的命名规定:

  • 官方提供的场景:命名为:spring-boot-starter-*
  • 第三方提供场景:命名为:*-spring-boot-starter

 

@SpringBootApplication 注解的工作

@SpringBootApplication添加到启动类上,是一个组合注解,他的功效有具体的子注解实现

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
public @interface SpringBootApplication {}

@SpringBootApplication 实际做了三个工作:

 

1.自动配置:

@SpringBootApplication注解包含了@EnableAutoConfiguration注解,用于启用Spring Boot的自动配置机制。自动配置会根据应用程序的依赖项和类路径,自动配置各种常见的Spring配置和功能,减少开发者的手动配置工作。它通过智能地分析类路径、加载配置和条件判断,为应用程序提供适当的默认配置。

2.组件扫描:@SpringBootApplication注解包含了@ComponentScan注解,用于自动扫描并加载应用程序中的组件,例如控制器(Controllers)、服务(Services)、存储库(Repositories)等。它默认会扫描@SpringBootApplication注解所在类的包及其子包中的组件,并将它们纳入Spring Boot应用程序的上下文中,使它们可被自动注入和使用。

3.声明配置类:@SpringBootApplication注解本身就是一个组合注解,它包含了@Configuration注解,将被标注的类声明为配置类。配置类可以包含Spring框架相关的配置、Bean定义,以及其他的自定义配置。通过@SpringBootApplication注解,开发者可以将配置类与启动类合并在一起,使得配置和启动可以同时发生。

 

SpringBoot 配置

SpringBoot已经为我们做了大量的配置了,但不是所有配置都能预先配置的,有一些配置是需要用户手动加入的,如数据库的连接账号密码等,SpringBoot提供了一个统一的配置文件约定,文件 application.properties 、application.yml、application.yaml 这三个文件

详细配置比较多,可以访问:https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties

 

自定义配置读取

application 配置项允许我们写自己的配置,并在系统中DI注入使用。

使用 @Value 读取配置项

在application配置文件中写好配置项后,若我们希望在代码中使用这些配置项,我们可以用 @Value 来读取

user: 
  username: root
  password: 123456
  fav:
    - aaa
    - bbb
    - ccc

要使用DI则需要让类存入IoC容器中,并且该类带有set方法

 

@Component
@Data
public class Person {
    @Value("{user.username}")
    private String username;
    @Value("{user.password}")
    private String password;
    @Value("{user.fav}")
    private List<String> fav;
}

注意:@Value 注解不支持集合类型,上面红色代码会在启动时报错。

 

 

使用 @ConfigurationProperties 读取配置

因为 @Value 不支持集合型数据,我们可以使用 @ConfigurationProperties 注解对类中的所有字段全自动注入,只要提供其前缀即可。

@Data
@ConfigurationProperties("user")
public class Person {

    private String username;

    private String password;

    private List<String> fav;
}

@ConfigurationProperties 中的配置名和类中的配置名是松散化识别的。

 

 

多开发环境配置

SpringBoot 默认只认 application 文件,但是我们可以把多方的配置抽离放到其它的配置项中,以 application-{key} 的方式命名,并在 application 文件中进行激活。

案例如下:

application.yaml -> 

spring: 
    profiles: 
        active: dev,mybatis,druid

application-dev.yaml 
application-prod.yaml
application-mybatis.yaml
application-druid.yaml

这时可以激活,【application-dev.yaml】、【application-mybatis.yaml】、【application-druid.yaml】这三个文件的配置。

注意:

1.外部配置项文件与application存在相同key时,以外部配置项为准,后加载的覆盖前面的key值

 

整合SpringMVC

SpringBoot 本身对SpringMVC高度整合配置,只需要引入 spring-boot-starter-web 坐标后,就可以正常使用了。

基础配置

当涉及Spring Boot的Web应用程序配置时,以下是五个重要的配置参数:

1.server.port: 指定应用程序的HTTP服务器端口号。默认情况下,Spring Boot使用8080作为默认端口。您可以通过在配置文件中设置server.port来更改端口号。

2.server.servlet.context-path: 设置应用程序的上下文路径。这是应用程序在URL中的基本路径。默认情况下,上下文路径为空。您可以通过在配置文件中设置server.servlet.context-path属性来指定自定义的上下文路径。

3.spring.mvc.view.prefix和spring.mvc.view.suffix: 这两个属性用于配置视图解析器的前缀和后缀。视图解析器用于解析控制器返回的视图名称,并将其映射到实际的视图页面。spring.mvc.view.prefix定义视图的前缀,spring.mvc.view.suffix定义视图的后缀。

4.spring.resources.static-locations: 配置静态资源的位置。静态资源可以是CSS、JavaScript、图像等。默认情况下,Spring Boot会将静态资源放在classpath:/static目录下。您可以通过在配置文件中设置spring.resources.static-locations属性来自定义静态资源的位置。

5.spring.http.encoding.charset和spring.http.encoding.enabled: 这两个属性用于配置HTTP请求和响应的字符编码。spring.http.encoding.charset定义字符编码的名称(例如UTF-8),spring.http.encoding.enabled用于启用或禁用字符编码的自动配置。

 

静态资源配置

SpringMvc 的 Starter 中默认配置了静态资源访问能力

默认提供了以下四个位置,可以不用设置直接以静态方式访问:

  • classpath:/META-INF/resources/
  • classpath:/resources/
  • classpath:/static/
  • classpath:/public/

若我们希望自定义静态访问地址,我们可以在配置项中加入以下路径的设置:

spring:
  web:
    resources:
      # 配置静态资源地址,如果设置,会覆盖默认值
      static-locations: classpath:/webapp

注意:配置了自定义静态目录后,系统默认的静态目录将失效。

 

 

整合 Durid

1.导入Druid的SpringBoot Starter 专用依赖

        <!-- druid启动器的依赖  -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-3-starter</artifactId>
            <version>1.2.18</version>
        </dependency>

或最新版本:

 

<!-- druid启动器的依赖  -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.19</version>
        </dependency>

2.导入JDBC的Starter依赖

 

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

 

 

3.导入数据库驱动

        <!-- 驱动类-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>

 

 

4.对Durid进行配置,配置值如下:

spring:
  datasource:
    # 连接池类型 
    type: com.alibaba.druid.pool.DruidDataSource

    # Druid的其他属性配置 springboot3整合情况下,数据库连接信息必须在Druid属性下!
    druid:
      url: jdbc:mysql://localhost:3306/day01
      username: root
      password: root
      driver-class-name: com.mysql.cj.jdbc.Driver
      # 初始化时建立物理连接的个数
      initial-size: 5
      # 连接池的最小空闲数量
      min-idle: 5
      # 连接池最大连接数量
      max-active: 20
      # 获取连接时最大等待时间,单位毫秒
      max-wait: 60000
      # 申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
      test-while-idle: true
      # 既作为检测的间隔时间又作为testWhileIdel执行的依据
      time-between-eviction-runs-millis: 60000
      # 销毁线程时检测当前连接的最后活动时间和当前时间差大于该值时,关闭当前连接(配置连接在池中的最小生存时间)
      min-evictable-idle-time-millis: 30000
      # 用来检测数据库连接是否有效的sql 必须是一个查询语句(oracle中为 select 1 from dual)
      validation-query: select 1
      # 申请连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true
      test-on-borrow: false
      # 归还连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true
      test-on-return: false
      # 是否缓存preparedStatement, 也就是PSCache,PSCache对支持游标的数据库性能提升巨大,比如说oracle,在mysql下建议关闭。
      pool-prepared-statements: false
      # 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100
      max-pool-prepared-statement-per-connection-size: -1
      # 合并多个DruidDataSource的监控数据
      use-global-data-source-stat: true

logging:
  level:
    root: debug

注意:在SpringBoot 2 版本中,可以使用 spring.datasource.xx 来设置 Druid.

 

但是在 SpringBoot 3 版本中已失效,只能使用 spring.datasource.druid.xx 来配置。

 

5.在业务中进行SQL查询,以下代码为Demo,JdbcTemplate会自动载入IoC容器中,因此可以直接获取了

@Slf4j
@Controller
@RequestMapping("/user")
public class UserController {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @GetMapping("/getUser")
    @ResponseBody
    public User getUser(){
        String sql = "select * from users where id = ? ; ";
        User user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(User.class), 1);
        log.info("查询的user数据为:{}",user.toString());
        return user;
    }
    
}

 

 

启动报错的原因

在早期的Druid版本中,并不能完全兼容SpringBoot3版本,对SpringBoot3存在缺失自动配置文件,因此在SpringBoot3启动后,有可能会出现Druid报错的问题,这类问题目前官方已经解决,详情看:

https://github.com/alibaba/druid/commit/568d12a3c3b980103dae93541e064160cc9c1159

 

若不想使用新版本,可以手动解决Druid自动配置问题:

在resources目录下创建META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,文件内容如下

com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure

即可。

 

整合 Mybatis

1.导入SpringBoot专用的Mybatis依赖。

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>3.0.2</version>
        </dependency>

2.在配置项中做个性化的配置,如开启驼峰命名转换,开启深层数据注入,配置mapperxml文件目录,设置日志功能等:

mybatis:
  # 设置 mapperXML文件目录位置
  config-location: classpath:/mappers/*.xml
  configuration:
    # 设置日志输出实现类
    log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl
    # 开启驼峰命名
    map-underscore-to-camel-case: true
    # 开启深层数据注入
    auto-mapping-behavior: full
  # 设置实体类类型别名
  type-aliases-package: cn.unsoft.pojo

 

3.创建一个配置类,用于配置Mybatis,如使用 @MapperScan 注解来扫描Mapper接口包

@Configuration
@MapperScan("cn.unsoft.mapper")
public class MybatisConfig {
}

 

4.在业务中就可以注入使用 Mapper 接口来调用Mybatis执行SQL了。

 

整合事务TX

声明式事务依赖包存在于jdbc中,我们只需要引入Jdbc的SpringBoot专用的依赖,就可以直接使用了。无需额外的配置操作。

SpringBoot项目会自动配置一个 DataSourceTransactionManager,所以我们只需在方法(或者类)加上 @Transactional 注解,就自动纳入 Spring 的事务管理了

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

直接使用 @Transactional 于方法中,就可实现事务管理。

 

整合切面AOP

1.SpringBoot 对 AOP 做了完全的自动配置能力,和事务一样,只需要引入AOP的SpringBoot专用的依赖,即可完成AOP的配置。

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

2.在使用AOP的类,加上 @Aspect 声明该类是切面类即可,至于 @EnableAspectJAutoProxy 注解是用于开启@Aspect切面支持的,在引入AOP的SpringBoot专用依赖时,已经自动配置开启了,所以不需要手动开启。

@Component
@Aspect
public class LogAspect {

    @Before("execution(* cn.unsoft.controller.*.*(..))")
    public void before(JoinPoint joinPoint) {
        String className = joinPoint.getTarget().getClass().getSimpleName();
        String methodName = joinPoint.getSignature().getName();
        System.out.println(className + "::" + methodName + "即将执行");
    }
}

 

SpringBoot 打包运行

打包

使用Maven的打包功能就可以

注意:需要使用SpringBoot的打包插件进行打包,否则打出来的包可能会缺少运行入口

<!--    SpringBoot应用打包插件-->
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

 

运行

SpringBoot 与 SpringMVC项目不同点在于,SpringMvc是一个独立项目,它需要打包成war文件,并使用外置Tomcat部署运行,而SpringBoot项目是一个集成项目,它会打包成一个jar文件,其内部已经包含了所有需要的运行环境,包括 Tomcat.

运行命令:

java -jar  [选项] [参数] <jar文件名>

 

我们可以在运行SpringBoot项目时增加不同的参数来修改SpringBoot原有的配置参数:

1.-D=:设置系统属性,可以通过System.getProperty()方法在应用程序中获取该属性值。例如:java -jar -Dserver.port=8080 myapp.jar。

2.-X:设置JVM参数,例如内存大小、垃圾回收策略等。常用的选项包括:

  • -Xmx:设置JVM的最大堆内存大小,例如 -Xmx512m 表示设置最大堆内存为512MB。
  • -Xms:设置JVM的初始堆内存大小,例如 -Xms256m 表示设置初始堆内存为256MB。

3.-Dspring.profiles.active=:指定Spring Boot的激活配置文件,可以通过application-.properties或application-.yml文件来加载相应的配置。例如:java -jar -Dspring.profiles.active=dev myapp.jar。

注意: -D 参数必须要在jar之前!否者不生效!

 

参考项目下载

https://www.tzming.com/wp-content/uploads/2023/filesdown/SpringBoot_heimatoutiao.rar

 

如果您喜欢本站,点击这儿不花一分钱捐赠本站

这些信息可能会帮助到你: 下载帮助 | 报毒说明 | 进站必看

修改版本安卓软件,加群提示为修改者自留,非本站信息,注意鉴别

THE END
分享
二维码
打赏
海报
Java – SpringBoot 3 快查
SpringBoot 运行概念 版本集成 SpringMvc 优点很明显,但是缺点也很明显,最大的弊端是配置非常繁琐,每一个三方依赖的整合都需要做大量的配置工作,在早期单体应用的时代,一个项目只服务一……
<<上一篇
下一篇>>