目录
1、本篇博客的背景和目的
目前我本人在学习SpringFramework,这也是这个专栏的主题。我前面本专栏的三篇博客主要是简单的认识了一下SpringFramework,简单搭建好了环境可以运行代码,然后模拟了一下SpringIOC对Bean对象实例化的过程。
本篇博客记录一下SpringIOC是如何加载配置文件的,或者说怎么使用SpringFramework加载配置文件。
2、上一篇文章地址链接
SpringIOC的Bean对象实例化的模拟实现_你是我的日月星河的博客-CSDN博客https://blog.csdn.net/weixin_46281472/article/details/123955065
3、SpringFramework配置文件加载的一些思想
首先需要说一下的是,根据配置文件来源的不同,配置文件加载分为两种,分别是绝对路径配置文件的加载和相对路径配置文件的加载。
绝对路径配置文件的加载就是我们在自己的电脑上面编码,将配置文件放在自己计算机别的某一个文件夹下,也就是不在项目内(这种骚操作我想肯定是很少有人用的)
相对路径配置文件加载就是配置文件保存在项目文件夹中,也就是resource文件夹下。
配置文件可以加载单个,也可以加载多个。
再想一下,由于配置文件中配置的是Bean实体类,如果一个项目稍微大一点的话,可能会有很多个模块,每一个模块中也有很多个实体类,那么我们就不可能把所有的实体类Bean标签写在一个配置文件中。那么我们就会写很多个配置文件,这些配置文件都需要被加载,那么我们肯定就要选择加载多个配置文件了。那么我们加载多个配置文件的时候,难道要一个一个的写文件名然后加载吗?显然这是不可能的。SpringFramework提供了一个总配置文件,我们可以在总配置文件中引入一个一个的配置文件,然后只需要加载这个总配置文件就可以啦!
4、配置文件加载的代码
相对路径配置文件加载:BeanFactory factory=new ClassPathXmlApplicationContext("配置文件的相对路径");
绝对路径配置文件加载:BeanFactory factory=new FileSystemXmlApplicationContext("配置文件的绝对路径");
我们加载单个配置文件的时候,就跟上面的是一样的。
当加载多个配置文件的时候,如果配置文件数量不多,就三四个,我们可以不使用总配置文件的方法,直接写上去就行了,代码如下(这里我就不举例绝对路径配置文件加载的那种了,是同理的):
ApplicationContext factory=new ClassPathXmlApplicationContext("配置文件路径1","配置文件路径2"); (ApplicationContext接口是BeanFactory接口的子接口,功能更强大点)
但是,如果配置文件有很多,那么我们就需要使用总配置文件的形式了,代码如下:
首先是我们的总配置文件:
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 这里我们导入其他的配置文件-->
<import resource="spring.xml"></import>
<import resource="service.xml"></import>
</beans>
总配置文件的名字是springFramework.xml。里面引入了两个配置文件。因为我的这个项目丢失了,就不展示代码结构了。总配置文件和两个分配置文件我都写在了resource目录下面,没有再套文件夹。如果在开发中,resource目录下有再套文件夹的话,import标签里面是需要使用相对地址的,假如service.xml文件在下图中的文件夹中:
很明显,service.xml文件外面套了一个service文件夹,那么在我们的总配置文件springFramework.xml文件中,就需要使用下面的语句:
<import resource="service/service.xml"></import>
加上了相对地址,这样才会正确的将service配置文件引入进来;
5、在main方法中测试
在main方法中需要首先加载配置文件,将实体类交给SpringIOC管理,我们才能不使用new的方式直接获得对应的实体类,这个代码在我的下面博客链接里面有代码:SpringFramework简单的环境搭建_你是我的日月星河的博客-CSDN博客_springframework 环境搭建https://blog.csdn.net/weixin_46281472/article/details/123657647
我就不再次解释了,我直接粘贴代码了:
package com.dcy;
import com.dcy.service.UserService;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
/*
这里我们说一下关于配置文件的加载
我们可以通过相对路径加载,也可以通过绝对路径加载
相对路径:BeanFactory beanFactory=new ClassPathXmlApplicationContext("配置文件名字");
绝对路径:BeanFactory factory=new FileSystemXmlApplicationContext(" 文件的绝对路径")
我们可以加载一个配置文件,也可以加载多个配置文件
这里我们就只说相对路径:
如果有多个配置文件的话,
1、BeanFactory beanFactory=new ClassPathXmlApplicationContext("配置文件名1","配置文件名2");
可以无限制的写下去,它是有这样的构造方法的
2、设置一个总的配置文件,在总配置文件中导入需要加载的配置文件, 这一点有点类似于MyBatis
并且当我们在写总配置文件的时候,它是有提醒的,不用担心写错
BeanFactory beanFactory=new ClassPathXmlApplicationContext("总配置文件名");
*/
public class Starter {
public static void main(String[] args) {
//首先看我们使用相对路径加载
//我们使用了BeanFactory这个接口, 这个接口是 ApplicationContext接口的父接口
BeanFactory factory=new ClassPathXmlApplicationContext("springFramework.xml");
//下面是我们的绝对路径
//BeanFactory factory=new FileSystemXmlApplicationContext("G:\\IDEAWorkspace\\spring03\\src\\main\\resources\\spring.xml");
UserService userService = (UserService) factory.getBean("userService");
userService.test();
//很显然,我们使用绝对路径是很少的,基本就不可能使用到绝对路径
//这里我们得到绝对路径,直接右键这个文件,复制完绝对路径以后粘贴在这里就可以啦
}
}
main方法是可以正常运行的。
这里还有一种情况:我上面例子的代码中,总配置文件是直接放在resource根目录文件下的,所以我才在main方法中直接加载了总配置文件springFramework.xml,那如果总配置文件也在某一个文件夹内呢?就比如下图中的文件结构:
明显的,我将总配置文件放在了ALL文件夹下。那么这个时候我们main方法中加载总配置文件的语句也会改变,需要带上总配置文件的相对地址。main方法的加载总配置文件的语句如下:
ApplicationContext ac=new ClassPathXmlApplicationContext("ALL/springFramework.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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 这里我们导入其他的配置文件-->
<import resource="../spring.xml"></import>
<import resource="../service/service.xml"></import>
</beans>
import标签里面,引入的配置文件前面都加上了 ../ 略微知道Linux命令的应该知道(或者经常编写HTML代码的),../ 表示回到本文件的根目录下
多说一下:其实IDEA这个工具还是很智能的,我只是将springFramework.xml文件剪切到了新建好的ALL文件夹里面,直接按照IDEA的提示Refactor(重构),然后main方法和springFramework.xml文件,这两个地方关于文件路径的代码就自己更改重构好了,还是令我挺意外的!!为IDEA点个赞!!
6、我的POM文件
上面的代码不需要特别的依赖,只需要下面的依赖就行:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.dcy</groupId>
<artifactId>WebPractice</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.12.RELEASE</version>
</dependency>
</dependencies>
</project>
这个依赖是Spring最基本的依赖。