`
dengminghua1016
  • 浏览: 129070 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

在Web.xml中自动扫描Spring的配置文件及resource时classpath*:与classpath:的区别

    博客分类:
  • java
 
阅读更多
首先在web.xml中配置监听器listener,让Spring进行自动获取。具体加入的代码如下:
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>


只要其启动服务这个配置就会默认的去加载我们的配置文件,自动的将里面的bean都给初始化了。默认情况下它会去/WEB-INF/applicationContext.xml文件。如果自己想要将配置文件放到classpath下,即src目录下,则需要再进行路径的指定,具体代码如下:
<!-- Context Configuration locations for Spring XML files -->
<context-param> <param-name>contextConfigLocation</param-name>
<!-- <param-value>/WEB-INF/applicationContext-*.xml,classpath*:applicationContext-*.xml</param-value> -->
<!-- 加入你的配置文件放在了src下的,命名规则为:applicationContext-*.xml形式,则可以从以下方式配置-->
<param-value>classpath:applicationContext-*.xml</param-value>
</context-param>


这样的话,在服务器启动的时候就会自动的去classpa也就是src目录下找所有的以:applicationContext-*.xml文件并将它们初始化。

Spring加载resource时classpath*:与classpath:的区别

Spring可以通过指定classpath*:与classpath:前缀加路径的方式从classpath加载文件,如bean的定义文件.classpath*:的出现是为了从多个jar文件中加载相同的文件.classpath:只能加载找到的第一个文件.

比如 resource1.jar中的package 'com.test.rs' 有一个 'jarAppcontext.xml' 文件,内容如下:

<bean name="ProcessorImplA" class="com.test.spring.di.ProcessorImplA" />

resource2.jar中的package 'com.test.rs' 也有一个 'jarAppcontext.xml' 文件,内容如下:

<bean id="ProcessorImplB" class="com.test.spring.di.ProcessorImplB" />

通过使用下面的代码则可以将两个jar包中的文件都加载进来

ApplicationContext ctx = new ClassPathXmlApplicationContext( "classpath*:com/test/rs/jarAppcontext.xml");

而如果写成下面的代码,就只能找到其中的一个xml文件(顺序取决于jar包的加载顺序)

ApplicationContext ctx = new ClassPathXmlApplicationContext( "classpath:com/test/rs/jarAppcontext.xml");

classpath*:的使用是为了多个component(最终发布成不同的jar包)并行开发,各自的bean定义文件按照一定的规则:package+filename,而使用这些component的调用者可以把这些文件都加载进来.

classpath*:的加载使用了classloader的 getResources() 方法,如果是在不同的J2EE服务器上运行,由于应用服务器提供自己的classloader实现,它们在处理jar文件时的行为也许会有所不同。 要测试classpath*: 是否有效,可以用classloader从classpath中的jar文件里加载文件来进行测试:getClass().getClassLoader().getResources("<someFileInsideTheJar>")。(上面的例子是在sun的jre中运行的状态)

从Spring的源码,在PathMatchingResourcePatternResolver类中,我们可以更清楚的了解其对的处理:如果是以classpath*开头,它会遍历classpath.

    protected Resource[] findAllClassPathResources(String location) throws IOException {
        String path = location;
        if (path.startsWith("/")) {
            path = path.substring(1);
        }
        Enumeration resourceUrls = getClassLoader().getResources(path);
        Set<Resource> result = new LinkedHashSet<Resource>(16);
        while (resourceUrls.hasMoreElements()) {
            URL url = (URL) resourceUrls.nextElement();
            result.add(convertClassLoaderURL(url));
        }
        return result.toArray(new Resource[result.size()]);
    }


http://blog.csdn.net/kkdelta/article/details/5560210,简介了在JAVA里遍历classpath中读取找到的所有符合名称的文件.
另外在加载resource的时候,其他前缀的意义如下表所示:注意classpath*只能用与指定配置文件的路径,不能用在用于getResource的参数.如appContext.getResource("classpath*:conf/bfactoryCtx.xml")会异常的.



从Spring的源码可以看出原因:如果是classpath:开头,从classpath加载,否则尝试URL,如果失败,调用 getResourceByPath
public Resource getResource(String location) {
        Assert.notNull(location, "Location must not be null");
        if (location.startsWith(CLASSPATH_URL_PREFIX)) {
            return new ClassPathResource(location.substring(CLASSPATH_URL_PREFIX.length()), getClassLoader());
        }
        else {
            try {
                // Try to parse the location as a URL...
                URL url = new URL(location);
                return new UrlResource(url);
            }
            catch (MalformedURLException ex) {
                // No URL -> resolve as resource path.
                return getResourceByPath(location);
            }
        }
    }


getResourceByPath会被不同ApplicationContext 实现覆盖.
如 GenericWebApplicationContext覆盖为如下:
protected Resource getResourceByPath(String path) {
        return new ServletContextResource(this.servletContext, path);
    }

如 FileSystemXmlApplicationContext覆盖为如下:

protected Resource getResourceByPath(String path) {
        if (path != null && path.startsWith("/")) {
            path = path.substring(1);
        }
        return new FileSystemResource(path);
    }


最终从文件加载的时候仍然是JAVA中常见的读取文件的方法:
如ClassPathResource得到inputstream的方法是利用class loader.
    public InputStream getInputStream() throws IOException {
        InputStream is;
        if (this.clazz != null) {
            is = this.clazz.getResourceAsStream(this.path);
        }


如FileSystemResource得到inputstream的方法是利用FileInputStream.
    public InputStream getInputStream() throws IOException {
        return new FileInputStream(this.file);
    }

如ServletContextResource得到inputstream的方法是利用servletContext.getResourceAsStream.
    public InputStream getInputStream() throws IOException {
        InputStream is = this.servletContext.getResourceAsStream(this.path);
        if (is == null) {
            throw new FileNotFoundException("Could not open " + getDescription());
        }
        return is;
    }
  • 大小: 42.7 KB
分享到:
评论

相关推荐

    Spring通过在classpath自动扫描方式把组件纳入spring容器中管理

    在Spring框架中,自动扫描(Auto-Component Discovery)是一种便捷的方式,它允许开发者无需显式配置每个bean,就能将类路径下(classpath)的特定包及其子包中的组件(即带有特定注解的类)纳入Spring容器进行管理...

    Spring中使用classpath加载配置文件浅析

    最后,确保在开发过程中持续关注Spring框架的版本更新,因为不同版本的Spring在加载配置文件时的细节可能有所不同。随着技术的发展,Spring也在不断地改进其配置加载机制,了解最新的加载方式可以帮助开发者更有效地...

    如何加载jar包中的spring配置文件

    在Spring MVC项目中,加载jar包中的Spring配置文件是一个常见的需求,特别是在进行SSM(Spring、Spring MVC、MyBatis)整合时。SSM框架的整合通常涉及到多个配置文件的组织和管理,其中一部分配置可能会被打包到独立...

    spring2.5的applicationContext配置文件

    6. **资源处理**:在`applicationContext.xml`中可以配置资源加载,如`&lt;context:resource location="classpath:database.properties"/&gt;`来加载属性文件。 7. **国际化**:Spring支持多语言环境,通过`...

    Spring2.5 自动扫描classpath

    标题中的“Spring2.5 自动扫描classpath”指的是Spring框架在2.5版本中引入的一项功能,即自动组件扫描(Auto-Component Scanning)。这项功能允许开发者无需在XML配置文件中显式声明bean,而是通过在类上添加特定...

    Spring Boot技术知识点:如何读取不同路径里的applicationContext.xml配置文件6

    在Spring Boot应用中,我们通常使用YAML或properties文件来管理我们的配置,因为它们与Spring Boot的自动配置机制紧密集成。然而,在某些情况下,我们可能需要读取传统的`applicationContext.xml`配置文件,例如,当...

    Struts2.1.6+Spring2.5.6+Hibernate3.3.1框架整合常见错误

    可能是Hibernate配置文件(如`hibernate.cfg.xml`)未被正确加载,或者是Spring配置文件中的某些配置有误。 **解决方法**: 1. **检查配置文件路径**: 确认Spring配置文件中关于`SessionFactory`的配置是否正确,如...

    Spring 加载多个配置文件

    这里的 `&lt;import&gt;` 标签指定了外部配置文件的路径,这些文件将在解析主配置文件时被自动加载和合并。 #### 四、结论 在 Spring 框架中,通过合理地拆分和加载多个配置文件,不仅可以显著提升应用程序的可读性和可...

    CXF与spring整合实现

    在企业级应用开发中,Apache CXF与Spring框架的结合被广泛采用,以实现高效、灵活的Web服务开发。本文将深入探讨CXF与Spring如何整合,以及如何在Tomcat环境下部署Web服务。 #### 一、CXF与Spring整合概述 **CXF**...

    Spring Boot技术知识点:如何读取不同路径里的applicationContext.xml配置文件2

    在实际开发中,你还需要确保XML配置中的bean与Spring Boot的自动配置不冲突,必要时可以使用`@Profile`或`@Conditional`注解来控制不同环境下的配置加载。 总结来说,Spring Boot虽然主要依赖Java和YAML配置,但...

    spring mvc 项目错误,和一些配置

    - **原因**:这通常发生在Spring解析XML配置文件时遇到问题。 - **解决办法**: - 检查XML配置文件是否存在格式错误。 - 确认所有必需的依赖都已添加至项目中。 #### 11. 文件提前结束 - **原因**:XML文件未按...

    strut2和spring整合

    - 在 `web.xml` 中添加 `ContextLoaderListener` 监听器,以便启动时加载 Spring 上下文。 - `contextConfigLocation` 参数指定 Spring 配置文件的位置,例如 `classpath:applicationContext.xml`。 4. **Spring ...

    spring4 中文API

    - **Classpath scanning and managed components**:讲解了如何自动检测类路径上的组件并将其纳入管理。 - **Using JSR 330 Standard Annotations**:介绍了如何使用JSR 330注解进行依赖注入。 - **Java-based ...

    Spring学习总结笔记

    - **WildcardClassLoader**:通过通配符加载多个配置文件,如`classpath:applicationContext-*.xml`。 5. **依赖注入(Dependency Injection, DI)** DI是Spring的核心,它通过XML配置或注解方式来实现对象间的...

    springmvc+spring+mybatis的整合

    - 在Spring配置文件中配置事务拦截器。 ```xml &lt;tx:advice id="txAdvice" transaction-manager="transactionManager"&gt; &lt;tx:attributes&gt; &lt;tx:method name="*" propagation="REQUIRED" /&gt; &lt;/tx:attributes&gt; ...

    SpringBoot之logback-spring.xml不生效的解决方法

    当使用logback作为日志框架时,通常我们会将配置文件放在`src/main/resources`目录下,命名为`logback-spring.xml`,这是因为Spring Boot默认支持`logback-spring.xml`,它能与Spring的自动配置机制集成。...

    spring2.5 学习笔记

    - **建立 Spring 的配置文件**:创建 `applicationContext.xml` 文件作为 Spring 的核心配置文件。 - **引入 Spring 的 jar 包**:添加 Spring 框架所需的依赖库到项目的 classpath 中。 - **编写测试代码**:...

    spring 所有功能详解

    **通过`import`标签引入其他配置文件**:在`spring-mvc.xml`中使用`&lt;import resource="user_spring.xml"/&gt;`引入其他配置文件。 2. **在`web.xml`中配置**:可以在`web.xml`中指定`contextConfigLocation`参数来...

    spring资源文件

    在Spring框架中,资源文件是不可或缺的部分,它们用于配置、数据源、本地化以及其它功能。Spring作为一个强大的Java企业级应用开发框架,提供了一系列的工具和API来管理和处理各种资源。下面将详细介绍Spring中资源...

Global site tag (gtag.js) - Google Analytics