springboot:配置数据库、属性注入(松散绑定)、properties和yml

一、java配置数据库

在这里插入图片描述
在这里插入图片描述这里新注解可参考:Spring新注解配置入门
在这里插入图片描述

下面代码基于上一篇:

  1. 在 pom.xml 文件中添加Druid连接池依赖如下:
	<!--java配置配置数据库要的-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>
  1. 使用数据操作工具创建数据库 springboot_test在这里插入图片描述3. 然后在项目中创建 Spingboot_day1\src\main\resources\jdbc.properties 文件,内容如下:
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/springboot_test
jdbc.username=root
jdbc.password=root
  1. 编写 Spingboot_day1\src\main\java\com\itheima\config\JdbcConfig.java 如下:
package com.itheima.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

import javax.sql.DataSource;

/**
 * @author QLBF
 * @version 1.0
 * @date 2021/2/19 17:45
 */
@Configuration
@PropertySource("classpath:jdbc.properties")
public class JdbcConfig {
    
    

    @Value("${jdbc.url}")
    String url;
    @Value("${jdbc.driverClassName}")
    String driverClassName;
    @Value("${jdbc.username}")
    String username;
    @Value("${jdbc.password}")
    String password;

    @Bean
    public DataSource dataSource(){
    
    
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClassName);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }
}

在这里插入图片描述
5. 在 HelloController 中注入DataSource进行测试,改造代码如下:

package com.itheima.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.sql.DataSource;

/**
 * @author QLBF
 * @version 1.0
 * @date 2021/2/19 15:33
 */

@RestController
public class HelloController {
    
    

    @Autowired
    private DataSource dataSource;
    @GetMapping("hello1")
    public String hello(){
    
    
        System.out.println("dataSource="+dataSource);
        return "hello spring boot!!!";
    }
}

然后再运行Application启动类:

package com.itheima;

/**
 * @author QLBF
 * @version 1.0
 * @date 2021/2/19 14:27
 */

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * spring boot工程都有一个启动引导类,这是工程的入口类
 * 并在引导类上添加@SpringBootApplication
 */
@SpringBootApplication
public class Application {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(Application.class,args);
    }
}

,再在浏览器访问hello1资源,然后控制台就输出了:在这里插入图片描述
测试成功!

二、Spring Boot的属性注入

属性文件的名称有变化,默认的文件名必须是:application.properties或application.yml
在上面的案例中,我们实验了java配置方式。不过属性注入使用的是@Value注解。这种方式虽然可行,但是不够强
大,因为它只能注入基本类型值。

在Spring Boot中,提供了一种新的属性注入方式,支持各种java基本数据类型及复杂类型的注入。
在这里插入图片描述

2.1 基于application.properties

基于上面 一 的代码
1)新建 Spingboot_day1\src\main\java\com\itheima\config\JdbcProperties.java ,用于进行属性注
入:
松散绑定:

package com.itheima.config;

/**
 * @author QLBF
 * @version 1.0
 * @date 2021/2/19 23:15
 */

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

/**
 * ConfigurationProperties 从application配置文件中读取配置项
 * prefix 表示 配置项的前缀
 * 配置项类中的类变量名必须要与 前缀之后的配置项名称(application.properties左边一列)保持 松散绑定(相同)
 */
@ConfigurationProperties(prefix = "jdbc")  //这是直接注入到类上,注入到方法上不用
public class JdbcProperties {
    
    
    private String url;
    private String driverClassName;
    private String username;
    private String password;

    public String getUrl() {
    
    
        return url;
    }

    public void setUrl(String url) {
    
    
        this.url = url;
    }

    public String getDriverClassName() {
    
    
        return driverClassName;
    }

    public void setDriverClassName(String driverClassName) {
    
    
        this.driverClassName = driverClassName;
    }

    public String getUsername() {
    
    
        return username;
    }

    public void setUsername(String username) {
    
    
        this.username = username;
    }

    public String getPassword() {
    
    
        return password;
    }

    public void setPassword(String password) {
    
    
        this.password = password;
    }
}

application.properties(可改为其他名):
全程没有引用它,但JdbcProperties 通过前缀可以识别到它

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/springboot_test
jdbc.username=root
jdbc.password=root

在这里插入图片描述

在这里插入图片描述
总的pom.xml:

<?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>

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

    </parent>
    <groupId>cn.itcast</groupId>
    <artifactId>Spingboot_day1</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <java.version>1.9</java.version>
    </properties>

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

        <!--java配置配置数据库要的-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>

        <!--Spring Boot的属性注入需要的-->
        <dependency>
            <groupId> org.springframework.boot </groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <!--不传递依赖-->
            <optional>true</optional>
        </dependency>

    </dependencies>
</project>

(2)将 JdbcConfig 类原来全部注释掉或删除,修改为如下内容:

package com.itheima.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

import javax.sql.DataSource;

/**
 * @author QLBF
 * @version 1.0
 * @date 2021/2/19 17:45
 */
@Configuration
@EnableConfigurationProperties(JdbcProperties.class)//这个是把配置类注入到类上,注入到方法不用
public class JdbcConfig {
    
    

    /*1.java配置应用的代码
    @Value("${jdbc.url}")
    String url;
    @Value("${jdbc.driverClassName}")
    String driverClassName;
    @Value("${jdbc.username}")
    String username;
    @Value("${jdbc.password}")
    String password;

    @Bean
    public DataSource dataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClassName);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }
    */
	
	//2.在类上注入application.properties的方法
    @Bean
    public DataSource dataSource(JdbcProperties jdbc){
    
    
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(jdbc.getDriverClassName());
        dataSource.setUrl(jdbc.getUrl());
        dataSource.setUsername(jdbc.getUsername());
        dataSource.setPassword(jdbc.getPassword());
        return dataSource;
    }
}

通过 @EnableConfigurationProperties(JdbcProperties.class) 来声明要使用 JdbcProperties 这个类的
对象
然后要使用配置的话;可以通过以下方式注入JdbcProperties:

  • @Autowired注入
@Autowired
 private JdbcProperties prop;
  • 构造函数注入
private JdbcProperties prop; 
public JdbcConfig(Jdbcproperties prop)
{
    
     
	this.prop = prop; 
}
  • 声明有@Bean的方法参数注入

本例中,我们采用第三种方式@Bean。
(3)测试:运行Application启动类:
(HelloController和Application的代码和这篇博客一的代码)
在这里插入图片描述访问controller的资源成功执行。

大家会觉得这种方式似乎更麻烦了, (就是弄个有配置文件左边的属性的类注入到JdbcConfig上,就不用@Value写而已) ,事实上这种方式有更强大的功能,也是Spring Boot推荐的注入方式。与@Value
对比关系:
在这里插入图片描述
更优雅的注入:
在这里插入图片描述就是不把JdbcPropertis直接注入到类上,而是注入到方法上:
把JdbcProperties的ConfigurationProperties前缀注释掉:

在这里插入图片描述然后在JdbcConfig.java更简单了:

package com.itheima.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

import javax.sql.DataSource;

/**
 * @author QLBF
 * @version 1.0
 * @date 2021/2/19 17:45
 */
@Configuration
//@EnableConfigurationProperties(JdbcProperties.class) //这个是把配置类注入到类上,注入到方法不用
public class JdbcConfig {
    
    
/*1.java配置应用的代码
    @Value("${jdbc.url}")
    String url;
    @Value("${jdbc.driverClassName}")
    String driverClassName;
    @Value("${jdbc.username}")
    String username;
    @Value("${jdbc.password}")
    String password;

    @Bean
    public DataSource dataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClassName);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }
    */

    //2.1.1java配置应用的代码,注入到类上
    /*
    @Bean
    public DataSource dataSource(JdbcProperties jdbc){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(jdbc.getDriverClassName());
        dataSource.setUrl(jdbc.getUrl());
        dataSource.setUsername(jdbc.getUsername());
        dataSource.setPassword(jdbc.getPassword());
        return dataSource;
    }
    */

    //2.1.2//注入到方法上
    @Bean
    @ConfigurationProperties(prefix = "jdbc")
    public DataSource dataSource(){
    
    
        return new DruidDataSource();
    }
}

再执行启动类一样成功!

2.2 基于Yaml(yml)配置文件

yaml与properties配置文件除了展示形式不相同以外,其它功能和作用都是一样的;在项目中原路的读取方式不需要改变。(application.yml可以改名的其实,但一般是这个)
在这里插入图片描述

1、yml配置文件的特征:
(1)树状层级结构展示配置项;
(2)配置项之间如果有关系的话需要分行空两格
(3)配置项如果有值的话,那么需要在 :之后空一格再写配置项值;
将application.properties配置文件修改为application.yml的话:
在这里插入图片描述在这里插入图片描述

2、多个yml配置文件;在spring boot中是被允许的。这些配置文件的名称必须为application-xxx.yml,并且这些配置文件必须要在application.yml配置文件中激活之后才可以使用。

3、如果properties和yml配置文件同时存在在spring boot项目中;那么这两类配置文件都有效。在两个配置文件中如果存在同名的配置项的话会以properties文件的为主。

小结:
当一个项目中有多个yml配置文件的时候,可以以application-**.yml命名;在application.yml中配置项目使用激活这些配置文件即可。

#激活配置文件;需要指定其它的配置文件名称(如application-abc,application-def)
spring:
  profiles:  #(前面是两个空格)
    active: abc,def  #(前面一共是4个空格)

改造上面的代码:
删了application.properties

application-abc.yml:

itcast:
  url: http://www.itcast.cn

application-def.yml:

itheima:
  url: http://www.itheima.com

application.yml:(要用pro.act打出来下面那几天东西)

jdbc:
  driverClassName: com.mysql.jdbc.Driver
  url: jdbc:mysql://127.0.0.1:3306/springboot_test
  username: root
  password: root

#激活配置文件,需指定其他的配置文件名称
spring:
  profiles:
    active: abc,def

在这里插入图片描述

然后我们再在HelloController测试(可以像properties用.来@value注入):

yml也可以和properties使用@Value("${itcast.url}")的

package com.itheima.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.sql.DataSource;

/**
 * @author QLBF
 * @version 1.0
 * @date 2021/2/19 15:33
 */

@RestController
public class HelloController {
    
    

    @Autowired
    private DataSource dataSource;

    //多个yml测试
    @Value("${itcast.url}")   //是写yml里面的根.xx
    private String itcastUrl;
    @Value("${itheima.url}")  //是写yml里面的根.xx
    private String itHeimaUrl;

    @GetMapping("hello1")
    public String hello(){
    
    
        System.out.println("yml的abc文件test:"+itcastUrl);
        System.out.println("yml的def文件test:"+itHeimaUrl);
        System.out.println("dataSource="+dataSource);
        return "hello spring boot4!!!";
    }
}

运行启动类执行成功:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/GLOAL_COOK/article/details/113868748