工作中少不了要制定各种各样的配置文件,这里和大家分享一下工作中我是如何制定配置文件的,这是个人习惯,在我在的项目组中目前要定义配置文件都安装这个步骤,效果还不错。
如我们现在有一个这样的配置需求,顶层是Server,有port和shutdown2个属性,包含一个service集合,service对象有name一个属性,并包含一个connector集合,connector对象有port和protocol2个属性。
我一上来不会去考虑是用xml还是json还是数据库配置,我会第一步写好对应的配置bean。如上面的需求,就写3个bean。bean和bean之间的包含关系要体现出来。(使用了lombok)
@Data
@XStreamAlias("Server")
public class Server {
@XStreamAsAttribute
private int port = 8005;
@XStreamAsAttribute
private String shutDown = "SHUTDOWN";
private List<Service> services;
}
@Data
@XStreamAlias("Service")
public class Service {
@XStreamAsAttribute
private String name;
private List<Connector> connectors;
}
@Data
@XStreamAlias("Connector")
public class Connector {
@XStreamAsAttribute
private int port = 8080;
@XStreamAsAttribute
private String protocol = "HTTP/1.1";
}
写好后,我会编写其他的业务代码,整个流程跑完整了,配置的类型,字段不需要修改了,最后使用XStream生成xml文件,这就是最后交互的配置文件。
public class XMLConfig {
public static String toXML(Object obj) {
XStream xstream = new XStream();
xstream.autodetectAnnotations(true);
// xstream.processAnnotations(Server.class);
return xstream.toXML(obj);
}
public static <T> T toBean(String xml, Class<T> cls) {
XStream xstream = new XStream();
xstream.processAnnotations(cls);
T obj = (T) xstream.fromXML(xml);
return obj;
}
public static <T> T toBean(File file, Class<T> cls) {
XStream xstream = new XStream();
xstream.processAnnotations(cls);
T obj = (T) xstream.fromXML(file);
return obj;
}
}
最后定稿的配置文件(就是这个 String xml = XMLConfig.toXML(server)):
<Server port="8005" shutDown="SHUTDOWN">
<services>
<Service name="Kitty">
<connectors>
<Connector port="8088" protocol="HTTP/1.1"/>
<Connector port="8089" protocol="AJP"/>
</connectors>
</Service>
</services>
</Server>
附上自己的junit
public class XMLConfigTest {
@Test
public void test() {
Server server = createTestBean();
String xml = XMLConfig.toXML(server);
System.out.println(xml);
}
@Test
public void testRead() {
String str =
"<Server port=\"8005\" shutDown=\"SHUTDOWN\">" +
" <services>" +
" <Service name=\"Kitty\">" +
" <connectors>" +
" <Connector port=\"8088\" protocol=\"HTTP/1.1\"/>" +
" <Connector port=\"8089\" protocol=\"AJP\"/>" +
" </connectors>" +
" </Service>" +
" </services>" +
"</Server>";
Server server = createTestBean();
Server server2 = XMLConfig.toBean(str, Server.class);
assertEquals(server, server2);
}
private Server createTestBean() {
Server server = new Server();
List<Service> services = new ArrayList<Service>();
server.setServices(services);
Service service = new Service();
services.add(service);
service.setName("Kitty");
List<Connector> connectors = new ArrayList<Connector>();
service.setConnectors(connectors);
Connector connectorhttp11 = new Connector();
connectorhttp11.setPort(8088);
connectorhttp11.setProtocol("HTTP/1.1");
connectors.add(connectorhttp11);
Connector connectorAJP = new Connector();
connectorAJP.setPort(8089);
connectorAJP.setProtocol("AJP");
connectors.add(connectorAJP);
return server;
}
}
就是说,我配置文件是功能完成后期才完成的,如果项目一开始就指定了配置文件的格式,中途少不了各种修改。我的xml是配置相关的bean完全测试通过之后,用xstream生成xml,读取的时候也是用xstream直接读成对象,完全不需要关注xml的读写。
还有最主要的是,我有中间的这一层配置的bean,这是我觉得最重要的。有了这层bean之后,就相当于有了一个中介。你不需要知道配置是哪里来的,是xml还是json还是数据库,修改很灵活,同时代码不需要有读取xml的任何代码,可读性相当的好。写过代码的同学都应该知道,业务逻辑代码里面混杂着从xml里面读取配置项的代码,其实挺难看的。
这里是有的技术有xstream,还使用了lombok,但这些都不是关键,关键是有配置的bean这一层中介,整个过程不需要和xml打任何交道,后面要改成json还是分分钟的时候。我觉得代码好坏就在于此。千万业务代码里面不要和读取配置的代码耦合在一起。切记!
这就是我今天给大家分享的。我个人非常喜欢的编码方式,使用简单,效果也很好。其实没有什么技术,技术一说都懂,但我觉得技术外的习惯才是最重要的!欢迎讨论。
进阶篇:配置规范
本文原著作者:晓风轻
原文链接:
版权归作者所有,转载请注明出处
网友评论