spring核心配置文件引入外部properties文件和另外的xml配置文件

为什么要引入外部文件

我们使用jdbc的时候,会创建一个jdbc.properties配置文件,如果我需要在spring的IOC中存入连接池对象呢?
是不是需要给链接对象的属性url username password driver ,我们应该如何在spring的配置文件中引入外部文件呢?

引入properties文件

⚫ Spring提供了读取外部properties文件的机制,使用读取到的数据为bean的属性赋值
⚫ 操作步骤

  1. 准备外部properties文件
  2. 开启context命名空间支持
    xmlns:context=“http://www.springframework.org/schema/context”
  3. 加载指定的properties文件
    < context:property-placeholder location=“classpath:filename.properties”>
  4. 使用加载的数据
    < property name=“propertyName” value="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;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}
properties配置文件

username=xiaofu
password=1234
**注意:**配置文件中username前面要加个前缀,不然赋值的时候会把你当前计算机的用户名取出来,而不是从properties中读取的,原因是因为计算机的环境变量中有个值也是username,而spring启动的时候会读取环境变量中的值,从而导致和properties中的值冲突

user.username=xiaofu
user.password=1234
applicationContext.xml核心配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">


<!--    加载context命名空间
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
https://www.springframework.org/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>
测试代码
@Test
    public void testProperties(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        User user = (User) applicationContext.getBean("user");
        System.out.println(user);
        /*
        properties配置信息
        username=xiaofu
        password=1234
        User{username='93422', password='1234'}
        若输出结果不为properties中配置的值,这个值是我的电脑用户名,因为spring在启动的时候会读取计算机的环境变量,环境变量中会有这个username
        所以拿到的值是你环境变量中配置的值,而不是你properties中设置的值
        所以,我们在写properties的key的时候,一般会jdbc.username,以免和系统的环境变量中的username冲突,导致取出的值不是properties中的值
         */
        /*
        properties配置信息是这样的就会正常读取到值
        user.username=xiaofu
        user.password=1234
        //打印输出
        User{username='xiaofu', password='1234'}
         */
    }
控制台运行结果

Properties加载文件_xml_02

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;
    }

    @Override
    public 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="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/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="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<!--    把test交给springIOC管理-->
    <bean id="testDemo" class="com.fs.demo.TestDemo"/>

</beans>
测试代码
//测试引入其他的配置文件
    @Test
    public void testDemo(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        //在主配置文件中获取出dao
        Demo demo = (Demo) applicationContext.getBean("demo");
        //Demo{testDemo=com.fs.demo.TestDemo@544a2ea6}因为在applicationContext02.xml中吧testDemo交给IOC管理了,所以demo中的set注入成功
        System.out.println(demo);
    }
控制台运行效果

Properties加载文件_Properties加载文件_03