分享我工作中制定配置文件的习惯

晓风轻晓风轻

工作中少不了要制定各种各样的配置文件,这里和大家分享一下工作中我是如何制定配置文件的,这是个人习惯,在我在的项目组中目前要定义配置文件都安装这个步骤,效果还不错。


如我们现在有一个这样的配置需求,顶层是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还是分分钟的时候。我觉得代码好坏就在于此。千万业务代码里面不要和读取配置的代码耦合在一起。切记!


这就是我今天给大家分享的。我个人非常喜欢的编码方式,使用简单,效果也很好。其实没有什么技术,技术一说都懂,但我觉得技术外的习惯才是最重要的!欢迎讨论。


==================更新=================

进阶篇:我的编码习惯 - 配置规范

欢迎关注专栏:我的java学习之路及习惯

15 条评论