自定义PropertySourceFactory解析YAML文件:
PropertySourceFactory的默认实现DefaultPropertySourceFactory是解析不了yaml文件的,如果要解析,就要自定义实现。
A.引用第三方jar包
我们直接引用第三方jar包,利用里边的API进行解析。
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.23</version>
</dependency>
其他的jar
<dependencies>
<!-- mybatis依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<!-- mybatis整合spring的依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<!-- spring的依赖项 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.14</version>
</dependency>
<!-- spring jdbc的依赖项 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.14</version>
</dependency>
<!-- mysql/mariadb连接的依赖项 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
<!-- 数据库连接池的依赖项,当前使用的是commons-dbcp2 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.8.0</version>
</dependency>
<!-- 测试的依赖项 -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.7.0</version>
<scope>test</scope>
</dependency>
<!-- 基于Spring的测试的依赖项 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.3.14</version>
</dependency>
</dependencies>
B.编写Yaml解析工厂
编写自定义Yaml解析工厂PropertySourceFactory:
//自定义Yaml解析工厂PropertySourceFactory
//author: zhaoYongQi
public class YAMLPropertySourceFactory implements PropertySourceFactory {
public org.springframework.core.env.PropertySource<?> createPropertySource(String name,
EncodedResource encodedResource) throws IOException {
//创建一个YAML解析工厂。
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
factory.setResources(encodedResource.getResource()); //设置资源。
//获取解析后的Properties对象
Properties properties = factory.getObject();
//返回。此时不能像默认工厂那样返回ResourcePropertySource对象 ,
//要返回他的父类PropertiesPropertySource对象。
return name != null ?
new PropertiesPropertySource(name, properties) :
new PropertiesPropertySource(
encodedResource.getResource().getFilename(),properties);
}
}
C.编写配置类:
@Configuration
@ComponentScan(basePackages = "com.zyq")
//使用自定义工厂YAMLPropertySourceFactory.class。
@PropertySource(value = "classpath:daoconfig/datasource-db-config.yml",factory = YAMLPropertySourceFactory.class)
@ConfigurationProperties(prefix="my")//表示yml的前缀是my(获取时就不用写前缀了)
public class SpringConfig {
@Value("${name}")//本注解也可以不用写(因为yml中的key和这里的成员变量名相同,
//还因为类上用prefix="my"指定了前缀)
private String name;
//通过SPEL表达式注入属性
@Value("${druid.driverClassName}")
private String driverClassName;
@Value("${druid.url}")
private String url;
@Value("${druid.username}")
private String username;
@Value("${druid.password}")
private String password;
//注册Druid数据源连接池
@Bean
public DruidDataSource druidDataSource(){
System.out.println("driverClassName====> " + driverClassName);
System.out.println("url====> " + url);
System.out.println("username====> " + username);
System.out.println("password====> " + password);
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setDriverClassName(driverClassName);
druidDataSource.setUrl(url);
druidDataSource.setUsername(username);
druidDataSource.setPassword(password);
return druidDataSource;
}
}
D.yml文件放到resources文件夹下的daoconfig文件夹内
my:
name: zhaoYongQi
druid:
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mall_ams?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username: root
password: root
E.测试类:
public class PropertySourceDemoTest {
private AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(SpringConfig.class);
@Test
public void PropertySourceDemoTest() throws SQLException {
//从容器中获取数据源
DruidDataSource druidDataSource =
(DruidDataSource) context.getBean("druidDataSource");
//获取数据库连接
Connection connection = druidDataSource.getConnection();
System.out.println(druidDataSource);
System.out.println(connection);
connection.close();
}
}