默认配置原理
- springboot的默认配置方式和我们之前玩的配置方式不太一样,没有任何的xml。那么如果自己要新增配置该怎么办?
常用的java配置
- @Configuration:声明一个类作为配置类,代替xml文件
- @Bean:声明在方法上,将方法的返回值加入Bean容器,代替标签
- @Value:属性注入
- @PropertySource:指定外部属性文件。
第一种常见java配置,这里使用jdbc来演示
- 引入依赖
<dependency>
<groupId>com.github.drtrang</groupId>
<artifactId>druid-spring-boot2-starter</artifactId>
<version>1.1.10</version>
</dependency>
- 添加jdbc.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/ry
jdbc.username=root
jdbc.password=root
- 创建JdbcConfiguration类:
@Configuration
@PropertySource("classpath:jdbc.properties")
public class JdbcConfiguration {
@Value("${jdbc:url}")
private String url;
@Value("${jdbc.driverClassName}")
private String driverClassName;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Bean
public DataSource dataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(url);
dataSource.setDriverClassName(driverClassName);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
}
解读:
- @Configuration:声明JdbcConfiguration是一个配置类。
- @PropertySource:指定属性文件的路径是:classpath:jdbc.properties
- 通过@Value为属性注入值。
- 通过@Bean将 dataSource()方法声明为一个注册Bean的方法,Spring会自动调用该方法,将方法的返回值加入Spring容器中。相当于以前的bean标签
然后就可以在任意位置通过@Autowired注入DataSource了!
这里我们在之前写的Controller里面测试,这里可以看到已经成功注入,交给Spring管理
SpringBoot的属性注入
在上面的案例中,我们实验了java配置方式。不过属性注入使用的是@Value注解。这种方式虽然可行,但是不够强大,因为它只能注入基本类型值。
在SpringBoot中,提供了一种新的属性注入方式,支持各种java基本数据类型及复杂类型的注入。
-
新建JdbcProperties,用来进行属性注入
-
改造之前的jdbc配置类
-
在JdbcConfiguration中使用这个属性:
-
通过@EnableConfigurationProperties(JdbcProperties.class)来声明要使用JdbcProperties这个类的对象
-
然后你可以通过以下方式在JdbcConfiguration类中注入JdbcProperties:
//@Configuration
@Component
//@PropertySource("classpath:jdbc.properties")
@EnableConfigurationProperties(JdbcProperties.class)
public class JdbcConfiguration {
@Autowired
private JdbcProperties jdbcProperties;
// @Value("${jdbc:url}")
// private String url;
//
// @Value("${jdbc.driverClassName}")
// private String driverClassName;
//
//
// @Value("${jdbc.username}")
// private String username;
//
// @Value("${jdbc.password}")
// private String password;
@Bean
public DataSource dataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(jdbcProperties.getUrl());
dataSource.setDriverClassName(jdbcProperties.getDriverClassName());
dataSource.setUsername(jdbcProperties.getUsername());
dataSource.setPassword(jdbcProperties.getPassword());
return dataSource;
}
}
- 在类上通过@ConfigurationProperties注解声明当前类为属性读取类
- prefix="jdbc"读取属性文件中,前缀为jdbc的值。
- 在类上定义各个属性,名称必须与属性文件中jdbc.后面部分一致,并且必须具有getter和setter方法
- 需要注意的是,这里我们并没有指定属性文件的地址,SpringBoot默认会读取文件名为application.properties的资源文件,添加application.yml(一样的,更符合读写)
jdbc:
url: com.mysql.jdbc.Driver
driverClassName: jdbc:mysql:127.0.0.1:3606/ry
username: root
password: root
启动访问之前的方法,已经可以看到配置信息已经注入该对象当中
- 这里有个小问题,但不影响启动,上面的jdbcProperties在注入的时候显示报红Could not autowire. No beans of ‘JdbcProperties’ type found,但启动的时候依然是可以注入使用,
- 这时我们可以在类上加上一个注解 @Component,标识为交给Spring容器管理,这时就不会报红提示了