2 -【 SpringBoot 配置方式 】- 2 SpringBoot 的属性注入

1 SpringBoot 的属性注入

在上面的案例中,我们实验了 java 配置方式。不过属性注入使用的是 @Value 注解。这种方式虽然可行,但是不够强大,因为它只能注入基本类型值。

在 SpringBoot 中,提供了一种新的属性注入方式,支持各种 java 基本数据类型及复杂类型的注入。

1)在 application.properties 配置 jdbc 属性

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://47.104.159.66:3306/ecology
jdbc.username=ecology
jdbc.password=123456

2)我们新建一个类,用来进行属性注入:

package com.snow.config;

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

@ConfigurationProperties(prefix = "jdbc") // 读取 application.properties 文件的前缀
@Data
public class JdbcProperties {
    private String url; // 与 jdbc. 后面的一致
    private String driverClassName;
    private String username;
    private String password;

}

  • 在类上通过 @ConfigurationProperties 注解声明当前类为属性读取类

  • prefix="jdbc" 读取属性文件中,前缀为 jdbc 的值。

  • 在类上定义各个属性,名称必须与属性文件中 jdbc. 后面部分一致

  • 需要注意的是,这里我们并没有指定属性文件的地址,所以我们需要把 jdbc.properties 名称改为 application.properties ,这是 SpringBoot 默认读取的属性文件名:

在这里插入图片描述

3)在 JdbcConfig 中使用这个属性:

package com.snow.config;

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

import javax.sql.DataSource;

@Configuration // 声明该类是一个配置类
@EnableConfigurationProperties(JdbcProperties.class) // 声明要使用 `JdbcProperties` 这个类的对象
public class JdbcConfig {

    @Bean
    public DataSource dataSource(JdbcProperties jdbc) {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl(jdbc.getUrl());
        dataSource.setDriverClassName(jdbc.getDriverClassName());
        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
      public Datasource dataSource(JdbcProperties prop){
          // ...
      }
      

本例中,我们采用第三种方式。

3)测试结果:

在这里插入图片描述

大家会觉得这种方式似乎更麻烦了,事实上这种方式有更强大的功能,也是 SpringBoot 推荐的注入方式。两者对比关系:

在这里插入图片描述

优势:

  • Relaxed binding:松散绑定

    • 不严格要求属性文件中的属性名与成员变量名一致。支持驼峰,中划线,下划线等等转换,甚至支持对象引导。比如:user.friend.name:代表的是 user 对象中的 friend 属性中的 name 属性,显然 friend 也是对象。@value 注解就难以完成这样的注入方式。

    • meta-data support:元数据支持,帮助IDE生成属性提示(写开源框架会用到)。

2 更优雅的注入

事实上,如果一段属性只有一个 Bean 需要使用,我们无需将其注入到一个类(JdbcProperties)中。而是直接在需要的地方声明即可:

@Configuration
public class JdbcConfig {
    
    @Bean
    // 声明要注入的属性前缀,SpringBoot会自动把相关属性通过set方法注入到DataSource中
    @ConfigurationProperties(prefix = "jdbc")
    public DataSource dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        return dataSource;
    }
}

我们直接把 @ConfigurationProperties(prefix = "jdbc") 声明在需要使用的 @Bean 的方法上,然后 SpringBoot 就会自动调用这个 Bean(此处是 DataSource)的 set 方法,然后完成注入。使用的前提是:该类必须有对应属性的 set 方法!

我们将 jdbc 的 url 改成:/test,再次测试:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不知所起 一往而深

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值