在上一篇讲到优雅的配置properties属性,那是一个怎么的优雅法呢?接下来先来写写上一次遗留的优雅配置,所谓优雅就是看起来一目了然很简洁。
属性配置文件的导入(属性配置文件的名字一定要是application)
属性配置文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/Mybatis?serverTimezone=GMT&useSSL=FALSE
jdbc.username=root
jdbc.password=wrial.qq.com
JdbcProperties:相当于JavaBean的作用,用来盛装properties属性,以方便注入(这里我用到了lombok插件,如果不使用插件的话,就必须写Getter和Setter方法)。
package com.example.demo.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@ConfigurationProperties("jdbc")
@Data
public class JdbcProperties {
String url;
String driverClassName;
String username;
String password;
}
JdbcConfig:用Spring来管理Jdbc的配置
package com.example.demo.config;
import com.alibaba.druid.pool.DruidDataSource;
import com.example.demo.config.JdbcProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
@EnableConfigurationProperties(JdbcProperties.class)
public class JdbcConfig {
@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;
}
}
WebBootDemo:controller的代码,并注入已经配置到Spring里的dataSourse。
package com.example.demo.webdemo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.sql.DataSource;
@RestController
public class WebBootDemo {
@Autowired
private DataSource dataSource;
@GetMapping("/hello")
public String hello() {
return "Hello Everyone!";
}
}
打上断点进行调试,发现dataSourse已经注入进去了!
哈哈,这几种方法随便挑哈,喜欢那个用哪个!
你以为这就完了?不,上边这个只能算清晰,看到下面例子你就知道什么是优雅了!
配置文件
jdbc.driver-class-name=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/Mybatis?serverTimezone=GMT&useSSL=FALSE
jdbc.username=root
jdbc.password=wrial.qq.com
JdbcConfig,就这几行代码就够了
@Configuration
public class JdbcConfig {
@Bean
@ConfigurationProperties("jdbc")
public DataSource dataSource() {
return new DruidDataSource();
}
}
访问,并查看dataSource的注入情况:注入成功!
总结:加上第一篇博客,也一共有三种注入方法了,至于选择哪一种就要看在那种情况,比如第三种适合配一些个例需要的。要根据场景来选择用哪一种!
使用yaml进行属性注入
yaml是什么呢,它类似于properties,但是要比properties更强大,它可以配置一个对象,甚至一个集合等。下面我们就来使用一下yaml。
yaml的语法非常严格,在每一个冒号后都必须有一个空格,否则它会认为你这个是一句话,尤其注意的是,不能在声明前缀的那一行写任何东西!否则会报错。
application.yaml
jdbc:
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/Mybatis?serverTimezone=GMT&useSSL=FALSE
username: root
password: wrial.qq.com
调试,可以看到注入成功
这就是使用yaml文件注入,以后基本就用yaml了。
疑问1:那系统加载是先加载哪一种配置文件呢?如果两个配置文件有重复呢?如果两个文件同一属性但是值不同它又以那个为准呢?
在SpringBoot的加载中,两种文件不分先后,两个文件系统会取并集,因此重复的部分也就没什么问题了,但是两个文件的同一个属性值不同,那就取properties文件的内容。
疑问2:我在前边写SpringBoot的时候,有一次吧如下图的红线所连的类位置写反了,发现项目报错。
为什么调换就出错呢?为什么我们没有配置包扫描可以扫到我们的controller呢?今天就来解密。打开SpringBootApplication的源码瞧瞧,发现有一个扫描组件的配置。
虽然没有下载成功带注释的源码,因此我只能看纯代码的源码,**但是查看容器扫描的代码可以发现resourcePattern默认扫描的是SpringBootApplication所在类的包下的所有类。**这不是正好解决了我的疑问嘛!
但是我就要某某某的包结构,怎么办?这就得配置扫描了,在SpringBoot的默认扫描器已经不适合我们了!
不使用默认,就可以在SpringBootApplication下加一个扫描的注解。如下:
这个注解和我们Spring中的一样,可以扫描单个类
这个注解从源码来看是可以又两种类型,一种是包,一种是类
也可以扫描包
那ComponentScans注解呢?我们可以从源码清楚的看到,它就是上一个注解的数组形式
可以一次配置多个类或多个包!(记住一个原则:有不知道的东西就看源码!)
这个随个人喜好,但是把SpringBootApplication放在最外层是不是就可以免去配置了,少一点配置就少出一点错。无论是自动配置还是手动配置都有它存在的理由!