`
stingh711
  • 浏览: 122012 次
  • 性别: Icon_minigender_1
  • 来自: 无锡
社区版块
存档分类
最新评论

使用Spring中的Resource接口隔离对文件系统的依赖

阅读更多

在项目中,经常要用到读系统文件.在项目的遗留代码中,都是在系统启动是传入一个APP_HOME,然后根据相对路径去读文件.这样做的缺点是比较难测试,而且自动化的测试更难.

比如说有这样一个类Server,要根据server.properties来初始化,一开始的代码是这样的:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

/**
* @author sting
*/
public class Server {
private static final String FILE = "conf" + File.separator + "server.properties";

public void initial() throws IOException {
FileInputStream in = new FileInputStream(System.getProperty("APP_HOME") + File.separator + FILE);
Properties properties = new Properties();
properties.load(in);
// initial
}
}

文件路径和文件名都是hard code,很难测试. 我们首先把initial()重构一下,代码如下:


public void initial(InputStream in) throws IOException {
Properties properties = new Properties();
properties.load(in);
// initial
}

至少,测试时,我们可以传进来自己的InputStream,也可以方便的时候测试用的server.properties,或者干脆使用内联的文件,代码如下:

class ServerTest extends TestCase {
private Server server;

public void setUp() throws Exception {
this.server = new Server();
}

public void testInitial() throws Exception {
String serverProperties = "port=8080\n" +
"run_mode=normal";
InputStream in = new ByteArrayInputStream(serverProperties.getBytes());

this.server.initial(in);
// assert
}
}

但是,在实际工作的代码中,文件名和路径依然要hard code进代码中.这时,我们可以使用spring中的Resource接口来进一步改进我们的代码.

public class Server {
private Resource resource;

public void setResource(Resource r) {
this.resource = r;
}

public void initial() throws IOException {
Properties properties = new Properties();
properties.load(this.resource.getInputStream());
// initial
}
}

再加一段spring的配置文件:

<beans>
<bean id="server" class="Server">
<property name="resource" value="classpath:server.properties"/>
</bean>
</beans>

这样,Server的代码完全与文件的具体路径和文件名无关,仅仅用配置文件就可以指定,表达更清楚,也更易于测试.

当然,仅限于已经使用spring的项目.

分享到:
评论

相关推荐

    Spring_mybatis整合相关 jar 包,配置文件

    5. 使用@Autowired或@Resource注解将Service注入到Controller中,通过Service调用Mapper接口进行数据库操作。 6. 测试整合是否成功:编写测试类,检查Spring容器能否正确初始化所有bean,以及数据库操作是否正常。 ...

    spring+mybatis+atomikos配置文件及相关包(最新版)

    Atomikos可以与Spring无缝集成,通过实现XAResource接口,它能够协调不同的数据源,确保在分布式环境下的ACID(原子性、一致性、隔离性和持久性)特性。 配置Spring、MyBatis和Atomikos进行分布式事务处理通常涉及...

    Spring+JOTM 分布式事务管理

    声明式事务管理是通过在配置文件或注解中声明事务属性,如传播行为、隔离级别、超时和回滚规则,从而实现事务管理。这使得开发者无需在业务逻辑代码中手动管理事务的开始、提交和回滚。Spring的`...

    传智播客 Spring 完全文档 笔记总结

    - **示例代码**:通过示例代码演示如何在 Spring 中使用 Hibernate 来操作数据库。 ##### 3.3 Hibernate 与 Struts 的整合 - **整合目的**:通过整合 Hibernate 和 Struts,可以实现持久层和表示层之间的通信。 - ...

    Spring攻略(第二版 中文高清版).part1

    6.2 在你的Servlet和过滤器中使用Spring 214 6.2.1 问题 214 6.2.2 解决方案 215 6.2.3 工作原理 215 6.3 将Spring与Struts 1.x集成 220 6.3.1 问题 220 6.3.2 解决方案 220 6.3.3 工作原理 220 6.4...

    spring spring transtration

    4. **Java/J2EE Systems Manager**:Java/J2EE系统经理关注于如何将Spring的声明式事务管理集成到企业级应用中,利用Spring的PlatformTransactionManager接口以及相关的TransactionDefinition接口。 5. **Manager, ...

    spring + JTA + atomikos 实现分布式事务

    在分布式系统中,TM负责协调参与事务的各个资源,确保事务的ACID(原子性、一致性、隔离性、持久性)特性。 接下来,我们来看看Spring是如何与JTA结合的。Spring的PlatformTransactionManager接口是Spring事务管理...

    Spring攻略(第二版 中文高清版).part2

    6.2 在你的Servlet和过滤器中使用Spring 214 6.2.1 问题 214 6.2.2 解决方案 215 6.2.3 工作原理 215 6.3 将Spring与Struts 1.x集成 220 6.3.1 问题 220 6.3.2 解决方案 220 6.3.3 工作原理 220 6.4...

    2021年新spring面试宝典.doc

    此外,Spring还提供了Resource接口来读取和加载外部配置文件,以便动态获取属性值。 6. **作为项目的粘合剂**: Spring作为一个框架,可以将不同的技术(如Struts、Hibernate)整合在一起,通过IOC和AOP提供统一的...

    Spring.html

    Spring IOC 控制反转:把创建对象的权利交给Spring 创建对象 1.... 2.... 3.... ClassPathXmlApplicationContext:使用这个...在Servlet中使用WebApplicationContextUtils获取容器对象 5.使用容器对象去获取Service对象

    spring框架案例学习文档笔记

    - **实践**:在Spring框架中,通过定义接口(如Service接口)并让具体的业务逻辑类实现这些接口,可以实现面向抽象编程。 - **优点**: - **松耦合**:降低模块间的依赖关系。 - **易扩展**:新增功能或修改现有...

    Spring面试题(2022最新版)-重点

    - **装饰者模式**:在处理链中使用,如过滤器。 #### 核心容器模块详解 - **SpringContext (应用上下文)**:它是 Spring 的核心容器之一,提供了一个更为高级的配置机制,通常用于整个应用上下文的管理,包括 Bean...

    spring ioc以及事物架构图

    1. **创建配置文件的资源对象**:首先,通过`ClassPathResource`类创建一个资源对象,用于指定配置文件`beans.xml`的位置。 ```java ClassPathResource res = new ClassPathResource("beans.xml"); ``` 2. **...

    spring事务管理

    6. **测试类加载配置文件**:在单元测试中,可以通过 Spring 提供的 `ContextLoader` 或者 `ApplicationContext` 来加载配置文件并初始化上下文。 7. **根据 name 注入 service**:使用 `@Resource` 注解指定 name ...

    spring4+atomikos实现分布式事务

    首先,我们需要在Spring配置文件中引入Atomikos的相关依赖。这通常包括配置Atomikos的事务管理器,以及设置全局事务的属性,如超时时间、回滚规则等。在Spring 4中,可以使用`&lt;bean&gt;`标签创建Atomikos的`...

    spring+mybatis+jta实现多数据源的分布式事物(代码可以直接运行)

    在IT行业中,尤其是在大型分布式系统的设计与开发中,如何有效地管理...通过这个项目,开发者可以学习到Spring的事务管理、MyBatis的使用以及JTA在分布式事务中的作用,这对于构建高可用和高性能的分布式系统至关重要。

    Java WEB——人事管理系统

    这时,可以使用Apache的Commons FileUpload库处理文件上传,而文件存储一般会选择云存储服务如阿里云OSS或本地文件系统,配合Spring的Resource接口进行管理和访问。 在前端展示上,Bootstrap或Element UI这样的前端...

    Spring Cloud Eureka Service Provider

    在Spring Boot应用中,我们可以通过添加依赖、配置Eureka服务器的地址以及服务提供者的元数据来实现Eureka的集成。服务提供者需要在启动时自动注册到Eureka Server,同时设置服务的元数据,如服务名、版本号等。 **...

Global site tag (gtag.js) - Google Analytics