spring核心配置文件引入外部properties文件和另外的xml配置文件
为什么要引入外部文件
我们使用jdbc的时候,会创建一个jdbc.properties配置文件,如果我需要在spring的IOC中存入连接池对象呢?
是不是需要给链接对象的属性url username password driver ,我们应该如何在spring的配置文件中引入外部文件呢?
引入properties文件
⚫ Spring提供了读取外部properties文件的机制,使用读取到的数据为bean的属性赋值
⚫ 操作步骤
准备外部properties文件开启context命名空间支持
xmlns:context=“/schema/context”加载指定的properties文件
< context:property-placeholder location=“classpath:filename.properties”>使用加载的数据
< property name=“propertyName” value="propertiesName"/>⚫注意:如果需要加载所有的properties文件,可以使用∗.properties表示加载所有的properties文件⚫注意:读取数据使用{propertiesName}"/> ⚫ 注意:如果需要加载所有的properties文件,可以使用*.properties表示加载所有的properties文件 ⚫ 注意:读取数据使用propertiesName"/>⚫注意:如果需要加载所有的properties文件,可以使用∗.properties表示加载所有的properties文件⚫注意:读取数据使用{propertiesName}格式进行,其中propertiesName指properties文件中的属性名
代码演示
实体类准备
我使用一个User类,有两个属性,我这个两个属性的值,从properties配置文件中读取值,通过IOC 的DI依耐注入值
package com.fs.demo;public class User {private String username;private String password;// set方法让spring可以DI依耐注入属性public void setUsername(String username) {this.username = username;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +'}';}}
properties配置文件
username=xiaofu
password=1234
**注意:**配置文件中username前面要加个前缀,不然赋值的时候会把你当前计算机的用户名取出来,而不是从properties中读取的,原因是因为计算机的环境变量中有个值也是username,而spring启动的时候会读取环境变量中的值,从而导致和properties中的值冲突
user.username=xiaofuuser.password=1234
applicationContext.xml核心配置文件
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="/schema/context"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans.xsd/schema/context/schema/context/spring-context.xsd"><!-- 加载context命名空间xmlns:context="/schema/context"/schema/context/schema/context/spring-context.xsd--><!-- 引入外部properties文件properties中的key不要和本机的环境变量中的值冲突,因为spring在加载的时候获取计算机的环境变量中的值若与环境中的值冲突,读取出来的值就是计算机环境变量中设置的值所以,我们配置jdbc的时候一般就是jdbc.username.不会直接username注意:若要导入多个properties,需要在主配置文件中配置,classpath:*.properties<context:property-placeholder location="classpath:*.properties"/>--><context:property-placeholder location="classpath:data.properties"/><!-- 把user交给ioc管理--><bean id="user" class="com.fs.demo.User"><!--${properties中的key名} --><property name="username" value="${user.username}"/><property name="password" value="${user.password}"/></bean></beans>
测试代码
@Testpublic void testProperties(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");User user = (User) applicationContext.getBean("user");System.out.println(user);/*properties配置信息username=xiaofupassword=1234User{username='93422', password='1234'}若输出结果不为properties中配置的值,这个值是我的电脑用户名,因为spring在启动的时候会读取计算机的环境变量,环境变量中会有这个username所以拿到的值是你环境变量中配置的值,而不是你properties中设置的值所以,我们在写properties的key的时候,一般会jdbc.username,以免和系统的环境变量中的username冲突,导致取出的值不是properties中的值*//*properties配置信息是这样的就会正常读取到值user.username=xiaofuuser.password=1234//打印输出User{username='xiaofu', password='1234'}*/}
控制台运行结果
spring核心配置文件中导入其他的.xml配置文件
团队开发
⚫ 名称:import
⚫ 类型:标签
⚫ 归属:beans标签
⚫ 作用:在当前配置文件中导入其他配置文件中的项
⚫ 格式:
< beans>
< import />
< /beans>
⚫ 基本属性:
< import resource=“config.xml"/>
◆ resource:加载的配置文件名
⚫ Spring容器加载多个配置文件
new ClassPathXmlApplicationContext(“config1.xml”,“config2.xml”);
⚫ Spring容器中的bean定义冲突问题
◆ 同id的bean,后定义的覆盖先定义的
◆ 导入配置文件可以理解为将导入的配置文件复制粘贴到对应位置
◆ 导入配置文件的顺序与位置不同可能会导致最终程序运行结果不同
代码演示
实体类
创建一个类,这个类有个实体类属性,一个set方法,用于DI依耐注入
package com.fs.demo;public class Demo {private TestDemo testDemo;public void setTestDemo(TestDemo testDemo) {this.testDemo = testDemo;}@Overridepublic String toString() {return "Demo{" +"testDemo=" + testDemo +'}';}}
创建一个类,这个类是上一个类的属性
package com.fs.demo;public class TestDemo {public void testDemo(){System.out.println("TestDemo测试语句输出");}}
applicationContext.xml配置文件
applicationContext.xml主配置文件
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="/schema/context"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans.xsd/schema/context/schema/context/spring-context.xsd"><!-- 引入外部的spring的配置文件--><import resource="classpath:applicationContext02.xml"/><bean id="demo" class="com.fs.demo.Demo"><!-- 这里就体现了引入外部的applicationContext02.xml文件,因为ref="testDemo这就是在applicationContext02配置的--><property name="testDemo" ref="testDemo"/></bean></beans>
applicationContext02.xml其他的.xml配置文件,在主配置文件中被引入了的
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/schema/beans /schema/beans/spring-beans.xsd"><!-- 把test交给springIOC管理--><bean id="testDemo" class="com.fs.demo.TestDemo"/></beans>
测试代码
//测试引入其他的配置文件@Testpublic void testDemo(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");//在主配置文件中获取出daoDemo demo = (Demo) applicationContext.getBean("demo");//Demo{testDemo=com.fs.demo.TestDemo@544a2ea6}因为在applicationContext02.xml中吧testDemo交给IOC管理了,所以demo中的set注入成功System.out.println(demo);}
控制台运行效果
如果觉得《spring核心配置文件引入外部properties文件和另外的xml配置文件》对你有帮助,请点赞、收藏,并留下你的观点哦!