com.alibaba.dubbo.config.annotation.Service和org.springframework.stereotype.Service两种@Service的区别

本文详细解析了Spring框架中的@Service、@Controller、@Repository、@Component注解及Dubbo框架中的@Service注解的用途与配置。比较了Spring与Dubbo在服务提供者与消费者上的不同配置方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

org.springframework.stereotype.Service

属于Spring
作用:只是用来表示此类是业务层组件

spring配置文件:

<!-- 配置包扫描器 -->
<context:component-scan base-package="com.zm.service"/>

常用的作用在类上的注解,还有以下几种:

    @Controller
    用于标注控制层组件(如Struts的action,springMVC的controller)
    @Service
    用于标注业务层组件,主要进行业务的处理(通常定义在servic层)
    @Repository
    用于标注数据访问层组件
    @Component
    用于标注泛指组件,当我们不知道某类属于哪类时(不属于@Controller、@Services等时),就可以标注为@Componet

以上所有的的作用在类上的注解,归根到底,都是讲注解的类纳入到spring容器进行管理,之所以名字不同,只是表示组件的名称不同,就如世上所有的人都有名字(注解名),但他们都是人(标识为组件,放到spring容器)

 

com.alibaba.dubbo.config.annotation.Service

属于dubbo

作用:是dubbo用来声明provider的注解(即声明该类是服务的提供者的注解)

spring配置文件:

<!-- 配置包扫描器,alibaba的@Service注解 -->
 <dubbo:annotation package="com.zm.service" />

<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="e3-manager" />
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" />
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />
 

服务的提供者

如果你的程序是分布式程序,且使用的dubbo实现的RPC,可以有两种配置:

1.使用spring的@Service

必须在spring配置文件中非注解的方式显示暴露一下服务接口,存在的弊端:如果有好多服务提供者,要在spring配置文件中写好多dubbo:service,配置如下:

<!-- 配置包扫描器,spring的@Service注解 -->
<context:component-scan base-package="com.zm.service"/>

<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="e3-manager" />
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" />
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface=com.zm.service.ItemService" ref="itemServiceImpl" timeout="600000"/>

 

第二种:使用alibaba的dubbo的@Service
此时就不需要在spring配置文件中显示声明要暴露的服务接口了,spring配置文件中省去好多dubbo:service,配置如下:

<!-- 配置包扫描器,alibaba的@Service注解 -->
<dubbo:annotation package="com.zm.service" />

<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="e3-manager" />
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" />
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />
 

 

 

服务的消费者

 

dubbo注解

第一种:使用@Reference引用服务
spring配置文件如下:

<!-- 配置包扫描器 -->
<dubbo:annotation package="com.zm.controller" />

<!-- 引用dubbo服务 -->
<dubbo:application name="e3-manager-web"/>
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"/>   

Controller类上面使用@Reference表明我要引用的服务

<!-- 也是alibaba的注解-->
import com.alibaba.dubbo.config.annotation.Reference;

@Reference
private ItemService itemService;
 

第二种:使用autowired注解

spring配置文件:

<!-- spring的@service -->
<context:component-scan base-package="com.zm.controller" />

<!-- 引用dubbo服务 -->
<dubbo:application name="e3-manager-web"/>
<dubbo:registry protocol="zookeeper" address="192.168.20.191:2181"/>    
<dubbo:reference interface="com.zm.service.ItemService" id="itemService" />

Controller类上面使用@Autowired表明我要引用的服务

import org.springframework.beans.factory.annotation.Autowired;

@Autowired
private ItemService itemService;

这样写不推荐,因为有一下两点

1、当你配置的引用的服务没有提供者是,编译阶段就会出错,因为@Autowired默认的去找bean,没有找到对应的bean,就去你引用的dubbo服务中去找,但是这是没有提供者,即没有这个真正的类,所以编译就报错了;而用alibaba的@Service只是一个引用,它能找到这个引用,但是如果没有提供者,也会报错ERROR,显示No Provider没有提供者,但是能编译过去项目能正常运行
2、如果引用的dubbo服务非常多的话,spring配置文件要写好多的dubbo:reference

 

最后,谢谢老哥的文章:https://blog.youkuaiyun.com/wrs120/article/details/80468174

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值