网站改版 优势,无线路由器做中继手机能连接但无法访问网站,威海网络推广公司哪家好,卖小程序赚钱吗springboot bean
在 Spring Boot 中#xff0c;Bean 是 Spring 框架的核心概念之一#xff0c;表示由 Spring 容器管理的对象。通过 Bean 或其他注解#xff08;如 Component、Service、Repository 等#xff09;来定义和管理这些对象。以下是关于 Spring Boot 中 Bean 的…springboot bean
在 Spring Boot 中Bean 是 Spring 框架的核心概念之一表示由 Spring 容器管理的对象。通过 Bean 或其他注解如 Component、Service、Repository 等来定义和管理这些对象。以下是关于 Spring Boot 中 Bean 的详细说明 1. 什么是 Spring Bean
Spring Bean 是由 Spring IoCInversion of Control控制反转容器实例化、组装和管理的对象。Bean 的生命周期由 Spring 容器控制开发者无需手动创建或销毁对象。Bean 通常用于实现应用程序中的业务逻辑、数据访问、配置等功能。 2. 定义 Bean 的方式 (注册 Bean 的方式)
常用的 Bean 注解
// 通用组件注解
Component // 三个衍生注解
Controller // 标注控制层组件
Service // 标注业务层组件
Repository // 标注数据访问层组件 // 配置类相关
Configuration // 标注配置类
Bean // 方法级别的注解声明一个Bean 1通过 Bean 注解
使用 Bean 注解可以在配置类中显式定义一个 Bean。配置类通常使用 Configuration 注解标注。
示例
Configuration
public class AppConfig {Beanpublic MyService myService() {return new MyService();}
}Bean 方法的返回值会被注册为 Spring 容器中的一个 Bean。Bean 的默认名称是方法名如上例中Bean 名称为 myService。 2通过组件扫描Component、Service 等
使用 Component 或其派生注解如 Service、Repository、Controller可以自动将类注册为 Bean。需要在主类或配置类上添加 ComponentScanSpring Boot 默认会扫描主类所在包及其子包。
示例
Component
public class MyComponent {public void doSomething() {System.out.println(Doing something...);}
}Service用于标注服务层组件。Repository用于标注数据访问层组件。Controller用于标注控制器层组件。 3通过 Import 注解
使用 Import 可以将其他配置类或组件引入到当前配置中。
示例
Import(AppConfig.class)
Configuration
public class MainConfig {// 引入 AppConfig 中定义的 Bean
}3. 注入 Bean (依赖注入方式)
Spring 提供了多种方式将 Bean 注入到其他组件中
1构造器注入推荐
使用构造器注入可以确保依赖在对象创建时就被注入适合用于不可变对象。
示例
Component
public class MyController {private final MyService myService;public MyController(MyService myService) {this.myService myService;}
}2字段注入
使用 Autowired 注解直接注入到字段中。
示例
Component
public class MyController {Autowiredprivate MyService myService;
}3Setter 方法注入
使用 Autowired 注解标注在 Setter 方法上。
示例
Component
public class MyController {private MyService myService;Autowiredpublic void setMyService(MyService myService) {this.myService myService;}
}4. Bean 的作用域
Spring 提供了多种作用域Scope来控制 Bean 的生命周期
Singleton默认整个应用上下文中只有一个实例。Prototype每次请求都会创建一个新的实例。Request每个 HTTP 请求创建一个实例仅适用于 Web 应用。Session每个 HTTP 会话创建一个实例仅适用于 Web 应用。Application整个 ServletContext 中只有一个实例。
示例 Scope(singleton) // 默认单例
Scope(prototype) // 原型每次获取都创建新实例
Scope(request) // 每个请求一个实例
Scope(session) // 每个会话一个实例Bean
Scope(prototype)
public MyService myService() {return new MyService();
}5. Bean 的生命周期
Spring Bean 的生命周期包括以下几个阶段
实例化Spring 容器创建 Bean 实例。依赖注入注入 Bean 的依赖。初始化调用 PostConstruct 或 InitializingBean 的 afterPropertiesSet() 方法。销毁调用 PreDestroy 或 DisposableBean 的 destroy() 方法。
示例
Component
public class MyService {PostConstructpublic void init() {System.out.println(Bean 初始化);}PreDestroypublic void destroy() {System.out.println(Bean 销毁);}
}6. 自定义 Bean 的初始化和销毁方法
可以通过 Bean 注解的 initMethod 和 destroyMethod 属性指定自定义方法
示例
Bean(initMethod customInit, destroyMethod customDestroy)
public MyService myService() {return new MyService();
}7. 条件化 Bean 定义 (条件化装配)
使用 Conditional 或 ConditionalOn... 注解可以根据条件加载 Bean。
示例 ConditionalOnClass(name org.springframework.data.redis.core.RedisTemplate)
ConditionalOnProperty(prefix spring.redis, name enabled, havingValue true)
ConditionalOnBean(type org.springframework.data.redis.connection.RedisConnectionFactory)Bean
ConditionalOnProperty(name my.feature.enabled, havingValue true)
public MyService myService() {return new MyService();
}总结
Spring Boot 中的 Bean 是应用程序的核心组件主要通过以下方式定义和管理
使用 Bean 显式定义。使用 Component 或其派生注解自动扫描。配置作用域、生命周期和条件化加载。
通过 Spring 的 IoC 容器开发者可以轻松实现依赖注入和组件管理从而提高代码的可维护性和扩展性。
需要注意的最佳实践
优先使用构造器注入它可以保证依赖不可变且必须被注入使用 Component 注解时确保组件被 ComponentScan 扫描到合理使用作用域大多数情况下使用默认的单例模式即可注意循环依赖问题尽量通过良好的设计来避免使用 Qualifier 或 Primary 来解决多个相同类型 Bean 的注入问题
ejb bean
EJBEnterprise JavaBeans 是 Java EE现 Jakarta EE规范的一部分用于构建企业级分布式应用程序。EJB 提供了事务管理、安全性、并发控制和远程调用等功能。EJB Bean 是由 EJB 容器管理的组件主要用于实现业务逻辑。
以下是关于 EJB Bean 的详细介绍 1. EJB 的类型
EJB 分为以下三种主要类型
1Session Bean
用途用于实现业务逻辑。分类 Stateless无状态不维护客户端的状态每次调用都是独立的。可以减少资源占用,并提供良好的服务端处理性能,是EJB在实际开发中最为常用的一种组件。Stateful有状态维护客户端的状态适合需要会话的场景。保存每一个客户端的状态信息,会造成极大的服务器资源占用。Singleton整个应用中只有一个实例适合共享资源的场景。
2Message-Driven BeanMDB
用途用于处理异步消息通常通过 JMS。提供异构数据平台的整合处理,采用消息的异步处理机制提供数据交互,基于JMS服务标准构建(Apache 提供的ActiveMQ组件也是基于JMS服务标准实现的)。特点不直接与客户端交互而是通过消息队列接收消息。
3Entity Bean已被 JPA 替代 用途用于表示数据库中的数据。持久化状态处理的对象,可以提供关系数据库的操作,有两种实现类型。 CMP (Container Managed Persistence,容器管理持久化):由开发者定义数据接口标准,随后由容器生成相应的数据库操作代码,由于不需要直接编写代码,所以有较强的数据库可移植性。Hibernate 开发框架就是模拟CMP技术理论实现的。BMP (Bean Managed Persistence, Bean 管理持久化):开发者除了要定义数据接口标准之外,还需要通过JDBC技术标准编写数据接口的实现子类,程序的可移植性不强。 现状从 EJB 3.0 开始Entity Bean 被 JPAJava Persistence API取代。
EJB 是一个完全独立的组件,可以通过Web 容器或者通过 CORBA 协议 RMI标准 实现远程调用。所有的调用全部由会话 Bean 负责处理(需要暴露远程接口),随后会依据不同的业务处理需要实现实体 Bean 的调用(本地接口)。每一个实体 Bean 都会与数据源中的数据表进行结构映射,操作实体Bean 接口时就可以实现数据表数据的操作 1。 2. Session Bean 的实现
1Stateless Bean无状态 Bean
无状态 Bean 不会保存客户端的状态每次调用都是独立的。
示例
import jakarta.ejb.Stateless;Stateless
public class StatelessBean {public String sayHello(String name) {return Hello, name;}
}2Stateful Bean有状态 Bean
有状态 Bean 会保存客户端的状态适合需要会话的场景。
示例
import jakarta.ejb.Stateful;Stateful
public class StatefulBean {private int count 0;public void increment() {count;}public int getCount() {return count;}
}3Singleton Bean
Singleton Bean 在整个应用中只有一个实例适合共享资源的场景。
示例
import jakarta.ejb.Singleton;Singleton
public class SingletonBean {private int count 0;public void increment() {count;}public int getCount() {return count;}
}3. Message-Driven BeanMDB
Message-Driven Bean 用于处理异步消息通常与 JMSJava Message Service结合使用。
示例
import jakarta.ejb.ActivationConfigProperty;
import jakarta.ejb.MessageDriven;
import jakarta.jms.Message;
import jakarta.jms.MessageListener;MessageDriven(activationConfig {ActivationConfigProperty(propertyName destinationType, propertyValue jakarta.jms.Queue),ActivationConfigProperty(propertyName destination, propertyValue java:/jms/queue/MyQueue)
})
public class MyMessageDrivenBean implements MessageListener {Overridepublic void onMessage(Message message) {// 处理消息System.out.println(Received message: message);}
}4. EJB 的注入
EJB 可以通过以下方式注入到其他组件中
1通过 EJB 注解
用于注入 EJB。
示例
import jakarta.ejb.EJB;
import jakarta.ejb.Stateless;Stateless
public class MyService {EJBprivate StatelessBean statelessBean;public void execute() {System.out.println(statelessBean.sayHello(World));}
}2通过 JNDI 查找
使用 JNDIJava Naming and Directory Interface手动查找 EJB。
示例
import jakarta.naming.InitialContext;public class Client {public static void main(String[] args) throws Exception {InitialContext ctx new InitialContext();StatelessBean bean (StatelessBean) ctx.lookup(java:global/myapp/StatelessBean);System.out.println(bean.sayHello(World));}
}5. EJB 的事务管理
EJB 提供了内置的事务管理开发者可以通过注解声明事务行为。
1默认事务管理
默认情况下EJB 方法会自动参与事务。
2通过 TransactionAttribute 注解控制事务
TransactionAttribute 用于指定事务属性。
事务属性
REQUIRED默认如果当前没有事务则创建一个新事务。REQUIRES_NEW总是创建一个新事务。MANDATORY必须在已有事务中运行否则抛出异常。SUPPORTS如果有事务则参与事务如果没有事务则以非事务方式运行。NOT_SUPPORTED总是以非事务方式运行。NEVER不能在事务中运行。
示例
import jakarta.ejb.Stateless;
import jakarta.ejb.TransactionAttribute;
import jakarta.ejb.TransactionAttributeType;Stateless
public class TransactionalBean {TransactionAttribute(TransactionAttributeType.REQUIRED)public void doSomething() {// 事务逻辑}TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)public void doSomethingElse() {// 新事务逻辑}
}6. EJB 的生命周期
1Stateless Bean 的生命周期
创建由容器创建实例。调用容器从池中取出实例处理请求。销毁容器销毁实例。
2Stateful Bean 的生命周期
创建由容器创建实例。调用实例与客户端绑定处理请求。钝化当不活跃时实例可能被钝化序列化到磁盘。激活当需要时实例被激活从磁盘反序列化。销毁会话结束后实例被销毁。
3生命周期回调方法
使用以下注解定义生命周期回调方法 PostConstruct在实例化后调用。PreDestroy在销毁前调用。
示例
import jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestroy;
import jakarta.ejb.Stateless;Stateless
public class LifecycleBean {PostConstructpublic void init() {System.out.println(Bean 初始化);}PreDestroypublic void destroy() {System.out.println(Bean 销毁);}
}7. EJB 的优缺点
优点
提供了内置的事务管理、安全性和并发控制。支持分布式调用远程访问。容器管理生命周期简化开发。
缺点
相较于轻量级框架如 SpringEJB 的配置和部署较为复杂。对于简单应用来说可能显得过于重量级。 总结
EJB 是企业级 Java 应用开发的重要技术适合需要事务管理、分布式调用和高并发的场景。主要包括
Session Bean实现业务逻辑Stateless、Stateful、Singleton。Message-Driven Bean处理异步消息。事务管理通过注解声明事务行为。
尽管 EJB 功能强大但在现代开发中轻量级框架如 Spring更为流行EJB 的使用逐渐减少但在一些传统企业应用中仍然占有重要地位。了解 EJB 的概念和设计思想对于理解企业级应用架构仍然很有帮助。
springboot bean ejb bean
在 Java 企业级开发中Spring Boot Bean 和 EJB Bean 都是用于管理对象生命周期和依赖注入的核心概念但它们属于不同的技术栈适用于不同的场景。以下是对 Spring Boot Bean 和 EJB Bean 的详细对比和说明 1. Spring Boot Bean
概念
Spring Bean 是由 Spring IoC 容器管理的对象Spring Boot 是 Spring 框架的扩展简化了 Spring 应用的开发。Spring Bean 的生命周期、依赖注入和作用域由 Spring 容器控制。通过注解如 Component、Service、Repository、Bean或 XML 配置定义 Bean。
特点
轻量级适合微服务和现代应用开发。灵活性高支持多种配置方式注解、Java 配置类、XML。与 Spring 的生态系统如 Spring Data、Spring Security无缝集成。不依赖 Java EE 容器可以运行在任何 Servlet 容器如 Tomcat、Jetty或独立运行。
定义方式
1通过 Component 或其派生注解
Component
public class MyComponent {public void doSomething() {System.out.println(Spring Bean: Doing something...);}
}2通过 Bean 注解
Configuration
public class AppConfig {Beanpublic MyService myService() {return new MyService();}
}3通过 XML 配置较少使用
bean idmyService classcom.example.MyService/依赖注入
使用 Autowired、Qualifier 或构造器注入。
Component
public class MyController {private final MyService myService;Autowiredpublic MyController(MyService myService) {this.myService myService;}
}作用域
默认是单例singleton。其他作用域prototype、request、session、application。 2. EJB Bean
概念
EJBEnterprise JavaBeans 是 Java EE现 Jakarta EE规范的一部分用于构建企业级分布式应用程序。EJB Bean 是由 EJB 容器管理的组件提供事务管理、安全性、并发控制和远程调用等功能。适用于需要分布式事务、异步消息处理和高并发的企业级应用。
特点
重量级依赖 Java EE 容器如 WildFly、GlassFish。提供内置的事务管理、安全性和远程调用支持。适合复杂的企业级应用但配置和部署较为复杂。支持分布式调用通过 RMI 或 JNDI。
类型
1Session Bean
Stateless无状态不维护客户端状态。Stateful有状态维护客户端状态。Singleton整个应用中只有一个实例。
2Message-Driven BeanMDB
用于处理异步消息通常通过 JMS。
定义方式
1Stateless Bean
import jakarta.ejb.Stateless;Stateless
public class StatelessBean {public String sayHello(String name) {return Hello, name;}
}2Stateful Bean
import jakarta.ejb.Stateful;Stateful
public class StatefulBean {private int count 0;public void increment() {count;}public int getCount() {return count;}
}3Message-Driven Bean
import jakarta.ejb.MessageDriven;
import jakarta.jms.Message;
import jakarta.jms.MessageListener;MessageDriven
public class MyMessageDrivenBean implements MessageListener {Overridepublic void onMessage(Message message) {System.out.println(Received message: message);}
}依赖注入
使用 EJB 注解注入其他 EJB。
import jakarta.ejb.EJB;
import jakarta.ejb.Stateless;Stateless
public class MyService {EJBprivate StatelessBean statelessBean;public void execute() {System.out.println(statelessBean.sayHello(World));}
}作用域
由 EJB 容器管理Session Bean 的作用域取决于其类型 Stateless无状态所有客户端共享实例。Stateful每个客户端有独立实例。Singleton整个应用中只有一个实例。 3. Spring Boot Bean 与 EJB Bean 的对比
特性Spring Boot BeanEJB Bean技术栈Spring FrameworkJava EEJakarta EE容器Spring IoC 容器EJB 容器轻量/重量轻量级重量级运行环境任意 Servlet 容器如 Tomcat、Jetty或独立运行Java EE 容器如 WildFly、GlassFish事务管理通过 Transactional 注解实现内置事务管理使用 TransactionAttribute远程调用需要额外配置如 REST、RPC内置支持RMI、JNDI异步消息处理通过 Spring JMS 或其他工具实现使用 Message-Driven BeanMDB依赖注入使用 Autowired 或构造器注入使用 EJB 注解作用域默认单例singleton支持多种作用域取决于 Bean 类型Stateless、Stateful 等开发复杂度简单配置灵活较复杂依赖 Java EE 容器适用场景微服务、现代 Web 应用企业级分布式应用
组件类型对比
Spring Boot Bean
// 普通 Spring Bean
Component
public class MyComponent {
}// 服务层 Bean
Service
public class MyService {
}// 数据访问层 Bean
Repository
public class MyRepository {
}EJB Bean
// 无状态会话 Bean
Stateless
public class MyStatelessBean {
}// 有状态会话 Bean
Stateful
public class MyStatefulBean {
}// 单例 Bean
Singleton
public class MySingletonBean {
}// 消息驱动 Bean
MessageDriven
public class MyMessageBean implements MessageListener {
}依赖注入对比
Spring Boot
// 构造器注入推荐
Service
public class UserService {private final UserRepository userRepository;public UserService(UserRepository userRepository) {this.userRepository userRepository;}
}// 字段注入
Service
public class UserService {Autowiredprivate UserRepository userRepository;
}EJB
// EJB 注入
Stateless
public class UserService {EJBprivate UserRepository userRepository;
}// 资源注入
Stateless
public class UserService {Resourceprivate UserRepository userRepository;
}事务管理对比
Spring Boot
Service
public class UserService {Transactionalpublic void saveUser(User user) {// 事务处理}Transactional(propagation Propagation.REQUIRES_NEW)public void updateUser(User user) {// 新事务处理}
}EJB
Stateless
public class UserService {TransactionAttribute(TransactionAttributeType.REQUIRED)public void saveUser(User user) {// 事务处理}TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)public void updateUser(User user) {// 新事务处理}
}生命周期管理对比
Spring Boot
Component
public class MyBean {PostConstructpublic void init() {// 初始化逻辑}PreDestroypublic void destroy() {// 清理逻辑}
}EJB
Stateless
public class MyEjb {PostConstructpublic void init() {// 初始化逻辑}PreDestroypublic void destroy() {// 清理逻辑}
}4. 选择建议 使用 Spring Boot Bean 如果你正在开发现代化的微服务或 Web 应用。如果你需要轻量级框架且不依赖 Java EE 容器。如果你需要灵活的配置和快速开发。 使用 EJB Bean 如果你需要分布式事务管理和远程调用。如果你需要处理异步消息如 JMS。如果你的应用运行在 Java EE 容器中且需要使用其内置功能。 总结
Spring Boot Bean 更适合现代化、轻量级的开发场景尤其是微服务架构。EJB Bean 更适合传统的企业级应用尤其是需要分布式事务和远程调用的场景。
两者的选择取决于项目需求和运行环境。如果是新项目Spring Boot 通常是更好的选择如果是维护传统 Java EE 应用EJB 可能仍然是必要的。
web service平台
Web Service 平台 是用于开发、部署和运行 Web 服务的技术框架或工具集。Web 服务是一种基于标准协议如 HTTP、SOAP、REST 等实现的分布式系统通信方式允许不同平台和语言的应用程序互相交互。
以下是关于 Web Service 平台的详细介绍包括常见平台、技术栈和选择建议。 1. Web Service 的类型
在讨论 Web Service 平台之前先了解 Web 服务的主要类型
1SOAP Web Service
基于 SOAPSimple Object Access Protocol 协议。使用 XML 格式传输数据。依赖 WSDLWeb Services Description Language描述服务接口。适合需要严格规范、复杂事务和安全性的场景。
2RESTful Web Service
基于 RESTRepresentational State Transfer 架构风格。使用 HTTP 协议支持 JSON、XML 等多种数据格式。轻量级适合现代 Web 和移动应用开发。
3GraphQL
一种查询语言允许客户端灵活地请求所需的数据。提供更高的查询效率适合复杂数据交互的场景。 2. 常见的 Web Service 平台
以下是一些主流的 Web Service 平台和框架
1Java 平台
Java 提供了丰富的工具和框架来开发 Web 服务
1.1 JAX-WSJava API for XML Web Services
用于开发基于 SOAP 的 Web 服务。是 Java EE现 Jakarta EE规范的一部分。支持 WSDL 和 XML Schema。示例WebService
public class HelloService {public String sayHello(String name) {return Hello, name;}
}1.2 JAX-RSJava API for RESTful Web Services
用于开发基于 REST 的 Web 服务。常见实现Jersey、RESTEasy。示例Path(/hello)
public class HelloService {GETProduces(MediaType.TEXT_PLAIN)public String sayHello() {return Hello, World!;}
}1.3 Spring Boot
提供了对 RESTful Web 服务的强大支持。通过 RestController 和 RequestMapping 快速开发 REST API。示例RestController
RequestMapping(/api)
public class HelloController {GetMapping(/hello)public String sayHello() {return Hello, Spring Boot!;}
}2.NET 平台
ASP.NET Web API用于开发 RESTful Web 服务。WCFWindows Communication Foundation用于开发 SOAP Web 服务。ASP.NET Core跨平台框架支持 RESTful API 和 gRPC。
示例ASP.NET Core REST API
[ApiController]
[Route(api/[controller])]
public class HelloController : ControllerBase {[HttpGet]public string Get() {return Hello, .NET Core!;}
}3Python 平台
Python 提供了多种框架来开发 Web 服务
3.1 Flask
轻量级框架适合快速开发 RESTful API。示例from flask import Flaskapp Flask(__name__)app.route(/hello, methods[GET])
def hello():return Hello, Flask!3.2 Django REST Framework
基于 Django 的强大 REST API 框架。提供了丰富的功能如认证、序列化和分页。
3.3 FastAPI
新兴框架支持异步编程性能优越。示例from fastapi import FastAPIapp FastAPI()app.get(/hello)
def read_root():return {message: Hello, FastAPI!}4JavaScript 平台
JavaScriptNode.js是开发 Web 服务的热门选择
4.1 Express.js
轻量级框架适合快速开发 RESTful API。示例const express require(express);
const app express();app.get(/hello, (req, res) {res.send(Hello, Express!);
});app.listen(3000, () console.log(Server running on port 3000));4.2 NestJS
基于 TypeScript 的框架适合构建复杂的企业级应用。提供模块化架构和内置支持的 GraphQL。 5PHP 平台
PHP 也可以用于开发 Web 服务
5.1 Laravel
提供了强大的 REST API 支持。示例Route::get(/hello, function () {return response()-json([message Hello, Laravel!]);
});5.2 Lumen
Laravel 的轻量级版本适合微服务开发。 6其他平台
6.1 Ruby on Rails
提供了内置的 RESTful API 支持。示例class HelloController ApplicationControllerdef indexrender json: { message: Hello, Rails! }end
end6.2 GoGolang
使用框架如 Gin 或 Echo 开发高性能 REST API。示例Ginpackage mainimport github.com/gin-gonic/ginfunc main() {r : gin.Default()r.GET(/hello, func(c *gin.Context) {c.JSON(200, gin.H{message: Hello, Gin!})})r.Run()
}6.3 gRPC
基于 HTTP/2 的高性能 RPC 框架支持多种语言。适合需要高效通信的微服务架构。 3. 选择 Web Service 平台的建议
根据服务类型选择
SOAP Web Service 需要严格的协议和安全性如银行、保险系统。推荐使用 JAX-WS 或 WCF。 RESTful Web Service 轻量级、灵活性高适合现代 Web 和移动应用。推荐使用 Spring Boot、Flask、Express.js 等。 GraphQL 数据查询复杂、需要高效通信的场景。推荐使用 Apollo Server、NestJS 或 Spring GraphQL。
根据语言和技术栈选择
JavaSpring BootREST、JAX-WSSOAP。PythonFlask、FastAPI。JavaScriptExpress.js、NestJS。.NETASP.NET Core。GoGin、Echo。
根据性能需求选择
高性能场景gRPC、FastAPI、GoGin。标准性能Spring Boot、Express.js、Django REST Framework。 4. 总结
Web Service 平台的选择取决于项目需求、团队技术栈和服务类型
轻量级 RESTful APISpring Boot、Flask、Express.js。复杂企业级应用Spring Boot、ASP.NET Core、NestJS。高性能微服务gRPC、FastAPI、Go。传统 SOAP 服务JAX-WS、WCF。
现代开发中RESTful Web Service 是主流选择而 GraphQL 和 gRPC 正在逐渐流行适合需要高效数据交互的场景。
参考: Spring Cloud 开发实战 ↩︎