SpringBoot2.x集成Dozer的示例代码

目录
  • 一、引入依赖
  • 二、实体类
  • 三、编写配置文件
  • 四、创建测试类
  • 五、Dozer的基本使用
  • 代码示例

Dozer是Java Bean到Java Bean的映射器,它以递归的方式将数据从一个对象复制到另一个对象。通常,这些Java Bean将具有不同的复杂类型。它支持简单属性映射,复杂类型映射,双向映射,隐式显式映射,以及递归映射。这包括映射需要在元素层面上进行映射的集合属性。可以将Dozer用作两个对象之间属性转换的工具,使用它可以很方便地对项目中的DO、DTO、VO进行相互转换。

本文主要对SpringBoot2.x集成Dozer及其基本使用进行简单总结,其中SpringBoot使用的2.4.5版本。

一、引入依赖

<dependency>
    <groupId>com.github.dozermapper</groupId>
    <artifactId>dozer-spring-boot-starter</artifactId>
    <version>6.5.0</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
<!-- lombok插件 -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.8</version>
</dependency>

二、实体类

User类:

package com.rtxtitanv.model;

import lombok.Data;
import lombok.experimental.Accessors;

import java.util.Date;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.model.User
 * @description User
 * @date 2021/8/18 16:45
 */
@Accessors(chain = true)
@Data
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String gender;
    private String email;
    private Date birthday;
}

UserDTO类:

package com.rtxtitanv.model;

import lombok.Data;
import lombok.experimental.Accessors;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.model.UserDTO
 * @description UserDTO
 * @date 2021/8/18 16:45
 */
@Accessors(chain = true)
@Data
public class UserDTO {
    private Long userId;
    private String userName;
    private Integer userAge;
    private String gender;
    private String email;
    private String birthday;
}

三、编写配置文件

resources/dozer/目录下创建Dozer的全局配置文件global-dozer.xml

<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns="http://dozermapper.github.io/schema/bean-mapping"
          xsi:schemaLocation="http://dozermapper.github.io/schema/bean-mapping
                              http://dozermapper.github.io/schema/bean-mapping.xsd">
    <!-- 全局配置:<date-format>表示日期格式 -->
    <configuration>
        <date-format>yyyy/MM/dd HH:mm:ss</date-format>
    </configuration>
</mappings>

resources/dozer/目录下创建Dozer的映射文件dozer.xml

<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns="http://dozermapper.github.io/schema/bean-mapping"
          xsi:schemaLocation="http://dozermapper.github.io/schema/bean-mapping
                             http://dozermapper.github.io/schema/bean-mapping.xsd">
    <!-- 描述两个类中属性的对应关系,对于两个类中同名的属性可以不映射 -->
    <mapping date-format="yyyy/MM/dd HH:mm:ss">
        <class-a>com.rtxtitanv.model.User</class-a>
        <class-b>com.rtxtitanv.model.UserDTO</class-b>
        <field>
            <a>id</a>
            <b>userId</b>
        </field>
        <field>
            <a>name</a>
            <b>userName</b>
        </field>
        <field>
            <a>age</a>
            <b>userAge</b>
        </field>
    </mapping>
</mappings>

resources目录下创建application.yml配置文件:

dozer:
  # 指定Dozer的映射配置文件位置
  mapping-files:
    - classpath:dozer/global-dozer.xml
    - classpath:dozer/dozer.xml

四、创建测试类

创建单元测试类DozerTest

package com.rtxtitanv;

import com.github.dozermapper.core.Mapper;
import com.rtxtitanv.model.*;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.DozerTest
 * @description Dozer单元测试类
 * @date 2021/8/18 16:44
 */
@Slf4j
@SpringBootTest
class DozerTest {

    @Resource
    private Mapper mapper;

    @Test
    void test1() {
        UserDTO userDTO = new UserDTO();
        userDTO.setUserId(1L).setUserName("ZhaoYun").setGender("男").setUserAge(20).setEmail("zhaoyun@xxx.com")
            .setBirthday("2001/8/18 18:05:32");
        User user = mapper.map(userDTO, User.class);
        log.info(user.toString());
        UserDTO userDTO2 = mapper.map(user, UserDTO.class);
        log.info(userDTO2.toString());
    }
}

执行测试方法,发现User和UserDTO相互转换成功:

五、Dozer的基本使用

下面对Dozer的一些基本使用进行总结。Dozer支持注解、API、XML三种映射配置方式,XML方式比较常用,前面使用的也是XML映射配置方式。XML映射配置中mapping元素的map-id属性可以设置该映射的标识,通过此标识来确定使用该映射关系。

dozer.xml中新增以下配置:

<!-- map-id:映射的标识,通过此标识来确定使用该映射关系 -->
<mapping date-format="yyyy/MM/dd HH:mm:ss" map-id="user">
    <class-a>com.rtxtitanv.model.User</class-a>
    <class-b>com.rtxtitanv.model.UserDTO</class-b>
    <field>
        <a>id</a>
        <b>userId</b>
    </field>
    <field>
        <a>name</a>
        <b>userName</b>
    </field>
    <field>
        <a>age</a>
        <b>userAge</b>
    </field>
</mapping>

新增以下测试方法:

@Test
void test2() {
    UserDTO userDTO = new UserDTO();
    userDTO.setUserId(2L).setUserName("MaChao").setGender("男").setUserAge(21).setEmail("machao@xxx.com")
        .setBirthday("2000/6/15 08:45:20");
    User user = mapper.map(userDTO, User.class, "user");
    log.info(user.toString());
}

执行测试方法,发现转换成功:

在调用map方法时也可以直接指定要转换的目标对象。新增以下测试方法:

@Test
void test3() {
    UserDTO userDTO = new UserDTO();
    userDTO.setUserId(3L).setUserName("LiuBei").setGender("男").setUserAge(30).setEmail("liubei@xxx.com")
        .setBirthday("1991/1/20 13:36:55");
    User user = new User();
    mapper.map(userDTO, user, "user");
    log.info(user.toString());
}

执行测试方法,发现转换成功:

通过field-exclude标签可以设置不想进行转换的属性,这些属性在进行转换时会被自动排除。

dozer.xml中新增以下配置:

<mapping date-format="yyyy/MM/dd HH:mm:ss" map-id="user-exclude">
    <class-a>com.rtxtitanv.model.User</class-a>
    <class-b>com.rtxtitanv.model.UserDTO</class-b>
    <field>
        <a>id</a>
        <b>userId</b>
    </field>
    <field>
        <a>name</a>
        <b>userName</b>
    </field>
    <field>
        <a>age</a>
        <b>userAge</b>
    </field>
    <field-exclude>
        <a>email</a>
        <b>email</b>
    </field-exclude>
</mapping>

新增以下测试方法:

@Test
void test4() {
    UserDTO userDTO = new UserDTO();
    userDTO.setUserId(1L).setUserName("ZhaoYun").setGender("男").setUserAge(20).setEmail("zhaoyun@xxx.com")
        .setBirthday("2001/8/18 18:05:32");
    User user = mapper.map(userDTO, User.class, "user-exclude");
    log.info(user.toString());
}

执行测试方法,发现email属性被成功排除:

Dozer中的映射方式默认都是双向映射,如果想让转换不可逆,即只需要单向转换,可以设置mapping元素的type属性为one-way来开启单向映射。

dozer.xml中新增以下配置:

<!-- type="one-way"将映射设置为单向映射 -->
<mapping date-format="yyyy/MM/dd HH:mm:ss" map-id="user-oneway" type="one-way">
    <class-a>com.rtxtitanv.model.UserDTO</class-a>
    <class-b>com.rtxtitanv.model.User</class-b>
    <field>
        <a>userId</a>
        <b>id</b>
    </field>
    <field>
        <a>userName</a>
        <b>name</b>
    </field>
    <field>
        <a>userAge</a>
        <b>age</b>
    </field>
</mapping>

新增以下测试方法:

@Test
void test5() {
    UserDTO userDTO = new UserDTO();
    userDTO.setUserId(1L).setUserName("ZhaoYun").setGender("男").setUserAge(20).setEmail("zhaoyun@xxx.com")
        .setBirthday("2001/8/18 18:05:32");
    User user = mapper.map(userDTO, User.class, "user-oneway");
    log.info(user.toString());
    UserDTO userDTO2 = mapper.map(user, UserDTO.class, "user-oneway");
    log.info(userDTO2.toString());
}

执行测试方法,发现只有UserDTO转换为User成功:

当两个实体类中都嵌套有能够互相转换的实体类型属性时,也可以进行相互转换。

创建Order类:

package com.rtxtitanv.model;

import lombok.Data;
import lombok.experimental.Accessors;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.model.Order
 * @description Order
 * @date 2021/8/18 16:45
 */
@Accessors(chain = true)
@Data
public class Order {
    private Long id;
    private String number;
    private String description;
    private User user;
}

创建OrderDTO类:

package com.rtxtitanv.model;

import lombok.Data;
import lombok.experimental.Accessors;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.model.OrderDTO
 * @description OrderDTO
 * @date 2021/8/18 16:45
 */
@Accessors(chain = true)
@Data
public class OrderDTO {
    private Long orderId;
    private String orderNumber;
    private String orderDescription;
    private UserDTO userDTO;
}

dozer.xml中新增以下配置:

<mapping date-format="yyyy/MM/dd HH:mm:ss" map-id="order">
    <class-a>com.rtxtitanv.model.Order</class-a>
    <class-b>com.rtxtitanv.model.OrderDTO</class-b>
    <field>
        <a>id</a>
        <b>orderId</b>
    </field>
    <field>
        <a>number</a>
        <b>orderNumber</b>
    </field>
    <field>
        <a>description</a>
        <b>orderDescription</b>
    </field>
    <field>
        <a>user</a>
        <b>userDTO</b>
    </field>
</mapping>

新增以下测试方法:

@Test
void test6() {
    OrderDTO orderDTO = new OrderDTO();
    UserDTO userDTO = new UserDTO().setUserId(6L).setUserName("DiaoChan").setGender("女").setUserAge(18)
        .setEmail("diaochan@xxx.com").setBirthday("2003/12/27 23:10:36");
    orderDTO.setOrderId(1L).setOrderNumber("78956328").setOrderDescription("二两麻辣牛肉面").setUserDTO(userDTO);
    Order order = mapper.map(orderDTO, Order.class, "order");
    log.info(order.toString());
    OrderDTO orderDTO2 = mapper.map(order, OrderDTO.class, "order");
    log.info(orderDTO2.toString());
}

执行测试方法,发现Order和OrderDTO相互转换成功:

Dozer还可以对深层属性进行映射,即深度映射。例如一个对象中的String类型属性可以与另一个对象中嵌套的对象的属性进行映射。

创建UserInfo类:

package com.rtxtitanv.model;

import lombok.Data;
import lombok.experimental.Accessors;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.model.UserInfo
 * @description UserInfo
 * @date 2021/8/18 16:45
 */
@Accessors(chain = true)
@Data
public class UserInfo {
    private String gender;
    private String email;
    private String birthday;
}

创建UserInfoDTO类:

package com.rtxtitanv.model;

import lombok.Data;
import lombok.experimental.Accessors;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.model.UserInfoDTO
 * @description UserInfoDTO
 * @date 2021/8/18 16:45
 */
@Accessors(chain = true)
@Data
public class UserInfoDTO {
    private Long userId;
    private String userName;
    private Integer userAge;
    private UserInfo userInfo;
}

dozer.xml中新增以下配置:

<mapping date-format="yyyy/MM/dd HH:mm:ss" map-id="user-deep-mapping">
    <class-a>com.rtxtitanv.model.UserInfoDTO</class-a>
    <class-b>com.rtxtitanv.model.User</class-b>
    <field>
        <a>userId</a>
        <b>id</b>
    </field>
    <field>
        <a>userName</a>
        <b>name</b>
    </field>
    <field>
        <a>userAge</a>
        <b>age</b>
    </field>
    <field>
        <a>userInfo.gender</a>
        <b>gender</b>
    </field>
    <field>
        <a>userInfo.email</a>
        <b>email</b>
    </field>
    <field>
        <a>userInfo.birthday</a>
        <b>birthday</b>
    </field>
</mapping>

新增以下测试方法:

@Test
void test7() {
    UserInfo userInfo = new UserInfo();
    userInfo.setGender("男").setEmail("zhaoyun@xxx.com").setBirthday("2001/8/18 18:05:32");
    UserInfoDTO userInfoDTO = new UserInfoDTO();
    userInfoDTO.setUserId(1L).setUserName("ZhaoYun").setUserAge(20).setUserInfo(userInfo);
    User user = mapper.map(userInfoDTO, User.class, "user-deep-mapping");
    log.info(user.toString());
}

执行测试方法,发现UserInfoDTO成功转换为User:

Dozer还支持注解方式配置映射,使用@Mapping注解可以进行一些简单的映射处理。

创建UserEntity类:

package com.rtxtitanv.model;

import com.github.dozermapper.core.Mapping;
import lombok.Data;
import lombok.experimental.Accessors;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.model.UserEntity
 * @description UserEntity
 * @date 2021/8/18 16:45
 */
@Accessors(chain = true)
@Data
public class UserEntity {
    @Mapping(value = "userId")
    private Long id;
    @Mapping(value = "userName")
    private String name;
    @Mapping(value = "userAge")
    private Integer age;
    private String gender;
    private String email;
    private String birthday;
}

@Mapping只需要在源类中指定目标类中对应的属性即可。

创建UserVO类:

package com.rtxtitanv.model;

import lombok.Data;
import lombok.experimental.Accessors;

import java.util.Date;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.model.UserVO
 * @description UserVO
 * @date 2021/8/18 16:45
 */
@Accessors(chain = true)
@Data
public class UserVO {
    private Long userId;
    private String userName;
    private Integer userAge;
    private String gender;
    private String email;
    private Date birthday;
}

新增以下测试方法:

@Test
void test8() {
    UserEntity userEntity = new UserEntity();
    userEntity.setId(1L).setName("ZhaoYun").setGender("男").setAge(20).setEmail("zhaoyun@xxx.com")
        .setBirthday("2001/8/18 18:05:32");
    UserVO userVO = mapper.map(userEntity, UserVO.class);
    log.info(userVO.toString());
}

执行测试方法,发现转换成功:

代码示例

Github:https://github.com/RtxTitanV/springboot-learning/tree/master/springboot2.x-learning/springboot-dozer

Gitee:https://gitee.com/RtxTitanV/springboot-learning/tree/master/springboot2.x-learning/springboot-dozer

到此这篇关于SpringBoot2.x 集成 Dozer的文章就介绍到这了,更多相关SpringBoot2.x 集成 Dozer内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Spring Boot 集成Mybatis实现主从(多数据源)分离方案示例

    本文将介绍使用Spring Boot集成Mybatis并实现主从库分离的实现(同样适用于多数据源).延续之前的Spring Boot 集成MyBatis.项目还将集成分页插件PageHelper.通用Mapper以及Druid. 新建一个Maven项目,最终项目结构如下: 多数据源注入到sqlSessionFactory POM增加如下依赖: <!--JSON--> <dependency> <groupId>com.fasterxml.jackson.core<

  • 详解spring-boot集成elasticsearch及其简单应用

    介绍 记录将elasticsearch集成到spring boot的过程,以及一些简单的应用和helper类使用. 接入方式 使用spring-boot中的spring-data-elasticsearch,可以使用两种内置客户端接入 1.节点客户端(node client): 配置文件中设置为local:false,节点客户端以无数据节点(node-master或node-client)身份加入集群,换言之,它自己不存储任何数据,但是它知道数据在集群中的具体位置,并且能够直接转发请求到对应的节

  • Spring Boot集成ElasticSearch实现搜索引擎的示例

    Elastic Search是一个开源的,分布式,实时搜索和分析引擎.Spring Boot为Elasticsearch及Spring Data Elasticsearch提供的基于它的抽象提供了基本的配置.Spring Boot提供了一个用于聚集依赖的spring-boot-starter-data-elasticsearch 'StarterPOM'. ElasticSearch作为搜索引擎,我们需要解决2大问题: 1,  如何将被搜索的数据在ES上创建反向索引 2,  Java代码如何与E

  • SpringBoot框架集成token实现登录校验功能

    简介 公司新项目,需要做移动端(Android和IOS),登录模块,两个移动端人员提出用token来校验登录状态,一脸懵懵的,没做过,对于token的基本定义都模棱两可,然后查资料查查查,最终OK完成,写篇博客记录一下 思路: 1.基于session登录 基于session的登录(有回话状态),用户携带账号密码发送请求向服务器,服务器进行判断,成功后将用户信息放入session,用户发送请求判断session中是否有用户信息,有的话放行,没有的话进行拦截,但是考虑到时App产品,牵扯到要判断用户

  • 详解Spring-Boot集成Spring session并存入redis

    spring Session 提供了一套用于管理用户 session 信息的API和实现. Spring Session为企业级Java应用的session管理带来了革新,使得以下的功能更加容易实现: 编写可水平扩展的原生云应用. 将session所保存的状态卸载到特定的外部session存储中,如Redis或Apache Geode中,它们能够以独立于应用服务器的方式提供高质量的集群. 当用户使用WebSocket发送请求的时候,能够保持HttpSession处于活跃状态. 在非Web请求的处

  • Spring Boot Redis 集成配置详解

    spring Boot 熟悉后,集成一个外部扩展是一件很容易的事,集成Redis也很简单,看下面步骤配置: 一.添加pom依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> </dependency> 二.创建 RedisClient.java 注意该类存放的pack

  • Spring Boot集成netty实现客户端服务端交互示例详解

    前言 Netty 是一个高性能的 NIO 网络框架,本文主要给大家介绍了关于SpringBoot集成netty实现客户端服务端交互的相关内容,下面来一起看看详细的介绍吧 看了好几天的netty实战,慢慢摸索,虽然还没有摸着很多门道,但今天还是把之前想加入到项目里的 一些想法实现了,算是有点信心了吧(讲真netty对初学者还真的不是很友好......) 首先,当然是在SpringBoot项目里添加netty的依赖了,注意不要用netty5的依赖,因为已经废弃了 <!--netty--> <

  • spring boot集成pagehelper(两种方式)

    参看了pagehelper-spring-boot,使用起来非常放方便,关于更多PageHelper可以点击https://github.com/pagehelper/Mybatis-PageHelper. 当spring boot集成好mybatis时候需要进行分页,我们首先添加maven支持 <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</a

  • springboot集成mqtt的实践开发

    序 MQTT(Message Queuing Telemetry Transport)是基于二进制消息的发布/订阅编程模式的消息协议,非常适合需要低功耗和网络带宽有限的IoT场景.这里简单介绍一下如何在springboot中集成. maven <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-integration</arti

  • SpringBoot2.x集成Dozer的示例代码

    目录 一.引入依赖 二.实体类 三.编写配置文件 四.创建测试类 五.Dozer的基本使用 代码示例 Dozer是Java Bean到Java Bean的映射器,它以递归的方式将数据从一个对象复制到另一个对象.通常,这些Java Bean将具有不同的复杂类型.它支持简单属性映射,复杂类型映射,双向映射,隐式显式映射,以及递归映射.这包括映射需要在元素层面上进行映射的集合属性.可以将Dozer用作两个对象之间属性转换的工具,使用它可以很方便地对项目中的DO.DTO.VO进行相互转换. 本文主要对S

  • springboot2.0集成rabbitmq的示例代码

    安装rabbitmq 简介: rabbitmq即一个消息队列,主要用来实现应用程序的异步和解耦,消息缓冲,消息分发的作用. 由于rabbitmq依赖于erlang语言,所以先安装erlang: 添加erlang solutions源 $ wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm $ sudo rpm -Uvh erlang-solutions-1.0-1.noarch.rpm $ su

  • SpringBoot 集成 activiti的示例代码

    SpringBoot 集成 activiti  基础环境搭建 添加依赖 <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter-basic</artifactId> <version>6.0.0</version> </dependency> 添加配置文件 server: tomcat: uri-

  • springboot2+es7使用RestHighLevelClient的示例代码

    目录 一.引入依赖jar 二.application.properties配置 三.使用 其它 由于spring和es的集成并不是特别友好,es的高低版本兼容问题.api更新频率高等问题,所以我选择是官网提供的原生Client(RestHighLevelClient),但又不想去关注es的配置类以及和spring的集成配置.jar包冲突等问题,所以使用spring-boot-starter-data-elasticsearch. 一.引入依赖jar         <dependency>  

  • SpringBoot集成JPA的示例代码

    本文介绍了SpringBoot集成JPA的示例代码,分享给大家,具体如下: 1.创建新的maven项目 2. 添加必须的依赖 <!--springboot的必须依赖--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE

  • Spring Boot集成Kafka的示例代码

    本文介绍了Spring Boot集成Kafka的示例代码,分享给大家,也给自己留个笔记 系统环境 使用远程服务器上搭建的kafka服务 Ubuntu 16.04 LTS kafka_2.12-0.11.0.0.tgz zookeeper-3.5.2-alpha.tar.gz 集成过程 1.创建spring boot工程,添加相关依赖: <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&qu

  • SpringBoot集成redis的示例代码

    目录 前言 一.redis是什么 二.集成redis步骤 三.代码演示 前言 redis想必小伙伴们即使没有用过,也是经常听到的,在工作中,redis用到的频率非常高,今天详细介绍一下SpringBoot中的集成步骤 一. redis是什么 用通俗点的话解释,redis就是一个数据库,直接运行在内存中,因此其运行速度相当快,同时其并发能力也非常强.redis是以key-value键值对的形式存在(如:"name":huage),它的key有五种常见类型: String:字符串 Hash

  • 使用Spring Boot集成FastDFS的示例代码

    这篇文章我们介绍如何使用Spring Boot将文件上传到分布式文件系统FastDFS中. 这个项目会在上一个项目的基础上进行构建. 1.pom包配置 我们使用Spring Boot最新版本1.5.9.jdk使用1.8.tomcat8.0. <dependency> <groupId>org.csource</groupId> <artifactId>fastdfs-client-java</artifactId> <version>

  • React Native 集成jpush-react-native的示例代码

    jpush-React-native是极光推送官方维护的一个插件,github地址:https://github.com/jpush/jpush-react-native 一.手动配置 1.集成插件到项目中 npm install jpush-react-native --save rnpm link jpush-react-native Android 使用 android Studio import 你的 react Native 应用(选择你的 React Native 应用所在目录下的

  • RestTemplate集成Ribbbon的示例代码

    上一篇文章我们分析了ribbon的核心原理,接下来我们来看看springcloud是如何集成ribbon的,不同的springcloud的组件(feign,zuul,RestTemplate)集成ribbon有所不同,这篇文章先来看看RestTemplate. RestTemplate的类图如下 HttpAccessor主要根据ClientHttpRequestFactory创建ClientHttpRequest InterceptingHttpAccessor扩展了HttpAccessor,创

随机推荐