使用配置文件进行数据绑定

1. @value注解

@value注解也可单独使用,默认加载application.properties、application.yml配置文件,进行属性注入

public class ValueTest{
	
	@Value("${server.port}") //读取配置文件server.port的值,将其作为driver的值
	private String driver;
	@Value("#{ UUID.randomUUID().toString() }") //计算El表达式的值,将其作为UUID的值
	private String UUID;
	@Value("3306")	//将3306作为port的值
	private String port
}

@value注解默认加载application.properties、application.yml配置文件,进行属性注入,如果需要指定配置文件,可以用@PropertitySource注解指定配置文件:
@propertitySource({“classpath:path”})加载指定配置文件,可以读取外部配置文件中的key-value保存到运行的环境变量中,可配合@value注解进行属性注入

@PropertitySource({"classpath:path"})
//加载properties文件,配合@value注解对属性进行初始化

2. @ConfigurationProperties注解:

@configurationProperties(prefix=“”,suffix=“”)加载xml文件中的属性配置进行初始化,

@ConfigurationProperties(prefix="",suffix="")
//加载xml文件中的属性配置进行初始化,通过前缀和后缀去识别读取

A、使用@Component注解让@ConfigurationProperties注解生效,从而完成配置文件与java Bean的数据绑定

@Component
@ConfigurationProperties(prefix = "zs")
@Data
public class ConfigurationBean {
    private String name;
    private Integer age;
}

B、使用@EnableAutoConfigurationProperties注解来让@ConfigurationProperties注解生效,从而完成配置文件与java Bean的数据绑定

@SpringBootApplication
@EnableConfigurationProperties(ConfigurationBean.class)
public class MySpringBootApplication {
    public static void main(String[] args) {
        SpringApplication.run(MySpringBootApplication.class);
    }
}

3. 原生写法

public class propertiesTest{
	String driver;
	String url;
	String port;
	String userName;
	String password;
	public Connection getConnection{
		//(1)创建集合
		Properties properties = new Properties();
		//通过加载器获取输入流,读取config.properties文件
		InputStream configStream = propertiesTest.class.getClassLoader.getResourceAsStream("/config.properties");
		//(2)流中内容载入集合
		properties.load(configStream);
		//获取集合中的键值对,类名
		url= properties.getProperty("url");
		//获取集合中的键值对,方法名
		port= properties.getProperty("port");
		...
		//通过Druid数据源工厂创建一个数据源
		DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
		//Class.forname(driver) 
		//注意这里有异常记得try...catch;MySQL的驱动在加载时,底层就已经注册了
		//DriverManager.getConnection(url);
		return dataSource.getConnection();
		}
}

mybatis的配置文件:
当resource中的xml文件和整个项目中的mapper.java文件同包且同名时不用指定xml文件的位置,springboot可以自动识别并扫描到xml文件
当resource中的xml文件和整个项目中的mapper.java文件不同包时需要在yml文件中指定xml文件的位置mybatis.mapperLocation: classpath:path

/装载类的过程非常简单:查找类所在位置,并将找到的Java类的字节码装入内存,生成对应的Class对象。Java的类装载器专门用来实现这样的过程,JVM并不止有一个类装载器,事实上,如果你愿意的话,你可以让JVM拥有无数个类装载器,当然这除了测试JVM外,我想不出还有其他的用途。你应该已经发现到了这样一个问题,类装载器自身也是一个类,它也需要被装载到内存中来,那么这些类装载器由谁来装载呢,总得有个根吧?没错,确实存在这样的根,它就是神龙见首不见尾的Bootstrap ClassLoader. 为什么说它神龙见首不见尾呢,因为你根本无法在Java代码中抓住哪怕是它的一点点的尾巴,尽管你能时时刻刻体会到它的存在,因为java的运行环境所需要的所有类库,都由它来装载,而它本身是C++写的程序,可以独立运行,可以说是JVM的运行起点,伟大吧。在Bootstrap完成它的任务后,会生成一个AppClassLoader(实际上之前系统还会使用扩展类装载器ExtClassLoader,它用于装载Java运行环境扩展包中的类),这个类装载器才是我们经常使用的,可以调用ClassLoader.getSystemClassLoader() 来获得,我们假定程序中没有使用类装载器相关操作设定或者自定义新的类装载器,那么我们编写的所有java类通通会由它来装载,值得尊敬吧。AppClassLoader查找类的区域就是耳熟能详的Classpath,也是初学者必须跨过的门槛,有没有灵光一闪的感觉,我们按照它的类查找范围给它取名为类路径类装载器。还是先前假定的情况,当Java中出现新的类,AppClassLoader首先在类传递给它的父类类装载器,也就是Extion ClassLoader,询问它是否能够装载该类,如果能,那AppClassLoader就不干这活了,同样Extion ClassLoader在装载时,也会先问问它的父类装载器。我们可以看出类装载器实际上是一个树状的结构图,每个类装载器有自己的父亲,类装载器在装载类时,总是先让自己的父类装载器装载(多么尊敬长辈),如果父类装载器无法装载该类时,自己就会动手装载,如果它也装载不了,那么对不起,它会大喊一声:Exception,class not found。有必要提一句,当由直接使用类路径装载器装载类失败抛出的是NoClassDefFoundException异常。如果使用自定义的类装载器loadClass方法或者ClassLoader的findSystemClass方法装载类,如果你不去刻意改变,那么抛出的是ClassNotFoundException/
DataSource:
1、DataSource数据源:数据源(DataSource)即数据来源,数据源是一种提高数据库连接性能的常规手段,数据源会负责维持一个数据连接池,当程序创建数据源实例时,系统会一次性地创建多个数据库连接,并把这些数据库连接保存在连接池中。当程序需要进行数据库访问时,无须进行重新获得数据连接,而是从连接池中取出一个空闲的数据连接。当程序使用数据库连接访问数据库结束后,无须关闭数据连接,而是将数据库连接归还给连接池即可。通过这种方式,就可避免频繁地获取数据库连接/关闭数据库连接所导致的性能下降
2、DataSource内部封装了一个连接池,当你获取DataSource的时候,它已经敲敲的与数据库建立了多个Connection,并将这些Connection放入了连接池,此时调用DataSource.getConnection()它从连接池里取一个Connection返回,Connection使用完后被close,但这个close并不是真正的与数据库断开连接,而是告诉连接池"我"已经被使用完,"你"可以把我分配给其它"人"使用了.就这样连接池里的Connection被循环利用,避免了每次获取Connection时重新去连接数据库.
3、DataSource与连接池的关系是:DataSource利用连接池缓存Connection,以达到系统效率的提升,资源的重复利用.而连接池它可以单独存在,不需要依靠DataSource来获取连接,你可以直接调用连接池提供的方法来获取连接.目前大多数应用服务器都支持池化连接方式的DataSource.

Spring Boot 配置文件加载优先级

有两种配置文件 properties 和 yml,它们最大的区别就是格式不一样,而在同一目录下properties 的优先级是高于yml;

Spring Boot读取优先级:

a. 项目根目录下的/config目录下的配置文件。
b. 项目根目录下的配置文件。
c. 项目类路径(resources)下的/config目录下的配置文件。
d. 项目类路径(resources)下的配置文件。

bootstrap和application的优先级

bootstrap配置文件由spring父上下文加载,并且比application配置文件优先加载(父上下文不会使用application配置文件),而application配置文件由子上下文加载。bootstrap加载的配置信息不能被application的相同配置覆盖。

注意:如果代码中有使用到配置文件中的参数,这时bootstrap和application都有这个参数,那么会优先使用application的参数。