1.第一天

1.1 maven的作用是什么?

  • 依赖管理:对jar包的管理
  • 一键构建:通过一个命令来完成项目的构建过程

1.2 maven的常见命令有哪些? 每个命令对应的作用是什么?

  • 清理 (clean) 清理上一次构建过程产生的文件,就是把target目录删除清理掉
  • 编译 (compile ) 将正式的java文件,也就是对main目录下的java文件编译
  • 测试 (test ) 编译并执行test下的文件
  • 打包 (package) 将正式的文件打包
  • 安装 (install) 将打好的包放入到本地仓库
  • 部署 (deploy) 将打好的包放入到私fu

1.3 maven有几套生命周期? 每套生命周期中分别由哪些主要命令?同一套生命周期中的命令有什么特点?

  1. maven有三套生命周期
  2. 生命周期中的命令分别是:
    Clean Lifecycle:在真正的构建之前进行一些清理工作
    包含的命令有:pre-clean clean post-clean
    Default Lifecycle:构建的核心部分
    包含的命令有:compile test package install deploy
    Site Lifecycle:生成项目报告,站点,发布站点。
    包含的命令有:pre-site site post-site site-deploy
  3. 位于同一个生命周期中的命令的执行特点: 执行后面的命令,前面的命令会自动执行

1.4 maven有几种仓库? 他们之间的调用关系是什么? 哪种仓库是必不可少的?

  1. maven有三种仓库:
    本地仓库 位于开发者电脑
    远程仓库 位于公司内网服务器
    中央仓库 位于公网
  2. 调用顺序:
    1.如果有私fu: 程序-->本地仓库-->私fu-->中央仓库
    2.如果没有私fu: 程序-->本地仓库-->中央仓库
  3. 本地仓库是必须要有的

1.5 在maven中, 一个jar包使用哪几个标签表示? maven的打包方式有几种?

  1. 一个jar包的标签,主要有三部分组成:
    1. groupId: 用于标识当前程序的所属公司, 一般为公司域名倒过来写
    2. artifactId: 用于标识当前项目名称
    3. version: 用于标识当前项目版本
  2. maven打包一般有三种:
    jar: java工程
    war: web工程
    pom: 父工程

1.6 什么是maven的依赖冲突? 有几种解决方案?

  1. maven在依赖传递的过程中,有可能会同时依赖到jar包的多个版本,这样的话会出现版本冲突问题
  2. 解决方案有4种:
  • 第一声明优先原则: 在pom文件定义依赖,先声明的依赖为准
  • 路径近者优先原则: 从依赖程序开始算起,到被依赖的程序,以路径短的为准
  • 依赖排除: 在依赖引入的过程中, 通过exclusions标签排掉指定的跟随依赖
  • 版本锁定: 直接锁定版本来确定依赖构件的版本(经常在企业中用)

1.7 什么是SaaS平台? 它的优点是什么?

  1. SaaS, 就是软件即服务的意思,它是一种通过Internet提供软件的模式
    厂商将软件统一部署在自己的服务器上,客户可以根据自己实际情况告诉厂商自己需要什么提供什么样的服务并且按照服务的多少来支付费用
    也就是说:用户购买的是基于web的软件服务,而不是购买来软件,然后将软件安装在自己的电脑上用

  2. SaaS优点:
    1:能够降低企业的成本,按需要购买,不需要关注软件的开发与维护
    2:由于SaaS部署在云端,软件迭代更新速度加快
    3:支持远程办公:将数据存储到云端后,用户可以通过Internet访问其信息

2.第二天

2.1 全局异常处理器配置有几种方式? 如果使用注解的话,用到的注解是哪几个? 如何在一个类中处理多个异常?

  1. 全局处理异常有两种方式:
    一种是我们自己自定义一个异常处理器类来实现HandelrExceptionResolver接口,并在类中实现异常的处理方法
    另一种是注解方式,需要我们自定义一个普通类,并在类上标注@ControllerAdvice注解, 然后在类中实现异常处理的方法,并在方法上标注@ExceptionHandler注解。
  2. 使用注解的方式来处理全局异常的话,主要用到的是两个注解
    @ControllerAdvice注解标注在类上,标识这是一个异常处理器的类
    @ExceptionHandler注解标注在异常处理器类中的方法上, 可以用于指定被标注的方法用于处理哪一类异常
  3. @ExceptionHandler注解支持一个value属性, 可以用它来定义被标注方法能够处理的异常类型
    我们只需要在异常处理类中定义多个异常处理的方法,然后每个方法上面使用@ExceptionHandler指定具体处理的异常类型即可

2.2 谈一谈PageHelper的分页原理
首先,pagehelper将前台传来的参数封装到page的对象中,接着将page的副本存放入ThreadLoacl中,这样应该是保证分页的时候,参数互不影响,接着利用了mybatis提供的拦截器,取得ThreadLocal的值,PageHelper利用这一点通过拦截器获取到同一线程中的预编译好的SQL语句之后将SQL语句包装成具有分页功能的SQL语句,最后再次赋值给下一步操作,就实现了分页。

2.3 使用了PageHelper分页之后, 查询的sql语句后面还可不可以加; 为什么?
使用了PageHelper分页之后, 查询的sql语句后面就不可以再加;
因为pagehelper底层是基于拦截器来实现分页的, 它会首先拦截到我们编写的查询所有的SQL语句(select * from tableName), 然后再后面拼接limit .....实现分页
类似于这样: select * from tableName limit .....
如果此时我们的SQL语句中有; 那么结果就变成了这样:select * from tableName; limit ..... 很明显这是一条错误的SQL

2.4 PageHelper在使用的时候,如果PageHelper.startPage()方法在查询列表之后执行, 会出现什么问题?
出现的问题是: 不会实现分页,而是查询到所有数据
因为PageHelper.start()方法是创建一个page对象,并且设置3个属性初始化page, 然后将page绑定到当前线程;
而分页方法在执行时会先判断当前线程是否有page对象, 有才会执行分页, 没有就查询所有

3.第三天

3.1 谈一谈你对多租户系统数据库设计的认识,你们系统采用的是哪一种方式? 为什么这样选择?

  1. 多租户系统数据库设计方案分为三种:
    第一种是独立服务器,独立数据库: 一个用户用一个服务器,这种模式数据安全性和隔离性非常好,但是开发和维护成本很高
    第二种是共享服务器,独立数据库: 所有用户公用同一个服务器,但是每个用户用一个独立的数据库
    第三种是共享服务器,共享数据库: 就是所有用户公用一台服务器和数据库,然后通过特定标识去区分不同的租户, 这种模式开发和维护成本最低,但是数据安全性和隔离性也最低
  2. 我们的项目目前采用的是第三种方式, 主要考虑到项目初期资金不是特别充足;
    但是项目二期计划采用第一种和第三种两种方式相结合的方式来做,公司会设置vip用户,为他们定制第一种方式; 普通用户使用第三种方式

3.2 什么是数据库的三范式? 什么是数据库的反三范式? 两者之间如何选择?

  1. 数据库的三范式就是一种数据库库设计规则,主要目的是用来减少数据的冗余,提高硬盘利用率的。
    第一范式: 确保每一列的原子性, 也就是每列不可再拆分
    第二范式: 在第一范式的基础上, 保证每张表只描述一件事
    第三范式: 在第二范式的基础上, 消除推导关系,消除相关依赖, 就是能通过其他字段推导出来的字段就不要再单独出现一列
  2. 数据库反三范式是基于第三范式所调整的,它是通过添加一些冗余字段, 来提供我们数据的查询效率
  3. 在开发中我们灵活选择, 如果对查询效率无要求,为了节省空间和简化增删改操作,可以选择遵循三范式; 如果非常注重查询效率, 就适当选择反三范式.
    我们的项目中在购销合同--货物--附件中都采用了反三范式的设计(为了提高查询效率加入'金额amount和TotalAmount'字段)

3.3 当数据表之间存在外键约束时, 哪张表的数据不能随表删除? 哪张表的数据不能随便添加?

  • 当表之间存在外键约束时,主表也就是约束别人的表不能随便删除,从表也就是被别人约束的表 不能随便增加。
    举个例子,有一个员工表和部门表,部门表作为主表,员工表作为从表添加外键约束,部门表不能随便删除,员工表不能随便添加,例如添加不存在的部门。

3.4 谈一谈,当删除一个含有子部门的部门时,会出现什么样的问题? 处理的方案有几种?

  1. 删除一个含有子部门的部门时会报错,由于部门表是自关联的设计,就表示我们在直接删除父部门时成功了,子部门数据其实就变成了孤儿,由于外键会约束不能删除
  2. 有两种解决方案:
    第一种就是在删除部门数据之前可以做一个判断,如果该部门有子部门,做个提示,不允许删除。
    第二种是级联的操作,就是删除一个部门的时候连同子部门一起删除,这个需要在数据库中将外键关联改为CASCADE。

3.5 谈一谈密码加密的时候,加盐的目的是什么?

  1. 我们现在项目中用到的加密技术是Md5, 它有个特性就是对一个字符串多次加密之后的结果是一致的, 这样的话就很容易被别人猜到密码
  2. 加盐就是在加密的时候掺入一些字符, 即:保证同一个字符串在加密过程中, 只要盐不同, 那得到的结果也会不同, 这样就增加密码破解的难度

3.6 谈一谈你知道的系统权限设计模型有几种? 分别是什么? 应该如何选择?

  1. 我在企业中接触过的系统权限设计主要有下面三类:
    1. 用户---权限 (直接为用户绑定权限)
    2. 用户---角色---权限 (为用户绑定角色, 在为角色绑定权限)
    3. 用户---用户组---角色---权限 (给用户分配用户组, 给用户组绑定角色, 给角色绑定权限)
  2. 目前大部分系统用的都是第二种(RBAC), 至于如何选择主要是看系统的用户和权限数量
    如果系统用户量较少, 权限也较简单, 采用第一种
    如果系统用户量较多, 权限也比较繁杂, 采用第二种或第三种

3.7 谈一下什么是RBAC,它涉及到的表有几张? 表之间的关系分别是什么?

  • RBAC说的是基于角色的权限访问控制.
  • 它涉及到五张表:用户表,角色表,权限表,还有用户表与角色表,角色表和权限表的中间表
    用户表和角色表,角色表和权限表之间都是多对多的,所以中间都加了中间表

4.第四天

4.1 聊一聊你们项目中ZTREE的使用场景? 说一说你知道的ZTREE的功能

  1. 我们这个项目ZTREE主要是使用在用户分配权限时候的权限展示页面上,
  2. 我所了解的ZTree是一个依靠jQuery实现的多功能树插件。它的主要功能:
    1. 灵活的根据JSON数据展示树形结构
    2. 支持节点的单选/ 复选 / 拖拽 / 编辑

4.2 你们平台的用户分为几类? 每类用户的职责是什么? 程序中是如何控制他们的权限的

  1. 我们这个平台主要是包含三类用户
    SaaS管理员: 这个是属于我们SaaS系统的,主要责任是维护SaaS管理模块
    企业管理员: 这个是具体属于某个企业的,主要责任是维护企业相关模块
    企业级普通员工: 也是属于某个企业的,主要责任是负责维护企业中某块信息的维护。
  2. 控制权限大致分为两种情况,
    第一种是管理员(包括SaaS管理员和企业管理员)的权限,因为这两种身份特殊性,他们的权限也是固定的, 所以我们会在权限表中设置一个字段来标识出他们的权限
    第二种是企业普通员工的权限,每个员工的权限都是由管理员来分配的, 都不一样, 所以考虑到复杂性,我们是通过RBAC权限模型来管理的

4.3 说一下SpringAop的使用场景? 具体说说你们项目中的日志是如何记录的?

  1. SpringAOP是面向切面编程思想的一个具体实现, 主要用来处理一类公共问题, 在公司中的主要有下面几个应用场景:
    1. 事务(直接使用了Spring的声明式事务)
    2. 日志
    3. 性能分析
  2. 我们这个项目运用了AOP来实现日志记录,大体上分三步:
    第一步是确定目标对象: 我们是将所有的Controller层的类作为目标对象
    第二步是编写增强对象: 自定义了一个类, 在类中定义了一个环绕通知的方法, 在方法中记录切点的执行时间/操作人/操作动作等等信息
    第三步是配置切面:使用注解的方式配置了切点和增强的执行顺序

5.第五天

5.1 你们项目为什么shiro框架? shiro框架的作用有哪些? shiro框架底层是基于什么实现的?

  1. 当前比较流行的框架有两个: Apache的shiro和spring的spring Security, shiro相对于spring Security来说配置比较简单, 使用更加方便,而且足以满足我们的项目需求
  2. shiro是一个安全框架,主要的作用是: 认证,授权,加密及会话管理, 当然他也支持跟其他的组件进行集成
  3. shiro框架底层主要是一系列过滤器在工作

5.2 说一下认证和授权的区别是什么

  • 认证的意思是 判断当前访问用户是不是本系统的人, 是就允许访问, 不是就跳转登录页面
  • 授权的意思是 当系统用户访问某个资源的时候, 判断下用户是否有对应资源的访问权限, 有就放行,没有提示无权限访问

5.3 shiro框架默认提供了几个过滤器? 你们项目中用到了几个? 他们几个在配置的时候有什么需要注意的吗? 如果顺序不会会出现什么情况?

  1. 默认提供了10个过滤器,我们项目中主要用到了anno(未认证访问),authc(认证后访问),perms(指定权限后访问)几个
  2. 他们配置的时候需要注意下顺序: anno--->perms--->authc, 如果配置顺序不对, 极有可能出现登录不了或者权限控制不住的情况

5.4 在项目中,一般哪些路径会配置为anno? 配置为了authc,会出现什么情况?

  1. 在项目中,一般配置为anno的路径为:1) 静态资源; 2) login.jsp; 3) login.do
  2. 如果将静态资源或login.jsp配置为authc, 会导致资源访问不了; 如果将login.do配置为authc, 会导致提交登录请求的时候,直接进行认证过滤, 跳转回login.jsp页面

5.5 简单说一下shiro的核心组件,每个组件的作用是什么? 如果可以的话,你还知道其他组件吗?

shiro的核心组件:

  • SecurityManager:安全管理器,即所有与安全有关的操作都会与SecurityManager交互;且它管理着所有Subject;它是Shiro的核心,它负责与后边介绍的其他组件进行交互,我觉得可以把它看做SpringMVC中的DispatcherServlet前端控制器。
  • Subject:主体,所有Subject都绑定到SecurityManager,与Subject的所有交互都会委托给SecurityManager;可以把Subject认为是一个门面;SecurityManager才是实际的执行者;
  • Realm:域,Shiro从从Realm获取安全数据(如用户、角色、权限),就是说SecurityManager要验证用户身份,那么它需要从Realm获取相应的用户进行比较以确定用户身份是否合法;也需要从Realm得到用户相应的角色/权限进行验证用户是否能进行操作;可以把Realm看成DataSource,即安全数据源。
  • Authenticator:认证器,负责主体认证的,如果用户觉得Shiro默认的不好,可以自定义实现;其需要认证策略(Authentication Strategy),说白了就是什么情况下算用户认证通过了。
  • Authrizer:授权器,或者访问控制器,用来决定主体是否有权限进行相应的操作;即控制着用户能访问应用中的哪些功能。
  • SessionManager:Session管理器,Session呢,通过SessionManager去管理它的生命周期,而Shiro并不仅仅可以用在Web环境,也可以用在如普通的JavaSE环境、EJB等环境;所以呢,Shiro就抽象了一个自己的Session来管理主体与应用之间交互的数据。
  • SessionDAO:所谓DAO,数据访问对象,用于会话的CRUD,比如我们想把Session保存到数据库,那么可以实现自己的SessionDAO,通过如JDBC写到数据库;比如想把Session放到Memcached中,可以实现自己的Memcached SessionDAO;另外SessionDAO中可以使用Cache进行缓存,以提高性能;
  • CacheManager:缓存控制器,来管理如用户、角色、权限等的缓存的;因为这些数据基本上很少去改变,放到缓存中后可以提高访问的性能。
  • Cryptography:密码模块,Shiro提高了一些常见的加密组件用于如密码加密/解密的。

5.6 说一下shiro的认证流程? 再说一下shiro的授权流程?

  1. shiro的认证流程:

    1. 当用户点击登录后,将用户名和密码封装成Token,然后调用Subject的login方法将Token传给SecurityManager
    2. 安全管理器拿到信息后,会调用Relam去数据库查询用户信息,然后Relam将查询到的信息返回给SecurityManager
    3. SecurityManager拿到数据后判断,如果为空就会抛出异常
    4. 不为空会通过内置的密码比对器对Token的信息与数据库中的密码比对,密码不一样,抛出异常,密码一样,登录成功,将用户信息写入回话中,
    5. 我们后台接收如果有异常,登录失败,没有则登录成功。
    6. 从Subject中提取用户信息。
  2. shiro授权流程:

    1. 首先我们先在配置文件中定义好每个资源被访问需要的权限标识
    2. 当用户想要访问某一资源时,在用户访问资源之前,SecurityManager会调用Realm去数据库查询当前用户的现有权限
    3. 然后拿想要访问资源的权限跟查询到的权限做对比,如果有就放行,没有跳转到无权限页面。

5.7 shiro的授权数据可以缓存吗? 如何实现呢? 可以缓存到外部系统吗,比如说redis, 怎么实现?

  1. 可以缓存,通过在xml中配置缓存管理器实现,配置一个缓存管理器,然后将缓存管理器交给SecurityManager管理,实现缓存
  2. 可以使用redis,需要自定义一个缓存管理

5.8 什么是粗粒度和细粒度权限?你们系统中是如何实现这两种权限控制的?

  1. 粗粒度权限:指的是控制到资源的类型级别,比如说张三只能管理部门, 不能管理用户
    细粒度权限:指的是控制到资源的数据级别,比如说张三只能管理1号部门,不能管理2号部门
  2. 粗粒度权限的控制是基于shiro实现的,细粒度的权限控制是自己编写sql语句实现的
  • 粗粒度权限控制是因为我们这个平台主要是包含三类用户,
    第一个是SaaS管理员,这个是属于我们SaaS系统的,主要责任是维护SaaS管理模块,
    第二个是企业管理员,这个是具体属于某个企业的,主要责任是维护企业相关模块,
    第三个是企业级的普通员工,也是属于某个企业的,主要责任是负责维护企业中某块信息的维护的。
  • 粗粒度权限大致分为两种情况,一种是SaaS管理员企业管理员,因为身份特殊性,我们会在具体的权限表中设置一个字段belong比如1代表SaaS管理员,2代表企业管理员来对应用户表中的一个相应字段degree,这样来控制相应的权限;第二种是企业的普通员工,这种因为不同部门普通员工又分为不同角色比如经理与职员,考虑到复杂性,我们是通过RBAC权限来管理控制的,也就是5表联查的一个操作。
  • 细粒度控制上比如说合同管理模块,总经理可以查看本部门及子部门的合同数据,部门经理能查看本部门的合同数据,普通员工只能查看自己的合同数据,具体实现是通过表中设置的字段degree,使用不同数值代表相应的职位,然后通过数值进行相应的判断,执行对应的sql语句。

6.第六天

6.1 谈一下分布式和集群的概念的区别

  • 集群:多台服务器重复完成同一个任务,即同一个任务部署在多台服务器上
  • 分布式:多台服务器协同完成同一个任务,即同一个任务拆分为多个子任务,多个子任务部署在多台服务器上协同完成同一个任务

6.2 什么是SOA架构? 它跟分布式架构的区别是什么?

  • 分布式架构
    狭义-javaweb应用的分布式架构就是指将服务层单独出来,并部署在tomcat上对外提供服务,在controller中可以通过远程调用访问服务层中的方法
    广义-多台服务器协同完成同一个任务,即同一个任务拆分为多个子任务,多个子任务部署在多台服务器上协同完成同一个任务
  • SOA架构
    分布式架构的优化版本,提供了一个服务治理中心来进行rpc调用的管理,解决了分布式架构在rpc中调用关系复杂,难维护的问题

6.3 画一下dubbo的架构图, 说一下dubbo架构图中的角色, 以及角色的调用关系
图片说明

  1. dubbo框架中的角色:

    服务运行容器: 用于启动服务提供者
    服务提供者: 用于提供服务
    服务消费者: 用于消费服务
    注册中心: soa架构中的服务治理中心,我们使用的是zookeeper,存储服务者列表的地方
    监控中心: soa架构的的一个可视化工具

  2. dubbo框架中角色之间的调用关系
    0) 服务提供方容器启动, 然后运行服务提供者
    1) 服务提供方启动时会向服务注册中心注册服务地址
    2) 服务消费方启动时会向服务注册中心订阅服务地址
    3) 服务注册中心返回服务地址给服务消费方,当服务地址有变更时主动推送给服务消费方
    4) 服务消费方从服务方地址列表中,基于负载均衡选择一台服务提供方进行调用,如果失败,再选一台
    5) 服务提供者和服务消费者定时发送调用次数和调用时间的相关统计数据到监控中心

6.4 dubbo架构中哪些地方用的是长连接,哪些地方用的是短连接

  1. 长连接: 消费者,提供者,注册中心之间是基于长连接
  2. 短连接: 监控中心,消费者,提供者之间是基于短连接

6.5 dubbo的注册中心如果宕掉了, 会不会影响服务之间的调用?
这得根据情况而定,一般分为两种情况:

  • 一种是服务消费者已经向服务注册中心拉取了服务地址,这种情况即使注册中心宕掉了,也不会影响服务之间的调用
  • 另一种情况是服务中心并没有拿到服务地址就宕掉了,服务消费者没有拉取到服务地址,就会影响服务之间的调用

6.5 dubbo的注册中心和服务消费者之间是基于什么模式传递消息的?
推拉相结合的模式
1. 当服务消费者刚刚启动的时候, 会主动连接服务注册中心, 并从注册中心中拉取服务提供者的列表
2. 当服务运行过程中, 一旦注册中心中的服务提供者的信息变化了, 注册中心就会将变化之后的列表主动推送给服务消费者

6.7 你们的系统为什么用dubbo?

  • 因为我们的项目设计还蛮复杂的,得有二三十个模块,包括货运模块,公司模块,基于系统的基础模块,统计分析等.
  • 这些模块之间的调用非常复杂,而且我们后期还得进行升级与维护,单体架构远远满足不了我们的需要,因而我们采取了目前主流的分布式架构,
  • 同时为了方便这些调用的统一管理,又采用了SOA的设计思想.因为现在dubbo还是比较主流嘛,实现框架还是选择的dubbo,用zookeeper作为注册中心.

6.8 Dubbo启动时如果依赖的服务不可用会怎样?

  • dubbo的服务启动依赖检查,指的是当启动服者务时,如果存在不可用的依赖时,直接抛出异常,从而阻断spring初始化完成,以便在上线时发现问题
  • 我们可以通过在服务者的springmvc配置文件中将duboo的comsumer标签中的check属性设置为false解决这一问题,不让dubbo框架中的消费者启动依赖检查

6.9 你们公司的Dubbo使用的什么做注册中心? 还有别的选择吗?

  • 我们公司使用的:zookeeper(文件系统+监听机制)
  • 可供选择:mysql / redis

6.10 你们公司的Dubbo使用的是什么通信框架? 还有别的选择吗?

  • 消费者和服务者之间的通信框架: netty(基于自定义通信协议的web容器)-dubbo协议
  • 可供使用的通信协议框架-dubbo、rmi、hessian、http、webservice、rest、redis等

6.11 Dubbo有哪几种集群容错方案,默认是哪种?

  • Failover Cluster 失败自动切换,自动重试其它服务器(默认)
  • Failfast Cluster 快速失败,立即报错,只发起一次调用
  • Failsafe Cluster 失败安全,出现异常时,直接忽略
  • Failback Cluster 失败自动恢复,记录失败请求,定时重发
  • Forking Cluster 并行调用多个服务器,只要一个成功即返回
  • Broadcast Cluster 广播逐个调用所有提供者,任意一个报错则报错

6.12 Dubbo有哪几种负载均衡策略,默认是哪种?

  • Random LoadBalance-随机模式。按权重设置随机概率。在一个截面上碰撞的概率较高,但调用越大分布越均匀
  • RoundRobin LoadBalance-轮询模式。按公约后的权重设置轮询比例。但存在响应慢的服务提供者会累积请求
  • LeastAction LoadBalance-最少活跃调用数。响应快的提供者接受越多请求,响应慢的接受越少请求
  • ConsistentHash LoadBalance-一致hash。根据服务提供者ip设置hash环,携带相同的参数总是发送的同一个服务提供者,若服务挂了,则会基于虚拟节点平摊到其他提供者

6.13 如果使用了dubbo之后,没有切换成阿里的@Service注解,会引发什么问题?

  • 无法将服务提供者暴露给注册中心,这样在消费者启动时:
  • 如果配置了检查, 会启动失败
  • 如果配置了不检查, 会启动会成功, 但是在服务调用的时候会保存,抛出一个找不到服务提供者的异常(No Provider)

6.14 如果使用了dubbo之后,没有切换成阿里的@Reference注解,会引发什么问题?

  • 在rpc时,无法在控制器进行远程服务对象注入,运行时会报空指针异常,即无法进行远程服务调用