引入
这里有一个jdbc.properties配置文件:
jdbc.driverClassName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/loliDB
jdbc.username=root
jdbc.password=123456
如何配置出一个数据连接池的Bean呢?
<!-- 加载外部资源资源文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- DataSource数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
emmmmm…没什么问题。接着往下看。
Spring配置的历史
xml配置?注解配置?谁才是历史的选择?我们不妨来回顾一下关于Spring配置的历史:
- Spring1.0时代
jdk1.5刚刚发布,注解开发并未为人们所熟知,因此一切配置都是xml。想象一下,铺天盖地的xml文件,铺天盖地的bean标签… - Spring2.0时代
Spring此时已经引入了注解开发,但尚未完全完善。也就是说,注解配置并不能完全替代xml配置,所以人们都是两种混合使用。 - Spring3.0时代及之后
此时的注解开发已经非常完善,xml文件可以被完全删掉,Spring官方也推荐开发者使用全注解配置。SpringBoot来临后,基本宣告xml配置方式已经缓期死刑。
开发者应该对新事物保持追求,敢于抛弃历史遗留物。因此,无论你对xml文件有着多么深厚感情,我还是推荐你尽快玩转注解。
Spring注解配置全图解
1-通过新注解彻底摆脱xml
在学习Spring的时候我们就知道,使用原始注解无法彻底删除xml文件。因此又引入了诸多新注解。
具体的思路是:将一个类指定为配置类并加载资源文件,将资源文件的一个个配置参数通过 @Value注解 注入到类中的成员变量上,从而得以在配置类中使用资源文件的配置参数,并最终配置好一个连接池Bean对象。
注解 | 说明 |
---|---|
@Configuration | 标明这是一个Spring配置类 |
@PropertySource | 用于加载资源文件 |
@Bean | 被标注的返回值会直接被放到Spring容器中 |
@Value | 原始注解,用于属性注入 |
代码:
JdbcConfig配置类 ----------------------------------------------------------------------------
@Configuration
@PropertySource("classpath:jdbc.properties")
public class JdbcConfig {
@Value("${jdbc.driverClassName}")
String driverClassName;
@Value("${jdbc.url}")
String url;
@Value("${jdbc.username}")
String username;
@Value("${jdbc.password}")
String password;
@Bean
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driverClassName);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
}
2-将properties资源文件转化为Properties资源类
上一种使用@Value注入属性的方式有个缺点,那就是只能注入基本数据类型。SpringBoot提供了一种更新的、更强大的配置方式。
具体的思路是:使用 @ConfigurationProperties注解 将一个类指定为属性读取类(也可以叫资源类,该类就成为了application.properties/application.yml资源文件的翻版),再使用 @EnableConfigurationProperties注解 在配置类上引入刚刚的资源类,接着使用set(get())的方式进行Bean对象的配置。
另外注意,资源类默认读取的是application.properties/application.yml,不能再叫jdbc.propeties了。
JdbcProperties资源类 -----------------------------------------------------------------------
@ConfigurationProperties(prefix = "jdbc")
public class JdbcProperties {
private String driverClassName;
private String url;
private String username;
private String password;
// get/set方法省略,但必须要有
// ...
}
JdbcConfig配置类 ----------------------------------------------------------------------------
@Configuration
@EnableConfigurationProperties(JdbcProperties.class)
public class JdbcConfig {
// jdbcProperties对象写在方法的参数里可直接使用(自动注入),在这里手动注入也可以
// @Autowired
// private JdbcProperties jdbcProperties;
@Bean
public DataSource dataSource(JdbcProperties jdbcProperties) {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(jdbcProperties.getDriverClassName());
dataSource.setUrl(jdbcProperties.getUrl());
dataSource.setUsername(jdbcProperties.getUsername());
dataSource.setPassword(jdbcProperties.getPassword());
return dataSource;
}
}
3-根据对应关系将配置参数直接注入new出的对象
这种配置方式无比优雅与强大。
如果一组配置参数都是给一个Bean对象使用的,那么我们可以将资源文件写在方法上,SpringBoot会自动调用Bean对象的set方法,完成配置参数的注入。
具体的实现是:使用 @ConfigurationProperties注解 直接将资源文件写在方法上,@Bean返回的对象会自动完成参数注入。
JdbcConfig配置类 ----------------------------------------------------------------------------
@Configuration
public class JdbcConfig {
@Bean
@ConfigurationProperties(prefix = "jdbc")
public DataSource dataSource() {
return new DruidDataSource();
}
}
补充:Relaxed binding(松散绑定)
上面的三种注解配置中,除了第一种(Spring新注解),第二种和第三种(SpringBoot提供)都支持松散绑定。那么,什么是松散绑定?
松散绑定即不严格要求资源文件中的属性名,与真正被注入的属性名完全一致。支持驼峰、中划线、下划线等等转换,甚至支持对象引导。
那么什么又是对象引导?
举个例子很容易明白。@Value注解仅支持简单属性的注入,比如用户的名字(user.name);对象引导则支持更加复杂的层级结构,比如用户的朋友的名字(user.friend.name)。
补充:所有的.properties资源文件可等价替换为.yml文件
认识YAML语言
上面的后两种注解注入方式(SpringBoot提供)中使用的application.properties文件,都可以等价替换为application.yml文件。下面,来进一步学习这种YAML语言。
YAML是一种结构清新简单的非标记语言。YAML之所以被称得上清新简单,是因为它使用空白、冒号、缩进、分行等方式组织数据。下面来直观感受一下吧:
jdbc:
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/loliDB
username: root
password: 123456
YAML语法
1.树状的层级结构
2.缩进为2个空格
3.冒号后面必须加一个空格
4.如果是数组/集合等结构的数据,格式如下:
loli:
name: Alice
age: 12
friend:
- Mana
- Hana
5.如果有多个yml文件,则要用application-xxx.yml命名,然后在application.yml中激活
# 激活其他配置文件
spring:
profiles:
active: xxx,xxx
YAML规则
❶ SpringBoot允许多个yml文件,但这些文件的命名必须为 application-xxx.yml,并且要在 application.yml 中激活才能使用(如上)。
❷ 如果properties与yml同时存在于SpringBoot项目中,那么这两类文件都生效;如果存在同名的配置项,则以properties文件的为主。
🍃 Spring
⭐️ Suki