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,再次测试: