ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-07-13 12:31:18  阅读:197  来源: 互联网

标签:dubbo stereotype 配置文件 Autowired spring Service 注解


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

 

  在开始文章之前,首先声明

 

spring作用在类上的注解(有@Component,@Service,@Controller等),都表明这些类是要交给spring容器管理,相当于自动给我们创建了一个bean即注解方式,不用我们手动的配置bean了(如果@Service不指定名称,默认为Bean的id为类名首字母大写,如果这样写@Service(”itemServiceImpl”)相当于给这个类起了个别名,bean的id即是itemServiceImpl,方便注入到别的类中,如下面的暴露服务时用的ref就是@Service的别名或类名首字母小写;通常使用getBean(“bean的id名”)也会用到);

spring作用在属性或方法上的注解(@Autowired,@Resource等),表明是当我用到这个属性或方法时,并不需要我们自己去new,只需要使用注解,spring容器会自动将我们需要的属性,方法创建出来,我们直接用就可以,这就是我们通常说的依赖注入和控制反转

  在使用spring时会利用Spring的IOC原理,采用注解方式往spring容器中注入Bean,其中有一个@Service注解,但它有两种类型,下面分别讲解:

 

org.springframework.stereotype.Service

归属:spring

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

spring配置文件:

<!-- 配置包扫描器 -->

<context:component-scan base-package="cn.e3mall.service"/>

 

 

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

@Controller

用于标注控制层组件(如Struts的action,springMVC的controller)

@Service

用于标注业务层组件,主要进行业务的处理(通常定义在servic层)

@Repository

用于标注数据访问层组件

@Component

用于标注泛指组件,当我们不知道某类属于哪类时(不属于@Controller、@Services等时),就可以标注为@Component

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

 

com.alibaba.dubbo.config.annotation.Service

归属:dubbo

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

spring配置文件:

 

<!-- 配置包扫描器,alibaba的@Service注解 -->

 <dubbo:annotation package="cn.e3mall.service" />

 

<!-- 提供方应用信息,用于计算依赖关系 -->

<dubbo:application name="e3-manager" />

<dubbo:registry protocol="zookeeper" address="192.168.20.191:2181" />

<!-- 用dubbo协议在20880端口暴露服务 -->

<dubbo:protocol name="dubbo" port="20880" />

 

 

 

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

 

服务的提供者

第一种:仍然使用spring的@Service

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

 

<!-- 配置包扫描器,spring的@Service注解 -->

<context:component-scan base-package="cn.e3mall.service"/>

 

<!-- 提供方应用信息,用于计算依赖关系 -->

<dubbo:application name="e3-manager" />

<dubbo:registry protocol="zookeeper" address="192.168.20.191:2181" />

<!-- 用dubbo协议在20880端口暴露服务 -->

<dubbo:protocol name="dubbo" port="20880" />

<!-- 声明需要暴露的服务接口 -->

<dubbo:service interface="cn.e3mall.service.ItemService" ref="itemServiceImpl" timeout="600000"/>

 

第二种:使用alibaba的dubbo的@Service

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

 

<!-- 配置包扫描器,alibaba的@Service注解 -->

<dubbo:annotation package="cn.e3mall.service" />

 

<!-- 提供方应用信息,用于计算依赖关系 -->

<dubbo:application name="e3-manager" />

<dubbo:registry protocol="zookeeper" address="192.168.20.191:2181" />

<!-- 用dubbo协议在20880端口暴露服务 -->

<dubbo:protocol name="dubbo" port="20880" />

 

服务的消费者

第一种:使用@Reference引用服务

spring配置文件如下:

 

<!-- 配置包扫描器 -->

<dubbo:annotation package="cn.e3mall.controller" />

 

<!-- 引用dubbo服务 -->

<dubbo:application name="e3-manager-web"/>

<dubbo:registry protocol="zookeeper" address="192.168.20.191:2181"/>   

 

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

 

<!-- 也是alibaba的注解-->

import com.alibaba.dubbo.config.annotation.Reference;

 

@Reference

private ItemService itemService;

 

第二种:使用@Autowired引用服务

如果你非要使用@Autowired注解,也是可以的,需要在spring配置文件中显示的声明调用的dubbo服务,但是不推荐,因为:

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

  2、如果引用的dubbo服务非常多的话,spring配置文件要写好多的dubbo:reference

 

spring配置文件:

 

<!-- spring的@service -->

<context:component-scan base-package="cn.e3mall.controller" />

 

<!-- 引用dubbo服务 -->

<dubbo:application name="e3-manager-web"/>

<dubbo:registry protocol="zookeeper" address="192.168.20.191:2181"/>   

<dubbo:reference interface="cn.e3mall.service.ItemService" id="itemService" />

 

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

 

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

 

@Autowired

private ItemService itemService;

 

【总结】

  我们在使用dubbo服务时,还是采用正规的做法,服务提供者使用alibaba提供的dubbo提供的注解@Service,服务消费者使用@Reference引用服务。在研究这个知识点时,就在服务提供者和消费者上来回换@Service,@Reference,@Autowired,包括扫描包的方式,把各种情况都组合了一遍,然后把每种组合出现的问题也相应的记下来,然后总结.

————————————————

版权声明:本文为CSDN博主「王如霜」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/wrs120/article/details/80468174

标签:dubbo,stereotype,配置文件,Autowired,spring,Service,注解
来源: https://www.cnblogs.com/lyqjava/p/16473434.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有