繁体   English   中英

春天-从类路径加载GenericXmlApplicationContext

[英]spring - GenericXmlApplicationContext loading from classpath

我刚到春天。

我不明白为什么当我写一些简单的示例并尝试按如下方式将其与ApplicationContents加载时:

package com.appres.prospring3.ch5.factory;

public class MessageDigestExample {
    public static void main(String[] args) {
        GenericXmlApplicationContext context = new GenericXmlApplicationContext();
        context.load("classpath:factory/factory.xml");
        context.refresh();

        MessageDigester digester = (MessageDigester) context.getBean("digester");
        digester.digest("Hello World !!!!!!!!!");
    }
}

恰好在这一行之后:

context.load(“ classpath:factory / factory.xml”);

正在进行的异常消息:

17:59:44,480 INFO eans.factory.xml.XmlBeanDefinitionReader:315-从类路径资源[factory / factory.xml]加载XML bean>定义从类路径资源[factory / factory.xml]中解析XML文档; 嵌套> exception是java.io.FileNotFoundException:类路径资源[factory / factory.xml]>无法打开,因为它不存在

在我看来,所有人都应该工作。 而且我不知道这里出了什么问题。

这是我的项目结构:

包中的类路径

但是,当我将myFile.xml移到resources包时:

资源路径

并将context.load()更改为context.load("classpath:factory.xml");

一切正常,我可以看到正确的结果:

Using digest1
Using algorithm: SHA1
[B@5e9ed26e
Using digest2
Using algorithm: MD5
[B@d09644a

编辑:

当然,我尝试了最长路径来加载此.xml文件,如下所示:

context.load(“ classpath:com / appress / prospring3 / ch5 / factory / factory.xml”);

并抛出一堆异常

Exception in thread "main" 18:15:22,385  INFO eans.factory.xml.XmlBeanDefinitionReader: 315 - Loading XML bean definitions from class path resource [com/appress/prospring3/ch5/factory/factory.xml]
org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [com/appress/prospring3/ch5/factory/factory.xml]; nested exception is java.io.FileNotFoundException: class path resource [com/appress/prospring3/ch5/factory/factory.xml] cannot be opened because it does not exist
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:341)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:143)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:178)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:212)
    at org.springframework.context.support.GenericXmlApplicationContext.load(GenericXmlApplicationContext.java:105)
    at com.appres.prospring3.ch5.factory.MessageDigestExample.main(MessageDigestExample.java:8)
Caused by: java.io.FileNotFoundException: class path resource [com/appress/prospring3/ch5/factory/factory.xml] cannot be opened because it does not exist
    at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:158)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:328)
    ... 7 more

-为什么会这样呢?
-是否存在从同一位置执行此操作的某种方式。 main()在哪里?

第一个版本有两个问题。

  1. xml文件位于src/main/java ,而不位于src/main/resources 当Maven构建项目时,它期望仅在src/main/java下找到Java源文件,而忽略所有其他文件。 资源文件必须放在src/main/resources 那就是Maven约定。
  2. 该代码从资源factory / factory.xml加载文件。 这意味着factory.xml应该在要查找的包factory中。 但是该文件位于com.appres.prospring3.ch5.factory包中。

将完整的软件包名称添加到路径后,第一个版本也将运行:

context.load("classpath:com/appress/prospring3/ch5/factory/factory.xml");

最好将配置文件保留在resources文件夹中,因为按照惯例,配置文件应始终放在该文件夹中。

classpath:前缀始终相对于您的类路径的根。 因此

context.load("classpath:factory/factory.xml");

在类路径的根目录/factory/factory.xml中寻找factory.xml ,您显然没有。 您需要输入完全合格的软件包名称才能找到它所在的位置

context.load("classpath:com/appress/prospring3/ch5/factory/factory.xml");

src/main/resources文件夹是Maven约定。 Maven将获取该文件夹中的所有文件,并将它们添加到类路径的根目录(或相对于它们嵌套的文件夹/包的根目录。)因此,在您的第二个示例中, factory.xml找到了到达该类路径的根目录的方式,您可以对其进行访问与

context.load("classpath:factory.xml");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM