springboot属性注入的四种方式
这篇文章主要和大家分享下springboot的四种属性注入方式,需要先掌握一些的springboot相关的知识。
第一种:通过@autowired进行注入
本次以数据库连接所需的属性为例进行分析,具体的步骤如下:
- 需要有springboot启动类和简单的controller层的文件,用于测试,在下面的截图中可以看到controller层简单的代码。
- 定义一个资源配置文件,在springboot中,只有一个资源配置文件,也就是:application.properties(yml)。在里面写数据库配置的一些相关信息,如下:
* jdbc.driverClassName=com.mysql.jdbc.Driver
* jdbc.url=jdbc:mysql://localhost:3306/zzh
* jdbc.uname=root
* jdbc.password=root - 定义一个数据库信息的属性读取类JdbcProperties,在类上写@ConfigurationProperties注解,并配置prefix属性,prefix即前缀的意思,在本案例中为:jdbc。接着在类中定义属性,属性名称要和配置文件的字段名字一致,并生成getter和setter方法。代码如下:
@ConfigurationProperties(prefix = "jdbc")
//@EnableConfigurationProperties(JdbcProperties.class)
public class JdbcProperties {
private String driverClassName;
private String url;
private String uname;
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 getUname() {
return uname;
}
public void setUname(String username) {
this.uname = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
- 接着定义一个数据库资源配置类JdbcConfiguration,类上定义@Configuration声明该类是一个java配置类,再使用@EnableConfigurationProperties(属性读取类的字节码文件)。再者,在类中定义属性读取类,并通过@Autowired注解进行注入。最后定义方法获得DadaSource对象。代码块如下:
@Configuration // 声明一个类为一个Java配置类
@EnableConfigurationProperties(JdbcProperties.class)
public class JdbcConfiguration {
@Autowired
private JdbcProperties jdbcProperties;
@Bean // 把方法的返回值注入到spring容器
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(this.jdbcProperties.getDriverClassName());
dataSource.setUrl(this.jdbcProperties.getUrl());
dataSource.setUsername(this.jdbcProperties.getUname());
dataSource.setPassword(this.jdbcProperties.getPassword());
return dataSource;
}
}
- 通过springboot启动类进行启动,如下图,可以看到DataSource重要属性就注入成功了。
第二种:通过构造方法进行注入
在第一种配置的基础上略作修改,过程如下:
- 在JdbcConfiguration类中,不使用@Autowired注解对JdbcProperties属性读取类进行注入,而是写一个构造方法对其进行读取,代码块如下:
@Configuration // 声明一个类为一个Java配置类
//@PropertySource("classpath:jdbc.properties")
@EnableConfigurationProperties(JdbcProperties.class)
public class JdbcConfiguration {
private JdbcProperties jdbcProperties;
public JdbcConfiguration(JdbcProperties jdbcProperties) {
this.jdbcProperties = jdbcProperties;
}
- 同上,使用springboot启动类,设置断点,debug启动,看效果,如下图所示。
第三种:通过方法的形参调用进行配置
在JdbcConfiguration的获取DataSource对象中,我们可以在里面添加JdbcProperties的形参进行属性配置,直接上代码块:
@Configuration // 声明一个类为一个Java配置类
//@PropertySource("classpath:jdbc.properties")
@EnableConfigurationProperties(JdbcProperties.class)
public class JdbcConfiguration {
@Bean // 把方法的返回值注入到spring容器
public DataSource dataSource(JdbcProperties jdbcProperties) {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(jdbcProperties.getDriverClassName());
dataSource.setUrl(jdbcProperties.getUrl());
dataSource.setUsername(jdbcProperties.getUname());
dataSource.setPassword(jdbcProperties.getPassword());
return dataSource;
}
}
这种方式也能获取到DataSource对象的四大属性值。
第四种:在方法上使用@ConfigurationProperties注解
@ConfigurationProperties注解不仅可以用在类上,还可以用在方法上,这种方法的代码非常简单。在获取DataSource对象的方法上添加该注解,并指定前缀,代码块如下:
@Configuration // 声明一个类为一个Java配置类
@EnableConfigurationProperties(JdbcProperties.class)
public class JdbcConfiguration {
@Bean // 把方法的返回值注入到spring容器
@ConfigurationProperties(prefix = "jdbc")
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
return dataSource;
}
}
如此,也能读取DataSource重要的四大属性。
以上便是springboot的四种属性注入的方式,第一种方式使用的会比较多,更符合我们的书写习惯/但是,从中可能会碰到一个问题就是:
- 配置数据源出错:Error creating bean with name ‘dataSource’ defined…
这时候不要慌张,这种原因可能是名字和DataSource的属性名字冲突,可以把配置文件中jdbc.username改成jdbc.uname或者其他,同样的,属性读取类也要做相应的变化,通过这种方法便解决了该问题。
还在学习web的过程中,理解没有大牛深,有哪些不足之处,欢迎指证,谢谢大家。