栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java > SpringBoot

程序员你为什么这么累?

SpringBoot 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

程序员你为什么这么累?

导读:程序员你为什么这么累?

  1. 接口定义规范
  2. controller规范
  3. 日志规范
  4. 异常处理规范
  5. 国际化和参数校验规范
  6. 工具类规范
  7. 函数编写建议
  8. 配置建议

配置规范

工作中少不了要制定各种各样的配置文件,这里和大家分享一下工作中我是如何制定配置文件的,这是个人习惯,结合强大的spring,效果很不错。

需求

如我们现在有一个这样的配置需求,顶层是Server,有port和shutdown2个属性,包含一个service集合,service对象有name一个属性,并包含一个connector集合,connector对象有port和protocol2个属性。

我一上来不会去考虑是用xml还是json还是数据库配置,我会第一步写好对应的配置bean。如上面的需求,就写3个bean。bean和bean之间的包含关系要体现出来。(使用了lombok)

@Data
public class ServerCfg {
  private int port = 8005;
  private String shutDown = "SHUTDOWN";
  private List services;
}

@Data
public class ServiceCfg {
  private String name;
  private List connectors;
}

@Data
public class ConnectorCfg {
  private int port = 8080;
  private String protocol = "HTTP/1.1";
}

然后找一个地方先用代码产生这个bean:

@Configuration
public class Configs {

  @Bean
  public ServerCfg createTestBean() {
    ServerCfg server = new ServerCfg();

    // 
    List services = new ArrayList();
    server.setServices(services);

    // 
    ServiceCfg service = new ServiceCfg();
    services.add(service);

    service.setName("Kitty");

    // 
    List connectors = new ArrayList();
    service.setConnectors(connectors);

    //
    ConnectorCfg connectorhttp11 = new ConnectorCfg();

    connectorhttp11.setPort(8088);
    connectorhttp11.setProtocol("HTTP/1.1");

    connectors.add(connectorhttp11);

    //
    ConnectorCfg connectorAJP = new ConnectorCfg();

    connectorAJP.setPort(8089);
    connectorAJP.setProtocol("AJP");

    connectors.add(connectorAJP);

    return server;
  }
}

然后先测试,看看是否ok。为了演示,我就直接在controller里面调用一下

@Autowired
ServerCfg cfg;

@GetMapping(value = "/configTest")
@ResponseBody
public ResultBean configTest() {
  return new ResultBean(cfg);
}

测试一下,工作正常。

然后进行业务代码编写,等到所有功能测试完毕,就是【开发后期】,再来定义配置文件。中途当然少不了修改格式,字段等各种修改,对于我们来说只是修改bean定义,so easy。

都ok了,再决定使用哪种配置文件。如果是json,我们这样:

JSON格式

把上面接口调用的json复制下来,报存到配置文件。

json内容

{
  "port": 8005,
  "shutDown": "SHUTDOWN",
  "services": [
    {
      "name": "Kitty",
      "connectors": [
 {
   "port": 8088,
   "protocol": "HTTP/1.1",
   "executor": null
 },
 {
   "port": 8089,
   "protocol": "AJP",
   "executor": null
 }
      ]
    }
  ]
}

然后修改config的bean生成的代码为:

import com.fasterxml.jackson.databind.ObjectMapper;

@Configuration
public class Configs {
  @Value("classpath:config/tomcat.json")
  File serverConfigJson;

  @Bean
  public ServerCfg readServerConfig() throws IOException {
    return new ObjectMapper().readValue(serverConfigJson, ServerCfg.class); 
  }
}

代码太简洁了,有没有?!

XML格式

如果使用XML,麻烦一点,我这里使用XStream序列化和反序列化xml。

首先在bean上增加XStream相关注解

@Data
@XStreamAlias("Server")
public class ServerCfg {

  @XStreamAsAttribute
  private int port = 8005;

  @XStreamAsAttribute
  private String shutDown = "SHUTDOWN";

  private List services;

}

@Data
@XStreamAlias("Service")
public class ServiceCfg {

  @XStreamAsAttribute
  private String name;

  private List connectors;
}

@Data
@XStreamAlias("Connector")
public class ConnectorCfg {
  @XStreamAsAttribute
  private int port = 8080;

  @XStreamAsAttribute
  private String protocol = "HTTP/1.1";
}

然后修改产品文件的bean代码如下:

@Configuration
public class Configs {
  @Value("classpath:config/tomcat.xml")
  File serverConfigXML;

  @Bean
  public ServerCfg readServerConfig() throws IOException {
    return XMLConfig.toBean(serverConfigXML, ServerCfg.class);
  }
}

XMLConfig工具类相关代码:

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 toBean(String xml, Class cls) {
    XStream xstream = new XStream();

    xstream.processAnnotations(cls);
    T obj = (T) xstream.fromXML(xml);

    return obj;
  }

  public static  T toBean(File file, Class cls) {
    XStream xstream = new XStream();

    xstream.processAnnotations(cls);
    T obj = (T) xstream.fromXML(file);

    return obj;
  }

}

XStream库需要增加以下依赖:


  com.thoughtworks.xstream
  xstream
  1.4.10

所以个人爱好,格式推荐json格式配置。

配置文件编码禁忌
  • 读取配置的代码和业务代码耦合在一起

大忌!千万千万不要!如下,业务代码里面出现了json的配置代码。

public void someServiceCode() {
  // 使用json配置,这里读取到了配置文件,返回的是json格式
  JSonObject config = readJsonConfig();

  // 如果某个配置了
  if(config.getBoolean("somekey")){
    // dosomething
  }
  else{

  }
}
  • 开发初期就定配置文件

毫无意义,还导致频繁改动!先定义bean,改bean简单多了。我的习惯是转测试前一天才生成配置文件。

  • 手工编写配置文件

应该先写完代码,根据代码生成配置序列化成对应的格式,而不是自己编写配置文件然后用代码读出来。不要做反了。

重要思想

最主要的思想是,不要直接和配置文件发生关系,一定要有第三者(这里是配置的bean)。你可以说是中间件,中介都行。 否则,一开始说用xml配置,后面说用json配置,再后面说配置放数据库?这算不算需求变更?你们说算不算?算吗?不算吗?何必这么认真呢?只是1,2行代码的问题,这里使用xml还是json,代码修改量是2行。而且改了测试的话,写个main函数或者junit测试即可,不需要测试业务,工程都不用起,你自己算算节约多少时间。

另外,代码里面是使用spring的习惯,没有spring也是一样的,或者配置的bean你不用spring注入,而用工具类获取也是一样,区别不大。

=====GITHUB地址=====

所有的代码细节都在已经上了github了,地址 xwjie/PLMCodeTemplate,欢迎加星。有问题欢迎提出。

觉得有用请点赞加关注,加星,fork,:)

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号