Skip to content

毛俊的博客

springboot配置数据源的四种方式

springboot1 min read

Spring使用注解开发中我们基于spring注解的方式配置了数据源。使用spring注解value注入属性文件,存在一定的局限性。如果新增一个类中配置数据源,又需要再次的通过value注解注入属性。

如果项目采用了springboot作为脚手架,springboot的底层已经为我们做了大量的配置。并且sprinboot文件是统一用application.properties管理。将数据源信息添加到applicaton.properties中:

1jdbc.driverClassName=com.mysql.cj.jdbc.Driver
2jdbc.url=jdbc:mysql://localhost:3306/community?useUnicode=true&characterEncoding=utf8
3jdbc.username=root
4jdbc.password=123456

增加属性配置类jdbcProperties.java,增加属性值:

1@ConfigurationProperties(prefix = "jdbc")
2public class JDBCProperties {
3
4 private String driverClassName;
5 private String url;
6 private String username;
7 private String password;
8
9 public String getDriverClassName() {
10 return driverClassName;
11 }
12
13 public void setDriverClassName(String driverClassName) {
14 this.driverClassName = driverClassName;
15 }
16
17 public String getUrl() {
18 return url;
19 }
20
21 public void setUrl(String url) {
22 this.url = url;
23 }
24
25 public String getUsername() {
26 return username;
27 }
28
29 public void setUsername(String username) {
30 this.username = username;
31 }
32
33 public String getPassword() {
34 return password;
35 }
36
37 public void setPassword(String password) {
38 this.password = password;
39 }
40}

@ConfigurationProperties注解不能指定配置文件文件位置,默认读取classpaath下的application.propeties文件。 @ConfigurationProperties(prefix = "jdbc")注解,指定前缀来对应application.properties中的配置信息

@ConfigurationPropertiesspringboot提供的资源文件读取注解,所以springboot只需要一个配置文件application.propeties即可,通过前缀区分不同的配置。无需像spring项目一样有那么多的配置文件了。

使用`@ConfigurationProperties后,IDEA会报一个问题:

1Spring Boot Configuration Annotation Processor not configured

pom.xml中添加以下依赖即可解决:

1<dependency>
2 <groupId>org.springframework.boot</groupId>
3 <artifactId>spring-boot-configuration-processor</artifactId>
4 <optional>true</optional>
5 </dependency>

写好配置类后,springboot有以下几种配置方法注入数据源属性:

autowired注入

此注入方式JDBCProperties.java需要生成gettersetter

autowire可以注入时,需要添加注入类的gettersetter方法,并且属性名称要和application.properties中的保持一致。否则会读取不到配置信息。如: driverClassName,url,username,password

1private String driverClassName;
2 private String url;
3 private String username;
4 private String password;

对应

1jdbc.driverClassName=com.mysql.cj.jdbc.Driver
2jdbc.url=jdbc:mysql://localhost:3306/community?useUnicode=true&characterEncoding=utf8
3jdbc.username=root
4jdbc.password=123456

增加数据源配置类jdbcConfiguarion.java,增加以下内容:

1@Configuration
2@EnableConfigurationProperties(JDBCProperties.class)
3public class jdbcConfiguarion {
4
5 @Autowired
6 private JDBCProperties jdbcProperties;
7
8 @Bean
9 public DruidDataSource dataSource(){
10 DruidDataSource dataSource = new DruidDataSource();
11 dataSource.setDriverClassName(this.jdbcProperties.getDriverClassName());
12 dataSource.setUrl(this.jdbcProperties.getUrl());
13 dataSource.setUsername(this.jdbcProperties.getUsername());
14 dataSource.setPassword(this.jdbcProperties.getPassword());
15 return dataSource;
16 }
17}

注意:通过@EnableConfigurationProperties(JDBCProperties.class)来启用指定配置文件的位置,否则使用@autowired会报错无法注入 @EnableConfigurationProperties可以有多个配置文件(数组),用,号隔开即可 用this来表示成员变量,提高代码辨识度

构造方法注入

此注入方式JDBCProperties.java需要生成gettersetter

修改jdbcConfiguarion.java类,取消@autowired注解,添加构造方法

1public JDBCConfiguarion(JDBCProperties jdbcProperties){
2
3 this.jdbcProperties= jdbcProperties;
4 }
1@Configuration
2@EnableConfigurationProperties(JDBCProperties.class)
3public class jdbcConfiguarion {
4
5 private JDBCProperties jdbcProperties;
6
7 public JDBCConfiguarion(JDBCProperties jdbcProperties){
8
9 this.jdbcProperties= jdbcProperties;
10 }
11
12
13
14 @Bean
15 public DruidDataSource dataSource(){
16 DruidDataSource dataSource = new DruidDataSource();
17 dataSource.setDriverClassName(this.jdbcProperties.getDriverClassName());
18 dataSource.setUrl(this.jdbcProperties.getUrl());
19 dataSource.setUsername(this.jdbcProperties.getUsername());
20 dataSource.setPassword(this.jdbcProperties.getPassword());
21 return dataSource;
22 }
23}

方法形参注入

此注入方式JDBCProperties.java需要生成gettersetter

在数据源的@Bean方法行参中添加之前配置的数据源配置类JDBCProperties

1@Configuration
2@EnableConfigurationProperties(JDBCProperties.class)
3public class JDBCConfiguarion {
4
5 @Bean
6 public DruidDataSource dataSource(JDBCProperties jdbcProperties){
7 DruidDataSource dataSource = new DruidDataSource();
8 dataSource.setDriverClassName(jdbcProperties.getDriverClassName());
9 dataSource.setUrl(jdbcProperties.getUrl());
10 dataSource.setUsername(jdbcProperties.getUsername());
11 dataSource.setPassword(jdbcProperties.getPassword());
12 return dataSource;
13 }
14
15
16}

方法上@ConfigurationProperties注解注入

此注入方式JDBCProperties.java不需要生成gettersetter

在对应的@Bean方法上添加@ConfigurationProperties注解以及取消@EnableConfigurationProperties(JDBCProperties.class)注解。 。同时取消原先JDBCProperties.java类上的@ConfigurationProperties注解。

1@Configuration
2public class JDBCConfiguarion {
3
4 @Bean
5 @ConfigurationProperties(prefix = "jdbc")
6 public DruidDataSource dataSource(){
7 DruidDataSource dataSource = new DruidDataSource();
8 return dataSource;
9 }
10}

通过以上四种方法注入后,新建一个DataSourceController.java类,DEBUGS方式启动springboot项目,在

1Connection connection = dataSource.getConnection();

上打个断点,查看断点信息是否有注入数据源的属性值。

1@RestController
2public class DataSourceController {
3
4 @Autowired
5 private DruidDataSource dataSource;
6
7 @GetMapping("hello")
8 public String datasource(){
9 try {
10 Connection connection = dataSource.getConnection();
11 } catch (SQLException e) {
12 e.printStackTrace();
13 }
14 return "hi";
15 }
16
17}

注意可以注入实现类也可以注

1@Autowired
2 private DataSource dataSource;

如果有属性值则说明注入成功。 属性注入

(完)

© 2020 by 毛俊的博客. All rights reserved.
Theme by LekoArts