在项目中,经常要用到读系统文件.在项目的遗留代码中,都是在系统启动是传入一个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的项目.
分享到:
相关推荐
5. 使用@Autowired或@Resource注解将Service注入到Controller中,通过Service调用Mapper接口进行数据库操作。 6. 测试整合是否成功:编写测试类,检查Spring容器能否正确初始化所有bean,以及数据库操作是否正常。 ...
Atomikos可以与Spring无缝集成,通过实现XAResource接口,它能够协调不同的数据源,确保在分布式环境下的ACID(原子性、一致性、隔离性和持久性)特性。 配置Spring、MyBatis和Atomikos进行分布式事务处理通常涉及...
声明式事务管理是通过在配置文件或注解中声明事务属性,如传播行为、隔离级别、超时和回滚规则,从而实现事务管理。这使得开发者无需在业务逻辑代码中手动管理事务的开始、提交和回滚。Spring的`...
- **示例代码**:通过示例代码演示如何在 Spring 中使用 Hibernate 来操作数据库。 ##### 3.3 Hibernate 与 Struts 的整合 - **整合目的**:通过整合 Hibernate 和 Struts,可以实现持久层和表示层之间的通信。 - ...
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...
4. **Java/J2EE Systems Manager**:Java/J2EE系统经理关注于如何将Spring的声明式事务管理集成到企业级应用中,利用Spring的PlatformTransactionManager接口以及相关的TransactionDefinition接口。 5. **Manager, ...
在分布式系统中,TM负责协调参与事务的各个资源,确保事务的ACID(原子性、一致性、隔离性、持久性)特性。 接下来,我们来看看Spring是如何与JTA结合的。Spring的PlatformTransactionManager接口是Spring事务管理...
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还提供了Resource接口来读取和加载外部配置文件,以便动态获取属性值。 6. **作为项目的粘合剂**: Spring作为一个框架,可以将不同的技术(如Struts、Hibernate)整合在一起,通过IOC和AOP提供统一的...
Spring IOC 控制反转:把创建对象的权利交给Spring 创建对象 1.... 2.... 3.... ClassPathXmlApplicationContext:使用这个...在Servlet中使用WebApplicationContextUtils获取容器对象 5.使用容器对象去获取Service对象
- **实践**:在Spring框架中,通过定义接口(如Service接口)并让具体的业务逻辑类实现这些接口,可以实现面向抽象编程。 - **优点**: - **松耦合**:降低模块间的依赖关系。 - **易扩展**:新增功能或修改现有...
- **装饰者模式**:在处理链中使用,如过滤器。 #### 核心容器模块详解 - **SpringContext (应用上下文)**:它是 Spring 的核心容器之一,提供了一个更为高级的配置机制,通常用于整个应用上下文的管理,包括 Bean...
1. **创建配置文件的资源对象**:首先,通过`ClassPathResource`类创建一个资源对象,用于指定配置文件`beans.xml`的位置。 ```java ClassPathResource res = new ClassPathResource("beans.xml"); ``` 2. **...
6. **测试类加载配置文件**:在单元测试中,可以通过 Spring 提供的 `ContextLoader` 或者 `ApplicationContext` 来加载配置文件并初始化上下文。 7. **根据 name 注入 service**:使用 `@Resource` 注解指定 name ...
首先,我们需要在Spring配置文件中引入Atomikos的相关依赖。这通常包括配置Atomikos的事务管理器,以及设置全局事务的属性,如超时时间、回滚规则等。在Spring 4中,可以使用`<bean>`标签创建Atomikos的`...
在IT行业中,尤其是在大型分布式系统的设计与开发中,如何有效地管理...通过这个项目,开发者可以学习到Spring的事务管理、MyBatis的使用以及JTA在分布式事务中的作用,这对于构建高可用和高性能的分布式系统至关重要。
这时,可以使用Apache的Commons FileUpload库处理文件上传,而文件存储一般会选择云存储服务如阿里云OSS或本地文件系统,配合Spring的Resource接口进行管理和访问。 在前端展示上,Bootstrap或Element UI这样的前端...
在Spring Boot应用中,我们可以通过添加依赖、配置Eureka服务器的地址以及服务提供者的元数据来实现Eureka的集成。服务提供者需要在启动时自动注册到Eureka Server,同时设置服务的元数据,如服务名、版本号等。 **...