springboot四种属性注入方式


在上篇博文中,我们以连接池配置的例子实践了 spring框架中java配置方式的属性注入。不过属性注入使用的是@Value注解。这种方式虽然可行,但是不够强大,因为它 只能注入基本类型值。在 SpringBoot中,提供了一种新的属性注入方式, 支持各种java基本数据类型及复杂类型的注入

一、文件

  1. 数据源文件:application.properties----------------------------------------写属性值
  2. 属性读取类文件:JdbcProperties-------------------------------------------读属性值
  3. 属性注入配置类文件:JdbcConfiguration-------------将属性值注入spring容器

在这里插入图片描述

1、application.properties文件

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

2、JdbcProperties文件

package cn.itcast.springboot.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
//属性读取类
@ConfigurationProperties(prefix = "jdbc")
public class JdbcProperties {
    private String driverClassName;
    private String url;
    private String username;
    private String password;
    public String getDriverClassName() {
        return driverClassName;
    }
    public void setDriverClassName(String driverClassName) {
        this.driverClassName = driverClassName;
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    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;
    }
}
  • 在类上通过@ConfigurationProperties注解声明当前类为属性读取类
  • prefix="jdbc"读取属性文件中,前缀为jdbc的值。
  • 在类上定义各个属性,名称必须与属性文件中jdbc.后面部分一致,并且必须具有getter和setter方法
  • 需要注意的是,这里我们并没有指定属性文件的地址,SpringBoot默认会读取文件名为application.properties的资源文件,所以我们把jdbc.properties名称改为application.properties

3、JdbcConfiguration文件

通过@EnableConfigurationProperties(JdbcProperties.class)来声明要使用JdbcProperties这个类的对象

二、在JdbcConfiguration类中注入JdbcProperties四种方式

1、@Autowired注入

@Configuration
@EnableConfigurationProperties(JdbcProperties.class)
public class JdbcConfiguration {
    @Autowired
    private JdbcProperties jdbcProperties;
    @Bean
    public DataSource dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl(jdbcProperties.getUrl());
        dataSource.setDriverClassName(jdbcProperties.getDriverClassName());
        dataSource.setUsername(jdbcProperties.getUsername());
        dataSource.setPassword(jdbcProperties.getPassword());
        return dataSource;
    }
}

2、构造函数注入

@Configuration
@EnableConfigurationProperties(JdbcProperties.class)
public class JdbcConfiguration {

    private JdbcProperties jdbcProperties;

    public JdbcConfiguration(JdbcProperties jdbcProperties){
        this.jdbcProperties = jdbcProperties;
    }

    @Bean
    public DataSource dataSource() {
        // 略
    }
}

3、@Bean方法的参数注入

@Configuration
@EnableConfigurationProperties(JdbcProperties.class)
public class JdbcConfiguration {
    @Bean
   public DataSource dataSource(JdbcProperties jdbcProperties){
        DruidDataSource dataSourse = new DruidDataSource();
        dataSourse.setDriverClassName(jdbcProperties.getDriverClassName());
        dataSourse.setUrl(jdbcProperties.getUrl());
        dataSourse.setUsername(jdbcProperties.getUsername());
        dataSourse.setPassword(jdbcProperties.getPassword());
        return dataSourse;
    }
}

springboot这样做看似麻烦,却有一个实际的好处:Relaxed binding:松散绑定

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

4、更优雅的注入

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

@Configuration
public class JdbcConfiguration {
    
    @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方法!

发布了181 篇原创文章 · 获赞 183 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/luckystar_99/article/details/104646554