`

spring @Configration扩展使用一例

阅读更多
最近对注解了解的比较多, 也在实际项目中实战了一把, 同时对spring中关于一些注解的源代码看了看, 下面是实际应用中对@ContextConfiguration的一些扩展
经过查看spring的源代码, 可以知道@ContextConfiguration在默认情况下是使用ClassPath的方式来加载locations指定的bean xml配置文件, 也就是说配置文件必须放在classpath路径下, 但是有些情况下, 我们需要通过相对文件路径来加载配置文件, 这个就需要自己动手来定制一番, 还好spring在这一点还是留有一定的扩展余地. 这里需要定义两个类, 一个是继承XmlBeanDefinitionReader, 然后在复写的loadBeanDefinitions方法中, 将配置文件路径包装成FileSystemResource类:
public class FileSystemXmlBeanDefinitionReader extends XmlBeanDefinitionReader {

	public FileSystemXmlBeanDefinitionReader(BeanDefinitionRegistry registry) {
		super(registry);
	}

	@SuppressWarnings("unchecked")
	@Override
	public int loadBeanDefinitions(String location, Set actualResources)
			throws BeanDefinitionStoreException {
		ResourceLoader resourceLoader = getResourceLoader();
		if (resourceLoader == null) {
			throw new BeanDefinitionStoreException(
					"Cannot import bean definitions from location [" + location
							+ "]: no ResourceLoader available");
		}

		Resource resource = new FileSystemResource(location);
		int loadCount = loadBeanDefinitions(resource);
		if (actualResources != null) {
			Assert.isNull(actualResources);
		}
		if (logger.isDebugEnabled()) {
			logger.debug("Loaded " + loadCount
					+ " bean definitions from location pattern [" + location
					+ "]");
		}
		return loadCount;

	}
}

接下来就是从GenericXmlContextLoader继承, 并复写modifyLocations方法, 将配置文件路径转换成绝对路径, 另外还需要将前面的FileSystemXmlBeanDefinitionReader类作为配置文件的reader, 即可:
public class FileSystemXmlContextLoader extends GenericXmlContextLoader {
	@Override
	protected String[] modifyLocations(Class<?> clazz, String... locations) {
		String[] modifiedLocations = new String[locations.length];
		for (int i = 0; i < locations.length; i++) {
			String path = locations[i];
			if (path != null && path.startsWith("/")) {
				path = path.substring(1);
			}
			modifiedLocations[i] = new File(path).getAbsolutePath();
		}
		return modifiedLocations;
	}
	
	@Override
	protected BeanDefinitionReader createBeanDefinitionReader(
			GenericApplicationContext context) {
		return new FileSystemXmlBeanDefinitionReader(context);
	}
}

然后在@ContextConfiguration注解中指定我们写的loader即可, 即loader = FileSystemXmlContextLoader.class
比如说, 我的一个@ContextConfiguration这样写:
@ContextConfiguration(locations = {
		"/src/test/resources/spring-xx-dependency.xml",
		"/src/test/resources/spring-xx-config.xml",
		"/src/test/resources/spring-xx-jdbc.xml",
		"/../xxx/src/main/webconfig/spring-xx-tx.xml",
		"/../xxx/src/main/webconfig/spring-xx-service.xml",
		"/src/test/resources/spring-xx-dao.xml" }, loader = FileSystemXmlContextLoader.class)
分享到:
评论

相关推荐

    spring框架的@Resource和@Component 程序和文档

    在实际开发中,Spring提供了多种组合和扩展这些注解的方式,例如使用`@Qualifier`来进一步指定注入的Bean,或者使用`@Configuration`和`@Bean`来手动配置Bean。这使得Spring框架能够灵活地管理和装配复杂的依赖关系...

    springIoc实现原理

    在传统的软件设计中,对象的创建和依赖关系的维护通常由代码自身来完成,而在Spring Ioc中,这些控制权被反转给了Spring容器,使得对象的生命周期管理和依赖注入变得更为灵活和可扩展。 **一、控制反转(IoC)概念*...

    Spring IOC Annotation 注入 学习实例

    在`IOC_Project`这个压缩包文件中,很可能是包含了一个示例项目,用于演示如何使用Spring的IOC Annotation注入。通过查看和运行这个项目,你可以更深入地了解这些概念并实践它们。项目的结构可能包括了源代码文件(`...

    spring的配置注解

    Spring框架是Java开发中广泛应用的一个轻量级框架,它的核心特性是依赖注入(Dependency Injection,简称DI)和面向切面编程(Aspect-Oriented Programming,简称AOP)。配置注解是Spring框架中的一种简化配置的方式...

    Spring-Boot1.52 SpringSecurity4 Spring Data Jpa 整合例子

    在本例中使用的版本是 **1.5.2**。 - **自动配置**: Spring Boot 可以自动配置大多数 Spring 组件,开发者只需要添加相应的依赖即可。 - **外部化配置**: 支持将配置从应用代码中分离出来,便于管理且不影响代码。 ...

    spring boot 整合mybtis druid 多数据源 源代码。

    而Druid是一个高性能、功能强大的数据库连接池,它不仅提供了监控和扩展功能,还能有效提高数据库的访问性能。 整合Spring Boot、MyBatis和Druid的第一步是添加依赖。在`pom.xml`文件中,你需要引入Spring Boot的...

    spring boot整合sharding jdbc5.2.0分库分表demo

    在Spring Boot项目中,配置数据源,使用`@Configuration`和`@EnableConfigurationProperties`注解: ```java @Configuration @EnableConfigurationProperties({DataSourceProperties.class}) public class ...

    Spring2.5 IOC的简单实现

    下面以 XML 配置为例,展示如何创建一个简单的 Spring 2.5 应用: 1. **创建 Bean 定义** 在 `src` 目录下创建一个名为 `com.example` 的包,然后创建一个 Java 类,例如 `MyClass.java`: ```java package ...

    spring boot多数据源

    在IT行业中,Spring Boot是一个非常流行的微服务框架,它简化了Spring应用的初始搭建以及开发过程。当项目需要处理来自不同数据源的数据时,Spring Boot提供了支持多数据源的能力。本篇文章将深入探讨如何在Spring ...

    Spring IOC容器实现分析.pdf 下载

    在Java开发领域,Spring框架无疑是使用最为广泛的轻量级框架之一,其中的核心组件就是IOC(Inversion of Control)容器。本文将深入剖析Spring的IOC容器,理解其工作原理和重要功能,以帮助开发者更好地利用这一强大...

    spring3 mvc系列一:架构基本配置(注解版)

    在本篇【spring3 mvc系列一:架构基本配置(注解版)】中,我们将深入探讨Spring MVC框架的核心概念和基础配置,特别是在使用注解进行配置时的关键点。Spring MVC是Spring框架的一个模块,专注于处理Web应用程序的请求...

    test-configuration.rar

    在本例中,`test-starter`可能是一个自定义的Starter,用于提供特定功能或者简化与`test-configuration`相关的配置。 2. **自定义配置类**: 在Spring Boot中,我们可以创建自己的@Configuration类来定义bean和其他...

    java注解源码-Spring-Configuration-using-Annotation-and-Java-Source-Code:Spr

    本项目“Spring-Configuration-using-Annotation-and-Java-Source-Code”深入探讨了如何使用Java注解来构建Spring应用的配置。以下是关于Java注解和Spring框架在配置中的应用的详细知识点: 1. **Java注解**: - ...

    sleeve-master_spring_

    《Spring Boot基础学习指南——以`sleeve-master_spring_`项目为例》 Spring Boot作为Java领域中的热门框架,以其简化开发、快速启动的特点深受开发者喜爱。本文将围绕标题为`sleeve-master_spring_`的项目,深入...

    spring-boot集成mybatis

    在本文中,我们将深入探讨如何将MyBatis与Spring Boot集成,以便构建高效、可扩展的Java应用程序。Spring Boot以其简化配置和快速开发的特点,已经成为Java开发者首选的微服务框架。MyBatis作为轻量级的持久层框架,...

    spring_ioc调用实力

    例如,使用`@Component`标记一个类为Spring的bean,使用`@Autowired`自动装配依赖: ```java @Component("exampleBean") public class ExampleClass { @Autowired private Dependency dependency; } ``` Java...

    Spring AOP 建立一个简单的切面及测试

    Spring框架提供了强大的AOP支持,本文将以一次演出为例,详细介绍如何在Spring环境中构建一个简单的AOP切面,并进行相应的测试。 #### 二、基本概念介绍 1. **切点(Pointcut)**:定义了何处执行切面代码的位置。在...

    MongoDB与Spring整合

    而Spring框架是Java领域中广泛使用的应用框架,它提供了一种优雅的方式来管理应用的配置和服务。当我们将MongoDB与Spring整合时,可以充分利用Spring的依赖注入和数据访问抽象,简化MongoDB在Java应用中的使用。 ...

    spring加载

    标题“spring加载”涉及到的是Spring框架的初始化过程,这一过程对于理解Spring如何管理bean和依赖注入至关重要。在Spring框架中,加载是指从配置文件(如XML、Java配置或注解)中读取bean定义,并创建bean实例的...

    spring源码解读.txt

    #### 一、Spring框架简介 Spring是一个开源的Java应用框架,由Rod Johnson创建并领导开发。Spring的核心特性包括依赖注入(Dependency Injection,DI)、面向切面编程(Aspect Oriented Programming,AOP)以及一...

Global site tag (gtag.js) - Google Analytics