IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Day93.SpringBoot: 配置、使用、自动配置原理、自定义启动器 -> 正文阅读

[Java知识库]Day93.SpringBoot: 配置、使用、自动配置原理、自定义启动器

目录

一、SpringBoot概述

二、使用springboot

二、配置文件详解

1. 属性配置文件

2. YAML配置文件?

3. 多环境profile切换配置

三、Spring Boot自动配置(理解)

条件化配置注解

四、自动配置原理

默认属性配置

五、自定义启动器?

六、Spring Data JPA

Spring Boot综合案例(应用)

1、环境搭建 (数据库、结构)

2、数据访问层

3、Service?业务层

4、Controller?表现层

一、SpringBoot概述

Spring Boot是Spring项目中的一个子工程,与我们所熟知的Spring-framework 同属于spring的产品。其最主要作用就是帮助开发人员快速的构建庞大的spring项目,并且尽可能的减少一切xml配置,做到开箱即用,迅速上手,让开发人员关注业务而非配置。
设计目的: 用来简化 Spring?应用的初始搭建以及开发过程。

(1)为所有 Spring 开发提供一个更快更广泛的入门体验。

(2)零配置。无冗余代码生成和XML 强制配置,遵循“约定大于配置,习惯优于配置” 。

(3)集成了大量常用的第三方库的配置, Spring Boot 应用为这些第三方库提供了几乎可以零配置的开箱即用的能力。

(4)提供一系列大型项目常用的非功能性特征,如嵌入服务器等。

主要特点:

  1. 自动配置?: 不需要再关注各个框架的整合配置, springboot全部已经配置好了
  2. 起步依赖?: 我们在需要使用某个框架的时候, 直接添加这个框架的启动器依赖即可 , 不需要在关注jar包的冲突和整合

二、使用springboot

1. pom.xml 添加父工程坐标、web启动器

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.atguigu</groupId>
    <artifactId>springboot_01</artifactId>
    <version>1.0</version>
    <!--为什么我们在添加启动器的时候不需要添加版本?
        答:父工程帮我们统一管理
    -->
    <!--添加父工程坐标-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.6.RELEASE</version>
    </parent>
    <!--
        为什么我们就只添加了一个启动器依赖,项目就可以运行起来了,这些jar包从何而来?
        答:引入启动器,间接依赖了很多jar包,从本地仓库进行依赖注入
        
    -->
    <!--添加web启动器,框架提供了很多启动器(起步依赖),其实就是一组jar包的名称
        web启动器: 引入web开发相关的jar
    -->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
    <!--可选,jdk版本-->
    <properties>
        <java.version>1.8</java.version>
    </properties>

</project>

2. 创建启动类

Spring Boot项目通过main函数即可启动,我们需要创建一个启动类:

@SpringBootApplication //s声明当前项目是一个SpringBoot项目
public class App {
    //启动内置的Tomcat服务器,即初始化Ioc容器(采用框架默认配置)
    public static void main(String[] args) {
        SpringApplication.run(App.class,args);
    }
}

3. 编写Controller

@RestController //相当于 @Controller + @ResponseBody
public class HelloController {
    @RequestMapping("/hello")
    public String sayHello(){
        return "hello spring boot!!" ;
    }
}

4. 启动测试

?

5. 问题

1、为什么我们在添加启动器的时候不需要在启动器的坐标中指定版本?

答案:因为我们指定了项目的父工程,在spring-boot-starter-parent中已经通过Maven的版本锁定了Jar包的版本,所以就不需要再指定了。

2、为什么我们就添加一个启动器依赖,项目就可以运行起来了,运行项目所需要的Jar包从何而来?

答案:因为我们添加了这个启动器的依赖,它已经把自己运行所需要的必要包集成在这个启动器中,通过Maven的依赖传递性,将这些包都依赖到咱们的项目里了。

二、配置文件详解

springboot支持二种类型的配置文件

  • properties属性配置文件
  • yaml配置文件

配置文件必须放置在项目的类加载目录下, 并且名字必须是?application,springboot项目在运行的时候会自动加载这些配置文件

1. 属性配置文件

spring.jdbc.datasource.driverClassName=com.mysql.cj.jdbc.Driver
spring.jdbc.datasource.url=jdbc:mysql://localhost:3306/db_house?characterEncoding=utf8&amp;serverTimezone=Asia/Shanghai&amp;allowPublicKeyRetrieval=true
spring.jdbc.datasource.username=root
spring.jdbc.datasource.password=******

?新建?properties?包,创建类?DataSourceProperties?

package com.atguigu.properties;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class DataSourceProperties {

    // @Value 可以获取属性配置文件的属性值,无需get/set方法。缺点:需要一个一个获取
    @Value("${spring.jdbc.datasource.driverClassName}")
    private String driverClassName;
    @Value("${spring.jdbc.datasource.url}")
    private String url;
    @Value("${spring.jdbc.datasource.username}")
    private String username;
    @Value("${spring.jdbc.datasource.password}")
    private String password;

    // 生成get set 和 toString方法
}

测试:

?成功注入

2. YAML配置文件?

YAML是一种配置文件格式,扩展名是?yaml yml

1.数据结构用树形结构呈现,通过缩进来表示层级,

2.连续的项目通过减号 ” - ” 来表示

3.键值结构里面的key/value对用冒号 ” : ” 来分隔。

?spring:

??jdbc:

????datasource:

??????driverClassName:?com.mysql.jdbc.Driver

??????url:?jdbc:mysql:///springboot_01

??????username:?root

??????password:?root

yml配置文件的特征:

  1. 树状层级结构展示配置项;
  2. 配置项之间如果有关系的话需要分行空两格;
  3. 配置项如果有值的话,那么需要在?:之后空一格再写配置项值;

3. 多环境profile切换配置

在Spring Boot项目中配置文件的名称只能是**application** , 如果我们把所有的配置项全都写在一个配置文件中, 配置文件就会比较复杂和臃肿,不利于后期的项目维护和开发。

1.因为开发环境的变化, 我们需要修改配置文件中某一个配置项的值(比如之前是mysql数据库,切换成oracle数据库)

2.项目开发完成需要上线了 , 需要把一些环境修改成正式环境(开发测试上线,多环境切换)

解决方案 :使用profiles拆分配置

spring boot项目中允许使用多个YAML配置文件。

这些文件名称必须为application-***.yml,并且在application.yml中激活。

spring:
  profiles:
    active: dev

?注意 :

如果propertiesyml文件都存在,不存在spring.profiles.active设置,如果有重叠属性,默认以properties优先。

如果设置了spring.profiles.active,并且有重叠属性,以active设置优先。

可以在两种文件中分别增加server.port属性指定不同的端口,启动项目查看控制台端口号进行测试。

三、Spring Boot自动配置(理解)

@SpringBootApplication 注解

  • @SpringBootConfiguration : 代表这个类就是一个配置类 , 本质上就是一个@Configuration注解
  • @EnableAutoConfiguration : 自动配置注解 , 添加了此注解会自动读取spring.factories配置文件中的自动配置类
  • @ComponentScan : 组件扫描, 默认扫描启动类所在包及子包下的类身上的注解

@ConfigurationProperties(prefix = "xxx") 注解

  • @ConfigurationProperties是SpringBoot提供的重要注解, 他可以将一些配置属性批量注入到bean对象(需要提供get set方法)。(@Value 注解需要属性需要一个一个获取)

报错提示,请在pom文件添加配置信息即可(不影响运行)

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

@Value 一个个注入?

    // @Value 可以获取属性配置文件的属性值,无需get/set方法。缺点:需要一个一个获取
    @Value("${spring.jdbc.datasource.driverClassName}")
    private String driverClassName;
    @Value("${spring.jdbc.datasource.url}")
    private String url;
    @Value("${spring.jdbc.datasource.username}")
    private String username;
    @Value("${spring.jdbc.datasource.password}")
    private String password;

条件化配置注解

注解

作用

@ConditionalOnBean

如果存在某个Bean, 配置类生效

@ConditionalOnMissingBean

如果不存在某个Bean, 配置类生效

@ConditionalOnClass

如果存在某个类, 配置类生效

@ConditionalOnMissingClass

如果不存在某个类, 配置类生效

@ConditionalOnProperty

如果存在某个属性配置, 配置类生效

@ConditionalOnWebApplication

如果是一个web应用, 配置类生效

@ConditionalOnNotWebApplication

如果不是一个web应用, 配置类生效

@RestController //相当于 @Controller + @ResponseBody
//启用属性配置类,带@ConfigurationProperties属性的类要先生效
@EnableConfigurationProperties(value = {DataSourceProperties.class})
public class HelloController {

    @Autowired
    DataSourceProperties dataSourceProperties;

    @RequestMapping("/hello")
    public String sayHello(){
        System.out.println(dataSourceProperties);

        return "hello spring boot!!" ;
    }
}

四、自动配置原理

@SpringBootApplication //声明当前项目是一个SpringBoot项目
public class App {
    //启动内置的Tomcat服务器,即初始化Ioc容器(采用框架默认配置)
    public static void main(String[] args) {
/*
* 自动配置初始化过程:
*   1.从加载jar包中查找META-INF/spring.factories文件,构造出一些工厂对象,来初始化总起
*   2.会查找org.springframework.boot.autoconfigure.EnableAutoConfiguration名称的值。
*       获取了127个配置类。
*           Springboot框架与其他框架继承,提供大量配置类,简化了框架集成过程。可以提高开发效率
*           例如: 引入了spring-boot-starter-web启动器
*                 HttpEncodingAutoConfiguration  自动配置字符编码过滤器.相当于web.xml配置,默认utf-8
*                 MultipartAutoConfiguration   文件上传解析器
*                 WebMvcAutoConfiguration   负责创建视图解析器
*                 DispatcherServletAutoConfiguration   负责创建核心控制器
*
*
* */
        SpringApplication.run(App.class,args);
    }
}

彩蛋 :英姿飒爽的张宇老师

?

?在SpringApplication类构建的时候,有这样一段初始化代码:

?跟进去往下走

?这里发现会通过loadFactoryNames尝试加载一些FactoryName,然后利用createSpringFactoriesInstances将这些加载到的类名进行实例化。 继续跟进loadFactoryNames方法:?发现此处会利用类加载器加载一个文件:?META-INF/spring.factories?。我们知道,ClassLoader默认是从classpath下读取文件,因此,SpringBoot会在初始化的时候,加载所有classpath:META-INF/spring.factories文件,包括jar包当中的。而在Spring的一个依赖包:spring-boot-autoconfigure中,就有这样的文件:

我们引入的任何第三方启动器,只要实现自动配置,也都会有类似文件。

打开后,可以发现以EnableAutoConfiguration接口为key的一系列配置,key所对应的值,就是所有的自动配置类,可以在当前的jar包中找到这些自动配置类,几乎涵盖了现在主流的开源框架

默认属性配置

配置类我们找到了 , 那么这些默认配置的属性来自哪里呢?

例如 : 我们配置视图解析器的时候需要配置前缀和后缀 , 那么这些配置在哪配置的呢 ?

通过源码发现, 这个配置是从this.mvcProperties.getView()中读取的 ,this.mvcProperties又是什么呢 ? 我们继续跟踪,发现其实就是定义的一个变量

?这个变量中又有一个View类型的变量 , 这个变量中配置的就是前缀和后缀,默认为null??

一、自定义启动器?

定义一个连接池启动器 , 当用户引入了连接池启动依赖之后 , 项目中就已经自动配置了连接池

1、开发启动器。2、使用启动器

1.?引入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.atguigu</groupId>
    <artifactId>spring-boot-jdbc-starter</artifactId>
    <version>1.0-SNAPSHOT</version>

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

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!--引入spring‐boot‐starter;所有starter的基本配置-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <!--自动配置连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.12</version>
        </dependency>

        <dependency>
            <groupId>c3p0</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.1.2</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

</project>

2.?创建属性配置类

package com.atguigu.autoconfig;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

//属性配置类
@Component
@ConfigurationProperties(prefix = "spring.jdbc.mydatasource") //由使用者提供
public class MyDataSourceProperties {
    private String driverClassName ;
    private String url;
    private String username;
    private String password;
    // 生成set get toString方法
}

3.?创建自动配置类?

//数据源配置类: 用于创建数据源
//@Configuration
@SpringBootConfiguration //声明配置类,等价于@Configuration
@EnableConfigurationProperties(value = {MyDataSourceProperties.class})
public class DataSourceAutoConfiguration {

    @Autowired
    MyDataSourceProperties myDataSourceProperties;

    @Bean
    @ConditionalOnProperty(value = "spring.jdbc.mydatasource.type",havingValue = "druid")
    public DataSource createDataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(myDataSourceProperties.getDriverClassName());
        dataSource.setUrl(myDataSourceProperties.getUrl());
        dataSource.setUsername(myDataSourceProperties.getUsername());
        dataSource.setPassword(myDataSourceProperties.getPassword());
        System.out.println("自定义启动器生效了! druid");
        return dataSource;
    }

    @Bean //声明数据源bean对象 相当于spring-dao.xml中声明的<bean对象>
    @ConditionalOnProperty(value = "spring.jdbc.mydatasource.type",havingValue = "c3p0")
    public DataSource createC3P0DataSource() throws Exception{
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setDriverClass(myDataSourceProperties.getDriverClassName());
        dataSource.setJdbcUrl(myDataSourceProperties.getUrl());
        dataSource.setUser(myDataSourceProperties.getUsername());
        dataSource.setPassword(myDataSourceProperties.getPassword());
        System.out.println("自定义启动器生效了! c3p0");
        return dataSource;
    }
}

4.?编写自动配置属性文件

在?resources?文件夹下面新建?META-INF/spring.factories,

做完了之后注意要执行install , 安装项目

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.atguigu.autoconfig.DataSourceAutoConfiguration

使用自定义启动器

1. 引入依赖

<dependency>
    <groupId>com.atguigu</groupId>
    <artifactId>spring-boot-jdbc-starter</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

2.?配置连接池信息

application-dev.yml

spring:
  jdbc:
    mydatasource:
      driverClassName: com.mysql.jdbc.Driver
      url: jdbc:mysql://myDataSource
      username: dev
      password: dev
      type: c3p0

#激活配置文件

spring:
  profiles:
    active: dev

3. 注入连接池, 查看连接池属性

@RestController //相当于 @Controller + @ResponseBody
//启用属性配置类,带@ConfigurationProperties属性的类要先生效
@EnableConfigurationProperties(value = {DataSourceProperties.class})
public class HelloController {

    @Autowired
    DataSourceProperties dataSourceProperties;

    @Autowired
    MyDataSourceProperties myDataSourceProperties;

    @RequestMapping("/hello")
    public String sayHello(){

        System.out.println("dataSource:"+myDataSourceProperties);
        System.out.println(dataSourceProperties);

        return "hello spring boot!!" ;
    }
}

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-07-04 22:41:23  更:2022-07-04 22:42:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 15:26:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码