现在都在讲SOA,很多公司也是这么做的,这样做的好处我就不再这里重复了。SOA带来这些优点的同时也带来了很大的困扰,特别是在开发环境下,接口不稳定、频频挂掉,有时开发环境不如线上的数据那么丰富,想要的数据要不到,严重影响开发的进程。这种痛苦,想想就泪两行。哭归哭,哭够了,就得想一个下次不哭的方法。
在考虑解决方案时,我想尽可能的简单,尽可能的不侵入代码,于是想来想去,就下定决心要用配置的方式。在死了N多脑细胞的时候,我终于想到,下面就是我的方案,使用的是spring的注入机制。
1. 项目结构如下:
项目结构的关键是mock和线上的接口除了上一级包之外都是一致的,这样就可以通过配置包名称注入不同的类
2. 接口如下:
public interface InterfaceService {
String mockInterface();
}
3. 接口实现如下:
mock的接口:
public class InterfaceServiceImpl implements InterfaceService {
@Override
public String mockInterface() {
return "这是一个mock的接口";
}
}
正式的接口
public class InterfaceServiceImpl implements InterfaceService {
@Override
public String mockInterface() {
return "这是一个线上的接口";
}
}
4. 配置文件(这个是重点):
<bean id="interfaceService" class="com.xten.mock.service.${interface_type}.InterfaceServiceImpl"></bean>
这个的关键是将他的上一层包通过配置文件进行配置,那么就可以很简单的切换接口的环境,又不侵入到业务逻辑。
正式环境配置:interface_type=impl
mock环境配置:interface_type=mock
5. 测试用例如下:
public class MockTest {
public static void main(String[] args){
try {
ApplicationContext context = new ClassPathXmlApplicationContext("spring/mock/mock.xml");
InterfaceService interfaceService =context.getBean(InterfaceService.class);
System.out.println(interfaceService.mockInterface());
} catch (BeansException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
}
各位可以自行测试一下。