传统SSM项目中,如果要配置一个数据库连接池等,可以通过xml文件的方式进行属性注入。
SpringBoot提供了新的属性注入方式,支持各种java基本数据类型和复杂类型的注入而不需要xml文件。
方法一
-
新建一个类,用于进行属性注入:
// 在类上通过@ConfigurationProperties注解声明当前类为属性读取类 // prefix="jdbc"读取属性文件中,前缀为jdbc的值。 @ConfigurationProperties(prefix = "jdbc") @Data // lombok public class JdbcProperties { // 在类上定义各个属性,名称必须与属性文件中jdbc.后面部分一致 private String driverClassName; private String url; private String username; private String password; }
SpringBoot默认读取的属性文件名为application.properties或者application.yml。当两者同时存在时,取并集,且以application.properties优先
-
在
JdbcConfiguration
类中使用这些属性:// @Configuration注解:声明一个类作为配置类,代替xml文件 @Configuration // 通过@EnableConfigurationProperties(JdbcProperties.class)来声明要使用JdbcProperties这个类的对象 @EnableConfigurationProperties(JdbcProperties.class) public class JdbcConfiguration { // @Bean:声明在方法上,将方法的返回值加入Bean容器,代替<bean>标签 @Bean public DataSource dataSource(JdbcProperties jdbcProperties) { DruidDataSource druidDataSource = new DruidDataSource(); druidDataSource.setDriverClassName(jdbcProperties.getDriverClassName()); druidDataSource.setUrl(jdbcProperties.getUrl()); druidDataSource.setUsername(jdbcProperties.getUsername()); druidDataSource.setPassword(jdbcProperties.getPassword()); return druidDataSource; } }
可以通过以下方式注入JdbcProperties:
-
@Autowired注入
@Autowired private JdbcProperties prop;
-
构造函数注入
private JdbcProperties prop; public JdbcConfig(Jdbcproperties prop){ this.prop = prop; }
-
声明有
@Bean
的方法参数注入@Bean public Datasource dataSource(JdbcProperties prop){ // ... }
-
方法二:更优雅的注入
事实上,如果一段属性只有一个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方法!
附:application.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///**?useUnicode=true&characterEncoding=utf-8&useSSL=false
jdbc.username=username
jdbc.password=password