美文网首页编程技术Android开发Android知识
web开发 之 Spring常用第三方库(FastJSON Lo

web开发 之 Spring常用第三方库(FastJSON Lo

作者: 诺之林 | 来源:发表于2016-08-21 21:29 被阅读538次

    目录

    引言

    之前两篇文章介绍了Spring以及Spring中MongoDB的使用

    web开发 之 Spring + IntelliJ Idea

    web开发 之 Spring + MongoDB

    本文介绍Spring中常用的两个第三方库

    阿里巴巴出品的FastJSON

    is a Java library that can be used to convert Java Objects into their JSON representation

    它的目标是

    Provide best performance in server side and android client.

    Log4j作者的全新力作LogBack

    reliable, generic, fast and flexible logging library for Java

    LogBack也是Spring官方推荐的Log库, 以替代Apache Log4j2

    创建SpringLibraryJsonLog工程

    大概流程可以参考之前的两篇文章

    New Project -> Spring Initializr -> 设置Name为SpringLibraryJsonLog, Type为Maven Project

    spring-library-json-log_01.png

    -> 接下来要注意的是, 在依赖配置里, 勾选Web, 如下图

    spring-library-json-log_02.png

    -> 然后, 设置Project Name为SpringLibraryJsonLog保存

    -> 最后, 选择运行SpringLibraryJsonLogApplication即可

    添加请求接口

    创建完的项目还是一个空的项目, 我们来添加两个接口("/json" "/log"), 这两个接口只返回String信息以确认连接成功, 其中Method=GET

    package com.example;
    
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class JsonController {
    
        @RequestMapping(value = "/json", method = RequestMethod.GET)
        @ResponseBody
        public String json() {
            return "json";
        }
    
    }
    

    以及

    package com.example;
    
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class LogController {
    
        @RequestMapping(value = "/log", method = RequestMethod.GET)
        @ResponseBody
        public String json() {
            return "log";
        }
    
    }
    

    这两个接口的代码很简单, 在此也不做过多解释了

    FastJSON

    JSON和Object的转换现在已经是开发的标配了

    我们这里选择阿里巴巴出品的FastJSON, 因为它的中文文档比较完善

    首先, 我们需要在工程的依赖中引入FastJSON, 在pom.xml中添加如下依赖

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.11</version>
    </dependency>
    

    修改pom.xml记得import project以使依赖生效: View -> Tool Windows -> Maven Projects -> Reimport All Maven Projects

    然后, 我们定义一个Customer Bean

    package com.example;
    
    import com.alibaba.fastjson.annotation.JSONField;
    
    public class Customer {
    
        private String firstName;
        @JSONField(name = "last")
        private String lastName;
    
        public Customer() {}
    
        public Customer(String firstName, String lastName) {
            this.firstName = firstName;
            this.lastName = lastName;
        }
    
        public String getLastName() {
            return lastName;
        }
    
        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
    
        public String getFirstName() {
            return firstName;
        }
    
        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }
    
        @Override
        public String toString() {
            return String.format("Customer[firstName='%s', lastName='%s']", firstName, lastName);
        }
    
    }
    

    其中的@JSONField的用法详见这里

    最后, 在JsonController中添加FastJSON的使用

    package com.example;
    
    import com.alibaba.fastjson.JSON;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class JsonController {
    
        @RequestMapping(value = "/json", method = RequestMethod.GET)
        @ResponseBody
        public String json() {
            return JSON.toJSONString(new Customer("xiao", "ming"));
        }
    
    }
    

    我们再次访问该接口(/json), 此时获取的返回值是

    spring-library-json-log_03.png

    这里使用的HTTP Client工具是Postman

    LogBack

    Logback比Log4j更新, 它被视为是log4j的替代者

    它比log4j的性能更好, 而且更完整地实现了slf4j的接口, 并且自带了更多的功能

    比如自动压缩日志, 更多的filter等

    首先, 我们需要在工程的依赖中引入LogBack, 在pom.xml中添加如下依赖

    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.1.4</version>
    </dependency>
    
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
        <version>1.1.4</version>
    </dependency>
    

    import完依赖后, 在LogController中添加Logback的使用

    package com.example;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class LogController {
    
        @RequestMapping(value = "/log", method = RequestMethod.GET)
        @ResponseBody
        public String log() {
            Logger logger = LoggerFactory.getLogger(LogController.class);
            logger.info("slf4j info");
            logger.warn("slf4j warn");
            logger.error("slf4j error");
            return "log";
        }
    
    }
    

    我们再次访问该接口(/log), 此时Idea控制台打印输出如下

    spring-library-json-log_04.png

    这里打印输出的配色, 是因为安装了Idea插件GrepConsole

    那么我们如何配置Log输出的级别, 以及打印Log至指定文件中呢?

    答案就是通过LogBack的配置文件logback.xml来设置

    在resources文件夹下创建logback.xml文件(LogBack会自动寻找该目录下的配置文件)

    spring-library-json-log_05.png

    logback.xml的详细配置如下

    <!-- Logback configuration. See http://logback.qos.ch/manual/index.html -->
    <configuration scan="true" scanPeriod="10 seconds">
    
        <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <encoder>
                <pattern>
                    [ %-5level] [%date{yyyy-MM-dd HH:mm:ss}] %logger{96} [%line] - %msg%n
                </pattern>
                <charset>UTF-8</charset>
            </encoder>
    
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>logs/SpringLibraryJsonLog-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
                <timeBasedFileNamingAndTriggeringPolicy
                        class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>64 MB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
            </rollingPolicy>
    
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>WARN</level>
            </filter>
    
            <!-- Safely log to the same file from multiple JVMs .Degrades performance! -->
            <prudent>true</prudent>
        </appender>
    
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>
                    [ %-5level] [%date{yyyy-MM-dd HH:mm:ss}] %logger{96} [%line] - %msg%n
                </pattern>
                <charset>GBK</charset>
            </encoder>
    
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>INFO</level>
            </filter>
        </appender>
    
        <!-- Enable FILE and STDOUT appenders for all log messages.
             By default, only log at level INFO and above. -->
        <root level="DEBUG">
            <appender-ref ref="FILE"/>
            <appender-ref ref="STDOUT"/>
        </root>
    
        <!-- For loggers in the these namespaces, log at all levels. -->
        <logger name="pedestal" level="ALL"/>
        <logger name="hammock-cafe" level="ALL"/>
        <logger name="user" level="ALL"/>
    </configuration>
    

    重新运行工程, 再次访问该接口(/log), 此时Idea控制台打印输出如下

    spring-library-json-log_06.png

    (上述logback.xml文件, 配置了输出到console的log级别为INFO及以上)

    同时, 在工程的根目录的logs文件夹下, 会有输出到文件的log信息

    [ WARN ] [2016-08-19 18:39:42] com.example.LogController [18] - slf4j warn
    [ ERROR] [2016-08-19 18:39:42] com.example.LogController [19] - slf4j error
    

    (上述logback.xml文件, 配置了输出到文件的log级别为WARN及以上)

    小结

    本文先解释了Spring开发中常用的JSON和Log库

    后续还有更多更精彩的内容(其他常用库, 以及部署等), 敬请期待, 如果有什么问题和指正, 欢迎留言

    修订

    修订于2016年8月28日

    Spring中现在已经默认集成了Jackson做序列化操作

    关于Jackson和FastJSON的对比和争论大家可以自行"谷哥", 本文就不掺和了

    我们来看下使用Jackson如何实现上述FastJSON的需求

    首先是Bean的定义

    package com.example;
    
    import com.fasterxml.jackson.annotation.JsonGetter;
    
    public class Customer2 {
    
        private String firstName;
        private String lastName;
    
        public Customer2() {}
    
        public Customer2(String firstName, String lastName) {
            this.firstName = firstName;
            this.lastName = lastName;
        }
    
        @JsonGetter("last")
        public String getLastName() {
            return lastName;
        }
    
        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
    
        public String getFirstName() {
            return firstName;
        }
    
        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }
    
        @Override
        public String toString() {
            return String.format("Customer[firstName='%s', lastName='%s']", firstName, lastName);
        }
    
    }
    

    接着是使用Jackson

    ObjectMapper mapper = new ObjectMapper();
    try {
        String json = mapper.writeValueAsString(new Customer2("xiao", "jackson"));
        logger.info(json);
    } catch (JsonProcessingException e) {
        logger.error("error");
    }
    

    打印输出如下

    {
      "firstName": "xiao",
      "last": "jackson"
    }
    

    关于Jackson的更过解释, 可以参考Jackson Annotations

    更多文章, 请支持我的个人博客

    相关文章

      网友评论

      • Rick____:为啥fastjson是标配。Jackjson不好用么?
        诺之林:@ZeroFF 关于spring标配jackson我之前不了解哈, 多谢指教
        Rick____:@诺之林_ 其实spring他的标配是jacksjson。:scream:我也搞过安卓。我觉得还是不要因为一个功能引入一个包。要不是后来就会越来越臃肿了。
        诺之林:@ZeroFF 之前android开发中接触过fastjson, 所以这里仍然使用了它, 算是偷懒了, 后续加上jackson的例子, 我会重新更新下这篇文章哈

      本文标题:web开发 之 Spring常用第三方库(FastJSON Lo

      本文链接:https://www.haomeiwen.com/subject/yrybsttx.html