Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 前缀用于Spring应用程序上下文创建的具体工作原理是什么?_Java_Spring_Spring Mvc_Applicationcontext - Fatal编程技术网

Java 前缀用于Spring应用程序上下文创建的具体工作原理是什么?

Java 前缀用于Spring应用程序上下文创建的具体工作原理是什么?,java,spring,spring-mvc,applicationcontext,Java,Spring,Spring Mvc,Applicationcontext,我正在学习Spring核心认证,对于如何正确地将新的FileSystemXmlApplicationContext声明为Spring 4应用程序,我有一个疑问 我知道,在我的main()方法中,我可以有如下内容: ApplicationContext context = new FileSystemXmlApplicationContext("classpath:mycompany.mydivision.myapplication.application.config.xml", "file:t

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

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

ApplicationContext context = new FileSystemXmlApplicationContext("classpath:mycompany.mydivision.myapplication.application.config.xml", "file:test-infra-config.xml");
因此,如果我说的是错误的断言,请纠正我,这一行将从包含我的应用程序的bean定义的两个不同文件中创建Spring应用程序上下文(我将从中获取bean的对象),分别命名为config.xmltest infra config.xml

我的疑问是:第一个从类路径获取,第二个从文件获取的确切含义是什么

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

我的疑问是:在Spring4中,是否必须使用类路径:文件:前缀

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

Tnx有很多问题:

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

正确的


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

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


我的疑问是:在Spring4中是否必须使用classpath:和file:前缀

开始时

独立XML应用程序上下文,采用上下文定义 来自文件系统或URL的文件,将普通路径解释为 相对文件系统位置(例如“mydir/myfile.txt”)。有益于 测试线束以及独立环境

注意:普通路径将始终被解释为相对于 当前VM工作目录,即使它们以斜杠开头。(本 与Servlet容器中的语义一致。)使用 显式“文件:”前缀以强制执行绝对文件路径


据我所知,我可以省略file:prefix,但不能省略classpath:prefix(但我不确定它在Spring3版本中是真的,还是在Spring4版本中有所改变)

正确(Spring3和Spring4之间没有变化(参见javadoc))


如果是真的,为什么我可以省略file:prefix而不是classpath:prefix

因为您只能有一个默认值:当您没有指定路径是指向文件(系统)还是类路径时,spring必须决定在何处搜索该文件,并且他们决定将其作为文件(系统)引用


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

我想你应该看看,你的很多问题都会得到回答

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

例如,如果:

ApplicationContext ctx = new ClassPathXmlApplicationContext("my/appCtx.xml");
ClassPathResource将用于加载资源位置。它将查看应用程序的JVM类路径的类路径

或者,如果:

ApplicationContext ctx = new FileSystemXmlApplicationContext("my/appCtx.xml");
然后从文件系统位置检索ctx文件。除非您强制它在带有前缀的字符串位置查看类路径,否则:

ApplicationContext ctx = new FileSystemXmlApplicationContext("classpath:my/appCtx.xml");
现在回到您的示例:

ApplicationContext context = new FileSystemXmlApplicationContext("classpath:mycompany.mydivision.myapplication.application.config.xml", "file:test-infra-config.xml");
所以本质上,您是在定位器字符串上直接使用前缀标识查找方法。如果在第二个字符串中保留了文件前缀,则应用程序上下文的实现将推断出该前缀

总之,不在资源定位器字符串前面查找前缀并不意味着它是Spring4的高级功能,比如说与Spring3相比,它是在场景下使用基于应用程序上下文实现的资源


另外,就Spring 3和Spring 4而言,上述内容没有差异。

因为file:是默认文件。也就是说,如果不添加前缀,默认值为file: