— springboot — 1 min read
在Spring使用注解开发中我们基于spring
注解的方式配置了数据源。使用spring
注解value
注入属性文件,存在一定的局限性。如果新增一个类中配置数据源,又需要再次的通过value
注解注入属性。
如果项目采用了springboot
作为脚手架,springboot
的底层已经为我们做了大量的配置。并且sprinboot文件是统一用application.properties
管理。将数据源信息添加到applicaton.properties
中:
1jdbc.driverClassName=com.mysql.cj.jdbc.Driver2jdbc.url=jdbc:mysql://localhost:3306/community?useUnicode=true&characterEncoding=utf83jdbc.username=root4jdbc.password=123456
增加属性配置类jdbcProperties.java
,增加属性值:
1@ConfigurationProperties(prefix = "jdbc")2public class JDBCProperties {34 private String driverClassName;5 private String url;6 private String username;7 private String password;89 public String getDriverClassName() {10 return driverClassName;11 }1213 public void setDriverClassName(String driverClassName) {14 this.driverClassName = driverClassName;15 }1617 public String getUrl() {18 return url;19 }2021 public void setUrl(String url) {22 this.url = url;23 }2425 public String getUsername() {26 return username;27 }2829 public void setUsername(String username) {30 this.username = username;31 }3233 public String getPassword() {34 return password;35 }3637 public void setPassword(String password) {38 this.password = password;39 }40}
@ConfigurationProperties
注解不能指定配置文件文件位置,默认读取classpaath
下的application.propeties
文件。@ConfigurationProperties(prefix = "jdbc")
注解,指定前缀来对应application.properties
中的配置信息
@ConfigurationProperties
是springboot
提供的资源文件读取注解,所以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
有以下几种配置方法注入数据源属性:
此注入方式JDBCProperties.java
需要生成getter
和setter
。
autowire可以注入时,需要添加注入类的getter
和setter
方法,并且属性名称要和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.Driver2jdbc.url=jdbc:mysql://localhost:3306/community?useUnicode=true&characterEncoding=utf83jdbc.username=root4jdbc.password=123456
增加数据源配置类jdbcConfiguarion.java
,增加以下内容:
1@Configuration2@EnableConfigurationProperties(JDBCProperties.class)3public class jdbcConfiguarion {45 @Autowired6 private JDBCProperties jdbcProperties;78 @Bean9 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
需要生成getter
和setter
。
修改jdbcConfiguarion.java
类,取消@autowired
注解,添加构造方法
1public JDBCConfiguarion(JDBCProperties jdbcProperties){23 this.jdbcProperties= jdbcProperties;4 }
1@Configuration2@EnableConfigurationProperties(JDBCProperties.class)3public class jdbcConfiguarion {45 private JDBCProperties jdbcProperties;67 public JDBCConfiguarion(JDBCProperties jdbcProperties){89 this.jdbcProperties= jdbcProperties;10 }11121314 @Bean15 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
需要生成getter
和setter
。
在数据源的@Bean
方法行参中添加之前配置的数据源配置类JDBCProperties
1@Configuration2@EnableConfigurationProperties(JDBCProperties.class)3public class JDBCConfiguarion {45 @Bean6 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 }141516}
@ConfigurationProperties
注解注入此注入方式JDBCProperties.java
不需要生成getter
和setter
。
在对应的@Bean
方法上添加@ConfigurationProperties
注解以及取消@EnableConfigurationProperties(JDBCProperties.class)
注解。
。同时取消原先JDBCProperties.java
类上的@ConfigurationProperties
注解。
1@Configuration2public class JDBCConfiguarion {34 @Bean5 @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@RestController2public class DataSourceController {34 @Autowired5 private DruidDataSource dataSource;67 @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 }1617}
注意可以注入实现类也可以注
1@Autowired2 private DataSource dataSource;
如果有属性值则说明注入成功。
(完)