首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用前缀来创建Spring ApplicationContext?

如何使用前缀来创建Spring ApplicationContext?
EN

Stack Overflow用户
提问于 2015-04-13 08:36:10
回答 2查看 1.5K关注 0票数 2

我正在学习Spring认证,我对如何正确地将新的FileSystemXmlApplicationContext声明为Spring 4应用程序有疑问。

我知道,在我的main()方法中,我可以得到如下内容:

代码语言:javascript
复制
ApplicationContext context = new FileSystemXmlApplicationContext("classpath:mycompany.mydivision.myapplication.application.config.xml", "file:test-infra-config.xml");

所以,如果我说的是错误的断言,请纠正我的错误,这一行将从两个不同的文件中创建Spring上下文(我将从中获取bean的对象),这些文件包含我的应用程序的bean定义,分别命名为test-infra-config.xml.和config.xml

我的疑问是:第一个是从类路径获取的,第二个是从文件中获取的。

我认为第二条路径相对于JVM工作目录,第一条路径来自应用程序类路径(定义在项目中,还是什么?)

我的疑问是:在Spring 4中,使用类路径:和文件:前缀是强制性的吗?

据我所知,我可以省略文件:前缀,但不能忽略类路径:前缀(但我不确定它在Spring3版本中是正确的,还是在改变4版本中的某些内容)。如果是真的,为什么我可以省略文件:前缀,而不能省略类路径:前缀?

Tnx

EN

回答 2

Stack Overflow用户

发布于 2015-04-13 09:04:19

很多问题:

我认为第二个路径相对于JVM工作目录和

对,是这样

应用程序类路径中的第一个类路径(在项目中定义,还是什么?)

它是JVM在运行应用程序时使用的类路径。

我的疑问是:在Spring 4中,类路径:和文件:前缀的使用是强制性的吗?

FileSystemXmlApplicationContext

独立的XML应用程序上下文,从文件系统或URL获取上下文定义文件,将普通路径解释为相对的文件系统位置(例如"mydir/myfile.txt")。适用于测试线束以及独立环境。 注意:普通路径总是被解释为相对于当前VM工作目录,即使它们以斜杠开头。(这与Servlet容器中的语义一致。)使用显式" file :“前缀强制执行绝对文件路径。

据我所理解,我可以省略文件:前缀,但不能忽略类路径:前缀(但我不确定它在Spring 3版本中是正确的,还是在改变4版本中的某些内容)。

正确( Spring 3和4之间没有变化(参见javadoc))

如果这是真的,为什么我可以省略文件:前缀,而不是类路径:前缀?

因为您只能有一个默认值:当您没有指定路径是重新填充到文件(系统)还是类路径时,那么spring必须决定在哪里搜索该文件--他们决定将其作为文件(系统)引用处理。

(我还可以想象,这可能是由于一些历史和向后兼容的原因,也许Spring的第一个版本当时只支持没有任何前缀的文件方式。-但这是一种没有知识的猜测)

票数 1
EN

Stack Overflow用户

发布于 2015-04-13 11:42:39

我认为你应该看看资源文件,你的许多问题都会得到解答。

在这里,您会发现正在使用的ApplicationContext的实现是定义特定的资源类型,以将所提供的字符串资源位置解释为除非应用到字符串的前缀。

因此,例如,如果:

代码语言:javascript
复制
ApplicationContext ctx = new ClassPathXmlApplicationContext("my/appCtx.xml");

ClassPathResource将用于加载资源位置。它将查看应用程序的JVM类路径的类路径。

或者,如果:

代码语言:javascript
复制
ApplicationContext ctx = new FileSystemXmlApplicationContext("my/appCtx.xml");

然后从文件系统位置检索ctx文件。除非在字符串位置强制使用前缀来查看类路径,否则:

代码语言:javascript
复制
ApplicationContext ctx = new FileSystemXmlApplicationContext("classpath:my/appCtx.xml");

现在回到你的例子:

代码语言:javascript
复制
ApplicationContext context = new FileSystemXmlApplicationContext("classpath:mycompany.mydivision.myapplication.application.config.xml", "file:test-infra-config.xml");

因此,本质上,您是直接在定位器字符串上标识前缀,即查找的方法。如果将文件前缀排除在第二个字符串之外,则应用程序上下文的执行将推断出该前缀。

总之,在资源定位器字符串前面找不到前缀并不意味着与Spring 3相比,它是Spring 4的一个高级特性,而是在场景中使用基于应用程序上下文实现的资源。

ps。就Spring 3和4而言,在上述方面没有任何差异。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29601076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档