blob: 4647c2cf55def4be24d1902962bd631fb71eb5ba [file] [log] [blame]
<!doctype html><html lang=en class=no-js><head><meta name=ROBOTS content="INDEX, FOLLOW"><link rel=canonical href=https://cn.dubbo.apache.org/en/blog/2018/08/07/use-annotations-in-dubbo/><script>var _hmt=_hmt||[];(function(){var e,t=document.createElement("script");t.src="https://hm.baidu.com/hm.js?3b78f49ba47181e4d998a66b689446e9",e=document.getElementsByTagName("script")[0],e.parentNode.insertBefore(t,e)})()</script><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta http-equiv=Content-Security-Policy content="frame-src *"><meta name=generator content="Hugo 0.122.0"><link rel="shortcut icon" type=image/png href=/imgs/favicon.png><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=manifest href=/manifest.webmanifest><title>Use Annotations In Dubbo | Apache Dubbo</title><meta property="og:title" content="Use Annotations In Dubbo">
<meta property="og:description" content="This article will introduce you how to use annotations instead of XML to develop Dubbo applications, such as `@EnableDubbo`, `@Service` and `@Reference`.
"><meta property="og:type" content="article"><meta property="og:url" content="https://cn.dubbo.apache.org/en/blog/2018/08/07/use-annotations-in-dubbo/"><meta property="article:section" content="blog"><meta property="article:published_time" content="2018-08-07T00:00:00+00:00"><meta property="article:modified_time" content="2022-12-16T10:30:17+08:00"><meta itemprop=name content="Use Annotations In Dubbo"><meta itemprop=description content="This article will introduce you how to use annotations instead of XML to develop Dubbo applications, such as `@EnableDubbo`, `@Service` and `@Reference`.
"><meta itemprop=datePublished content="2018-08-07T00:00:00+00:00"><meta itemprop=dateModified content="2022-12-16T10:30:17+08:00"><meta itemprop=wordCount content="1733"><meta itemprop=keywords content><meta name=twitter:card content="summary"><meta name=twitter:title content="Use Annotations In Dubbo"><meta name=twitter:description content="This article will introduce you how to use annotations instead of XML to develop Dubbo applications, such as `@EnableDubbo`, `@Service` and `@Reference`.
"><script async src="https://www.googletagmanager.com/gtag/js?id=G-NM6FFMT51J"></script><script>var doNotTrack=!1;if(!doNotTrack){window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments)}gtag("js",new Date),gtag("config","G-NM6FFMT51J",{anonymize_ip:!1})}</script><link rel=preload href=/scss/main.min.f77e221bcdbe0cadb996060fe82063c747b60c229a1f8bbf0ee529adbadd84fa.css as=style><link href=/scss/main.min.f77e221bcdbe0cadb996060fe82063c747b60c229a1f8bbf0ee529adbadd84fa.css rel=stylesheet integrity><script src=/js/jquery-3.5.1.min.js integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin=anonymous></script><meta name=theme-color content="#326ce5"><link rel=stylesheet href=/css/feature-states.css><meta name=description content="This article will introduce you how to use annotations instead of XML to develop Dubbo applications, such as `@EnableDubbo`, `@Service` and `@Reference`.
"><meta property="og:description" content="This article will introduce you how to use annotations instead of XML to develop Dubbo applications, such as `@EnableDubbo`, `@Service` and `@Reference`.
"><meta name=twitter:description content="This article will introduce you how to use annotations instead of XML to develop Dubbo applications, such as `@EnableDubbo`, `@Service` and `@Reference`.
"><meta property="og:url" content="https://cn.dubbo.apache.org/en/blog/2018/08/07/use-annotations-in-dubbo/"><meta property="og:title" content="Use Annotations In Dubbo"><meta name=twitter:title content="Use Annotations In Dubbo"><meta name=twitter:image:alt content="Apache Dubbo"><meta property="og:type" content="article"><meta name=viewport content="width=device-width"><script async defer src=/js/github-buttons.js></script><link href=/css/community.css rel=stylesheet><link href=/css/contactus.css rel=stylesheet><link href=/css/language.css rel=stylesheet><script src=/js/script.js></script></head><body class="td-page td-documentation"><header><nav class="js-navbar-scroll navbar navbar-expand navbar-dark flex-column flex-md-row td-navbar" data-auto-burger=primary><a class=navbar-brand href=/en/><span class=navbar-logo></span><span class="text-uppercase font-weight-bold">Apache Dubbo</span></a><div class="td-navbar-nav-scroll ml-md-auto" id=main_navbar><ul class="navbar-nav mt-2 mt-lg-0"><li class="nav-item mr-4 mb-2 mb-lg-0"><a class=nav-link href=/en/overview/><span>Overview</span></a></li><li class="nav-item mr-4 mb-2 mb-lg-0"><a class=nav-link href=/en/docs3-v2/><span>SDK Manual</span></a></li><li class="nav-item mr-4 mb-2 mb-lg-0"><a class="nav-link active" href=/en/blog/><span class=active>Blog</span></a></li><li class="nav-item mr-4 mb-2 mb-lg-0"><a class=nav-link href=/en/download/><span>Download</span></a></li><li class="nav-item mr-4 mb-2 mb-lg-0"><a class=nav-link href=https://start.dubbo.apache.org/bootstrap.html target=_blank><span>Initializer</span><i class='fas fa-external-link-alt'></i></a></li><li class="nav-item dropdown d-lg-block"><a class="nav-link dropdown-toggle" href=# id=navbarDropdownMenuLink role=button data-toggle=dropdown aria-haspopup=true aria-expanded=false>English</a><div class="dropdown-menu dropdown-menu-right" aria-labelledby=navbarDropdownMenuLink><a class=dropdown-item href=/zh-cn/>中文</a></div></li><li class="nav-item dropdown d-lg-block"><div class="nav-item d-none d-lg-block"></div></li></ul></div></nav><section class="header-hero text-white pb-0 light-text"></section></header><div class="container-fluid td-outer"><div class=td-main><div class="row flex-md-nowrap"><div class="col-12 col-md-3 col-xl-2 td-sidebar d-print-none"><script>$(function(){$("#td-section-nav a").removeClass("active"),$("#td-section-nav #m-enblog20180807use-annotations-in-dubbo").addClass("active"),$("#td-section-nav #m-enblog20180807use-annotations-in-dubbo-li span").addClass("td-sidebar-nav-active-item"),$("#td-section-nav #m-enblog20180807use-annotations-in-dubbo").parents("li").addClass("active-path"),$("#td-section-nav li.active-path").addClass("show"),$("#td-section-nav li.active-path").children("input").prop("checked",!0),$("#td-section-nav #m-enblog20180807use-annotations-in-dubbo-li").siblings("li").addClass("show"),$("#td-section-nav #m-enblog20180807use-annotations-in-dubbo-li").children("ul").children("li").addClass("show"),$("#td-sidebar-menu").toggleClass("d-none")})</script><div id=td-sidebar-menu class="td-sidebar__inner d-none"><div id=content-mobile><form class="td-sidebar__search d-flex align-items-center"><button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type=button data-toggle=collapse data-target=#td-section-nav aria-controls=td-docs-nav aria-expanded=false aria-label="Toggle section navigation"></button></form></div><div id=content-desktop></div><nav class="collapse td-sidebar-nav foldable-nav" id=td-section-nav><ul class="td-sidebar-nav__section pr-md-3 ul-0"><li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id=m-enblog-li><ul class=ul-1><li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id=m-enblognews-li><input type=checkbox id=m-enblognews-check>
<label for=m-enblognews-check><a href=/en/blog/news/ title="Articles About Apache Dubbo" class="align-left pl-0 td-sidebar-link td-sidebar-link__section" id=m-enblognews><span>Articles</span></a></label><ul class="ul-2 foldable"><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20240131tracing-dubbo-with-opentelemetry-li><input type=checkbox id=m-enblog20240131tracing-dubbo-with-opentelemetry-check>
<label for=m-enblog20240131tracing-dubbo-with-opentelemetry-check><a href=/en/blog/2024/01/31/tracing-dubbo-with-opentelemetry/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20240131tracing-dubbo-with-opentelemetry><span>Tracing Dubbo With OpenTelemetry</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20231023introduction-to-apache-dubbo-plugin-for-intellij-idea-li><input type=checkbox id=m-enblog20231023introduction-to-apache-dubbo-plugin-for-intellij-idea-check>
<label for=m-enblog20231023introduction-to-apache-dubbo-plugin-for-intellij-idea-check><a href=/en/blog/2023/10/23/introduction-to-apache-dubbo-plugin-for-intellij-idea/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20231023introduction-to-apache-dubbo-plugin-for-intellij-idea><span>Introduction to Apache Dubbo plugin for IntelliJ IDEA</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20230415advanced-cloud-native-dubbo-32-officially-released-li><input type=checkbox id=m-enblog20230415advanced-cloud-native-dubbo-32-officially-released-check>
<label for=m-enblog20230415advanced-cloud-native-dubbo-32-officially-released-check><a href=/en/blog/2023/04/15/advanced-cloud-native-dubbo-3.2-officially-released/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20230415advanced-cloud-native-dubbo-32-officially-released><span>Advanced cloud native - Dubbo 3.2 officially released</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20220504how-to-proxy-dubbo-service-in-apache-shenyu-gateway-li><input type=checkbox id=m-enblog20220504how-to-proxy-dubbo-service-in-apache-shenyu-gateway-check>
<label for=m-enblog20220504how-to-proxy-dubbo-service-in-apache-shenyu-gateway-check><a href=/en/blog/2022/05/04/how-to-proxy-dubbo-service-in-apache-shenyu-gateway/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20220504how-to-proxy-dubbo-service-in-apache-shenyu-gateway><span>How to proxy Dubbo service in Apache ShenYu Gateway</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20220118makes-it-more-convenient-for-you-to-proxy-dubbo-services-in-apache-apisix-li><input type=checkbox id=m-enblog20220118makes-it-more-convenient-for-you-to-proxy-dubbo-services-in-apache-apisix-check>
<label for=m-enblog20220118makes-it-more-convenient-for-you-to-proxy-dubbo-services-in-apache-apisix-check><a href=/en/blog/2022/01/18/makes-it-more-convenient-for-you-to-proxy-dubbo-services-in-apache-apisix/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20220118makes-it-more-convenient-for-you-to-proxy-dubbo-services-in-apache-apisix><span>Makes it More Convenient for You to Proxy Dubbo Services in Apache APISIX</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20190826service-test-li><input type=checkbox id=m-enblog20190826service-test-check>
<label for=m-enblog20190826service-test-check><a href=/en/blog/2019/08/26/service-test/ title="Dubbo Admin service test" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20190826service-test><span>Service test in dubbo admin</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking-li><input type=checkbox id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking-check>
<label for=m-enblog20190811tracing-dubbo-service-with-apache-skywalking-check><a href=/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/ title="Tracing Dubbo service with Apache Skywalking" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking><span>Use apache skywalking in dubbo</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2-li><input type=checkbox id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2-check>
<label for=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2-check><a href=/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/ title="Dubbo extensible mechanism source code analysis - part 2" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2><span>Dubbo extensible mechanism - part 2</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1-li><input type=checkbox id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1-check>
<label for=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1-check><a href=/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/ title="Dubbo extensible mechanism source code analysis - part 1" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1><span>Dubbo extensible mechanism - part 1</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface-li><input type=checkbox id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface-check>
<label for=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface-check><a href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/ title="Implementation background and practice of Dubbo client asynchronous interface" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface><span>Dubbo Async Client</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface-li><input type=checkbox id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface-check>
<label for=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface-check><a href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/ title="Implementation background and practice of Dubbo server asynchronous interface" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface><span>Dubbo Async Server</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices-li><input type=checkbox id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices-check>
<label for=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices-check><a href=/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/ title="How to use Seata to ensure consistency between Dubbo Microservices" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices><span>Use Seata in Dubbo</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou-li><input type=checkbox id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou-check>
<label for=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou-check><a href=/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/ title="The fifth Dubbo meetup has been held in Hangzhou" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou><span>The fifth Dubbo meetup</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry-li><input type=checkbox id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry-check>
<label for=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry-check><a href=/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/ title="Dubbo Integrates with Nacos to Become a Registry" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry><span>Use Dubbo with Nacos</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20181005introduction-to-the-dubbo-protocol-li><input type=checkbox id=m-enblog20181005introduction-to-the-dubbo-protocol-check>
<label for=m-enblog20181005introduction-to-the-dubbo-protocol-check><a href=/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20181005introduction-to-the-dubbo-protocol><span>Introduction to the Dubbo protocol</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180930integrate-dubbo-with-kubernetes-li><input type=checkbox id=m-enblog20180930integrate-dubbo-with-kubernetes-check>
<label for=m-enblog20180930integrate-dubbo-with-kubernetes-check><a href=/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180930integrate-dubbo-with-kubernetes><span>Integrate Dubbo with Kubernetes</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180902how-to-prepare-an-apache-release-li><input type=checkbox id=m-enblog20180902how-to-prepare-an-apache-release-check>
<label for=m-enblog20180902how-to-prepare-an-apache-release-check><a href=/en/blog/2018/09/02/how-to-prepare-an-apache-release/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-prepare-an-apache-release><span>How to prepare an Apache Release</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo-li><input type=checkbox id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo-check>
<label for=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo-check><a href=/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/ title="How to implement a fully asynchronous calls chain based on Dubbo" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo><span>New Async Call</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu-li><input type=checkbox id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu-check>
<label for=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu-check><a href=/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/ title="The fourth Dubbo meetup has been held in Chengdu" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu><span>The fourth Dubbo meetup</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration-li><input type=checkbox id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration-check>
<label for=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration-check><a href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/ title=" Dubbo Basic Usage - Dubbo Consumer Configuration" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration><span>Dubbo Consumer Configuration</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke-li><input type=checkbox id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke-check>
<label for=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke-check><a href=/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/ title="Dubbo: Several ways about synchronous/asynchronous invoke" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke><span>Dubbo Invoke</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180814dubbo-basic-usage--dubbo-provider-configuration-li><input type=checkbox id=m-enblog20180814dubbo-basic-usage--dubbo-provider-configuration-check>
<label for=m-enblog20180814dubbo-basic-usage--dubbo-provider-configuration-check><a href=/en/blog/2018/08/14/dubbo-basic-usage--dubbo-provider-configuration/ title="Dubbo Basic Usage -- Dubbo Provider Configuration" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage--dubbo-provider-configuration><span>Dubbo Provider Configuration</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180814manipulating-services-dynamically-via-qos-li><input type=checkbox id=m-enblog20180814manipulating-services-dynamically-via-qos-check>
<label for=m-enblog20180814manipulating-services-dynamically-via-qos-check><a href=/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/ title="Manipulating Services Dynamically via QoS" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180814manipulating-services-dynamically-via-qos><span>Dubbo QoS Introduction</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop-li><input type=checkbox id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop-check>
<label for=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop-check><a href=/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/ title="Source code analysis of spring-boot+Dubbo App start and stop" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop><span>Dubbo start/stop in spring boot</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js-li><input type=checkbox id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js-check>
<label for=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js-check><a href=/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/ title="Implementation of cross-language calls by Dubbo2.js" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js><span>dubbo2.js introduction</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180814generic-invoke-of-dubbo-li><input type=checkbox id=m-enblog20180814generic-invoke-of-dubbo-check>
<label for=m-enblog20180814generic-invoke-of-dubbo-check><a href=/en/blog/2018/08/14/generic-invoke-of-dubbo/ title="Generic invoke of Dubbo" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180814generic-invoke-of-dubbo><span>Generic invoke</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180814native-image-using-graalvm-li><input type=checkbox id=m-enblog20180814native-image-using-graalvm-check>
<label for=m-enblog20180814native-image-using-graalvm-check><a href=/en/blog/2018/08/14/native-image-using-graalvm/ title="Native Image using GraalVM" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180814native-image-using-graalvm><span>Native Image</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180810dubbos-load-balance-li><input type=checkbox id=m-enblog20180810dubbos-load-balance-check>
<label for=m-enblog20180810dubbos-load-balance-check><a href=/en/blog/2018/08/10/dubbos-load-balance/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180810dubbos-load-balance><span>Dubbo's Load Balance</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180807use-annotations-in-dubbo-li><input type=checkbox id=m-enblog20180807use-annotations-in-dubbo-check>
<label for=m-enblog20180807use-annotations-in-dubbo-check><a href=/en/blog/2018/08/07/use-annotations-in-dubbo/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180807use-annotations-in-dubbo><span>Use Annotations In Dubbo</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180807using-zookeeper-in-dubbo-li><input type=checkbox id=m-enblog20180807using-zookeeper-in-dubbo-check>
<label for=m-enblog20180807using-zookeeper-in-dubbo-check><a href=/en/blog/2018/08/07/using-zookeeper-in-dubbo/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180807using-zookeeper-in-dubbo><span>Using Zookeeper in Dubbo</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180807dubbo-101-li><input type=checkbox id=m-enblog20180807dubbo-101-check>
<label for=m-enblog20180807dubbo-101-check><a href=/en/blog/2018/08/07/dubbo-101/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180807dubbo-101><span>Your First Dubbo Demo</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen-li><input type=checkbox id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen-check>
<label for=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen-check><a href=/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/ title="The third Dubbo meetup has been held in Shenzhen" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen><span>The third Dubbo meetup</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services-li><input type=checkbox id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services-check>
<label for=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services-check><a href=/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/ title="Sentinel: The flow sentinel of Dubbo services" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services><span>Introduce sentinel</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180712tracking-with-pinpoint-li><input type=checkbox id=m-enblog20180712tracking-with-pinpoint-check>
<label for=m-enblog20180712tracking-with-pinpoint-check><a href=/en/blog/2018/07/12/tracking-with-pinpoint/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180712tracking-with-pinpoint><span>Tracking with Pinpoint</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180701your-first-dubbo-filter-li><input type=checkbox id=m-enblog20180701your-first-dubbo-filter-check>
<label for=m-enblog20180701your-first-dubbo-filter-check><a href=/en/blog/2018/07/01/your-first-dubbo-filter/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180701your-first-dubbo-filter><span>Your First Dubbo Filter</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully-li><input type=checkbox id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully-check>
<label for=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully-check><a href=/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/ title="The second Dubbo Shanghai meetup has been held successfully" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully><span>The second Dubbo meetup</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing-li><input type=checkbox id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing-check>
<label for=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing-check><a href=/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/ title="The first Dubbo meetup has been held in Beijing" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing><span>The first Dubbo meetup</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180502the-apachecon-na-schedule-has-been-announced-li><input type=checkbox id=m-enblog20180502the-apachecon-na-schedule-has-been-announced-check>
<label for=m-enblog20180502the-apachecon-na-schedule-has-been-announced-check><a href=/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/ title="The ApacheCon NA schedule has been announced" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180502the-apachecon-na-schedule-has-been-announced><span>ApacheCon NA</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180425the-gsocgoogle-summer-of-code-2018-li><input type=checkbox id=m-enblog20180425the-gsocgoogle-summer-of-code-2018-check>
<label for=m-enblog20180425the-gsocgoogle-summer-of-code-2018-check><a href=/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/ title="The GSoC(Google Summer of Code) 2018" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180425the-gsocgoogle-summer-of-code-2018><span>GSoC 2018</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018-li><input type=checkbox id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018-check>
<label for=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018-check><a href=/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/ title="Dubbo roadmap is announced in QCon Beijing 2018" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018><span>QCon Beijing 2018</span></a></label></li></ul></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id=m-enblogproposals-li><input type=checkbox id=m-enblogproposals-check>
<label for=m-enblogproposals-check><a href=/en/blog/proposals/ title="Proposals About Apache Dubbo" class="align-left pl-0 td-sidebar-link td-sidebar-link__section" id=m-enblogproposals><span>Proposals</span></a></label><ul class="ul-2 foldable"><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog10101application-level-service-discovery-li><input type=checkbox id=m-enblog10101application-level-service-discovery-check>
<label for=m-enblog10101application-level-service-discovery-check><a href=/en/blog/1/01/01/application-level-service-discovery/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog10101application-level-service-discovery><span>Application-Level Service Discovery</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog10101enhanced-http-standard-capabilities-of-triple-protocol-li><input type=checkbox id=m-enblog10101enhanced-http-standard-capabilities-of-triple-protocol-check>
<label for=m-enblog10101enhanced-http-standard-capabilities-of-triple-protocol-check><a href=/en/blog/1/01/01/enhanced-http-standard-capabilities-of-triple-protocol/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog10101enhanced-http-standard-capabilities-of-triple-protocol><span>Enhanced HTTP Standard Capabilities of Triple Protocol</span></a></label></li></ul></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id=m-enblogreleases-li><input type=checkbox id=m-enblogreleases-check>
<label for=m-enblogreleases-check><a href=/en/blog/releases/ title="New Releases" class="align-left pl-0 td-sidebar-link td-sidebar-link__section" id=m-enblogreleases><span>Releases</span></a></label><ul class="ul-2 foldable"><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog202109202714-release-note-li><input type=checkbox id=m-enblog202109202714-release-note-check>
<label for=m-enblog202109202714-release-note-check><a href=/en/blog/2021/09/20/2.7.14-release-note/ title="2.7.14 Release Note" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog202109202714-release-note><span>2.7.14</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog202108233021-release-note-li><input type=checkbox id=m-enblog202108233021-release-note-check>
<label for=m-enblog202108233021-release-note-check><a href=/en/blog/2021/08/23/3.0.2.1-release-note/ title="3.0.2.1 Release Note" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog202108233021-release-note><span>3.0.2.1</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20210818302-release-note-li><input type=checkbox id=m-enblog20210818302-release-note-check>
<label for=m-enblog20210818302-release-note-check><a href=/en/blog/2021/08/18/3.0.2-release-note/ title="3.0.2 Release Note" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20210818302-release-note><span>3.0.2</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20210702301-release-note-li><input type=checkbox id=m-enblog20210702301-release-note-check>
<label for=m-enblog20210702301-release-note-check><a href=/en/blog/2021/07/02/3.0.1-release-note/ title="3.0.1 Release Note" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20210702301-release-note><span>3.0.1</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20200518past-releases-li><input type=checkbox id=m-enblog20200518past-releases-check>
<label for=m-enblog20200518past-releases-check><a href=/en/blog/2020/05/18/past-releases/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20200518past-releases><span>Past Releases</span></a></label></li></ul></li></ul></li></ul></nav></div></div><main class="col-12 col-md-9 col-xl-8 pl-md-5" role=main><nav aria-label=breadcrumb class=td-breadcrumbs><ol class=breadcrumb><li class=breadcrumb-item><a href=https://cn.dubbo.apache.org/en/blog/>Blog</a></li><li class=breadcrumb-item><a href=https://cn.dubbo.apache.org/en/blog/news/>Articles</a></li><li class="breadcrumb-item active" aria-current=page><a href=https://cn.dubbo.apache.org/en/blog/2018/08/07/use-annotations-in-dubbo/ aria-disabled=true class="btn-link disabled">Use Annotations In Dubbo</a></li></ol></nav><section id=deprecation-warning><div class="content deprecation-warning pageinfo outdated-blog"><p>This article is more than one year old. Older articles may contain outdated content. Check that the information in the page has not become incorrect since its publication.</p></div></section><div class=td-content><h1>Use Annotations In Dubbo</h1><div class=lead>This article will introduce you how to use annotations instead of XML to develop Dubbo applications, such as <code>@EnableDubbo</code>, <code>@Service</code> and <code>@Reference</code>.</div><div class="td-byline mb-4"><time datetime=2018-08-07 class=text-muted>Tuesday, August 07, 2018</time></div><header class=article-meta></header><p>With the widely promotion and implementation of Microservices Architecture, the Microservices Architecture represented by Spring Boot and Spring Cloud, in Java ecosystem, introduced some brand new programming model, like:</p><ul><li>Annotation-Driven</li><li>External Configuration</li><li>Auto-Configure</li></ul><p>New programming model have some advantages, for example, it does not require <code>XML</code> configuration, it can simplify deployment process, beyond that,it can promote development efficiency. In order to implement the microservice architecture better,Dubbo has provided more perfect support for the above three scenarios since version 2.5.8. This article focuses on introduce annotations rather than discuss the traditional XML configuration approach. There are two kinds of automatic assembly, external configuration and automatic assembly, will be introduced in another aricle.</p><h2 id=introduce-annotations>Introduce Annotations</h2><h3 id=enabledubbo>@EnableDubbo</h3><p>The annotations of <code>@EnableDubbo</code> is a combination of both <code>@EnableDubboConfig</code> and <code>@DubboComponentScan</code>.Related to the annotation driver is <code>@DubboComponentScan</code>.</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span><span style=color:#719e07>package</span> org.apache.dubbo.config.spring.context.annotation;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#268bd2>@EnableDubboConfig</span>
</span></span><span style=display:flex><span><span style=color:#268bd2>@DubboComponentScan</span>
</span></span><span style=display:flex><span><span style=color:#268bd2>public</span> <span style=color:#268bd2>@interface</span> EnableDubbo {
</span></span><span style=display:flex><span> <span style=color:#586e75>/**
</span></span></span><span style=display:flex><span><span style=color:#586e75> * Base packages to scan for annotated @Service classes.
</span></span></span><span style=display:flex><span><span style=color:#586e75> * &lt;p&gt;
</span></span></span><span style=display:flex><span><span style=color:#586e75> * Use {@link #scanBasePackageClasses()} for a type-safe alternative to String-based
</span></span></span><span style=display:flex><span><span style=color:#586e75> * package names.
</span></span></span><span style=display:flex><span><span style=color:#586e75> *
</span></span></span><span style=display:flex><span><span style=color:#586e75> * @return the base packages to scan
</span></span></span><span style=display:flex><span><span style=color:#586e75> * @see DubboComponentScan#basePackages()
</span></span></span><span style=display:flex><span><span style=color:#586e75> */</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>@AliasFor</span>(annotation <span style=color:#719e07>=</span> DubboComponentScan.class, attribute <span style=color:#719e07>=</span> <span style=color:#2aa198>&#34;basePackages&#34;</span>)
</span></span><span style=display:flex><span> String<span style=color:#719e07>[]</span> <span style=color:#268bd2>scanBasePackages</span>() <span style=color:#719e07>default</span> {};
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#586e75>/**
</span></span></span><span style=display:flex><span><span style=color:#586e75> * Type-safe alternative to {@link #scanBasePackages()} for specifying the packages to
</span></span></span><span style=display:flex><span><span style=color:#586e75> * scan for annotated @Service classes. The package of each class specified will be
</span></span></span><span style=display:flex><span><span style=color:#586e75> * scanned.
</span></span></span><span style=display:flex><span><span style=color:#586e75> *
</span></span></span><span style=display:flex><span><span style=color:#586e75> * @return classes from the base packages to scan
</span></span></span><span style=display:flex><span><span style=color:#586e75> * @see DubboComponentScan#basePackageClasses
</span></span></span><span style=display:flex><span><span style=color:#586e75> */</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>@AliasFor</span>(annotation <span style=color:#719e07>=</span> DubboComponentScan.class, attribute <span style=color:#719e07>=</span> <span style=color:#2aa198>&#34;basePackageClasses&#34;</span>)
</span></span><span style=display:flex><span> Class<span style=color:#719e07>&lt;?&gt;[]</span> scanBasePackageClasses() <span style=color:#719e07>default</span> {};
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p>The <code>@bableDubbo</code> can be used to scan Dubbo&rsquo;s service provider (marked by <code>@Service</code>) and Dubbo&rsquo;s service consumer (marked by <code>Reference</code>) under the specified package name (via <code>scanBasePackages</code>) or in the specified class (via <code>scanBasePackageClasses</code>). After Dubbo&rsquo;s service providers and consumers have been scanned, they have been assembled corresponding and been initialized, and finally the service is exposed or referenced, if you do not use <code>External Configuration</code>, you can use <code>@DubboComponentScan</code> directly.</p><h3 id=service>@Service</h3><p><code>@service</code> is used to configure Dubbo&rsquo;s Service provider,for example:</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span><span style=color:#268bd2>@Service</span>
</span></span><span style=display:flex><span><span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>AnnotatedGreetingService</span> <span style=color:#268bd2>implements</span> GreetingService {
</span></span><span style=display:flex><span> <span style=color:#268bd2>public</span> String <span style=color:#268bd2>sayHello</span>(String name) {
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span> <span style=color:#2aa198>&#34;hello, &#34;</span> <span style=color:#719e07>+</span> name;
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p>Via <code>@Service</code>&rsquo;s properties, you can customize Dubbo&rsquo;s Service provider:</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span><span style=color:#719e07>package</span> org.apache.dubbo.config.annotation;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#268bd2>@Documented</span>
</span></span><span style=display:flex><span><span style=color:#268bd2>@Retention</span>(RetentionPolicy.RUNTIME)
</span></span><span style=display:flex><span><span style=color:#268bd2>@Target</span>({ElementType.TYPE}) <span style=color:#586e75>// #1</span>
</span></span><span style=display:flex><span><span style=color:#268bd2>@Inherited</span>
</span></span><span style=display:flex><span><span style=color:#268bd2>public</span> <span style=color:#268bd2>@interface</span> Service {
</span></span><span style=display:flex><span> Class<span style=color:#719e07>&lt;?&gt;</span> interfaceClass() <span style=color:#719e07>default</span> <span style=color:#dc322f>void</span>.class; <span style=color:#586e75>// #2</span>
</span></span><span style=display:flex><span> String <span style=color:#268bd2>interfaceName</span>() <span style=color:#719e07>default</span> <span style=color:#2aa198>&#34;&#34;</span>; <span style=color:#586e75>// #3</span>
</span></span><span style=display:flex><span> String <span style=color:#268bd2>version</span>() <span style=color:#719e07>default</span> <span style=color:#2aa198>&#34;&#34;</span>; <span style=color:#586e75>// #4</span>
</span></span><span style=display:flex><span> String <span style=color:#268bd2>group</span>() <span style=color:#719e07>default</span> <span style=color:#2aa198>&#34;&#34;</span>; <span style=color:#586e75>// #5</span>
</span></span><span style=display:flex><span> <span style=color:#dc322f>boolean</span> <span style=color:#268bd2>export</span>() <span style=color:#719e07>default</span> <span style=color:#cb4b16>true</span>; <span style=color:#586e75>// #6</span>
</span></span><span style=display:flex><span> <span style=color:#dc322f>boolean</span> <span style=color:#268bd2>register</span>() <span style=color:#719e07>default</span> <span style=color:#cb4b16>true</span>; <span style=color:#586e75>// #7</span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> String <span style=color:#268bd2>application</span>() <span style=color:#719e07>default</span> <span style=color:#2aa198>&#34;&#34;</span>; <span style=color:#586e75>// #8</span>
</span></span><span style=display:flex><span> String <span style=color:#268bd2>module</span>() <span style=color:#719e07>default</span> <span style=color:#2aa198>&#34;&#34;</span>; <span style=color:#586e75>// #9</span>
</span></span><span style=display:flex><span> String <span style=color:#268bd2>provider</span>() <span style=color:#719e07>default</span> <span style=color:#2aa198>&#34;&#34;</span>; <span style=color:#586e75>// #10</span>
</span></span><span style=display:flex><span> String<span style=color:#719e07>[]</span> <span style=color:#268bd2>protocol</span>() <span style=color:#719e07>default</span> {}; <span style=color:#586e75>// #11</span>
</span></span><span style=display:flex><span> String <span style=color:#268bd2>monitor</span>() <span style=color:#719e07>default</span> <span style=color:#2aa198>&#34;&#34;</span>; <span style=color:#586e75>// #12</span>
</span></span><span style=display:flex><span> String<span style=color:#719e07>[]</span> <span style=color:#268bd2>registry</span>() <span style=color:#719e07>default</span> {}; <span style=color:#586e75>// #13</span>
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p>Which is more important:</p><ol><li><strong>@Service</strong>: Can only be defined on a class, represent a service</li><li><strong>interfaceClass</strong>: specified <code>interface</code>&rsquo;s class implemented by the service provider</li><li><strong>interfaceName</strong>: specified <code>interface</code>&rsquo;s class name implemented by the service provider</li><li><strong>version</strong>: specified the version number of the service</li><li><strong>group</strong>:specified the group of services</li><li><strong>export</strong>:whether to expose service</li><li><strong>registry</strong>:Whether to register service to the registry</li><li><strong>application</strong>:application configuration</li><li><strong>module</strong>:module configuration</li><li><strong>provider</strong>:service provider configuration</li><li><strong>protocol</strong>:protocol configuration</li><li><strong>monitor</strong>:monitoring center configuration</li><li><strong>registr</strong>:registry configuration</li></ol><p>In addition, it should be noted that, <code>application</code>, <code>module</code>, <code>provider</code>, <code>protocol</code>, <code>monitor</code>, <code>registry</code> (from 8 to 13) need to provide the name of the corresponding <code>spring bean</code>,These bean assembly completed either through traditional XML configuration,or by the modern Java Config. This article will show you how to use <code>Java Config</code>.</p><h3 id=reference>@Reference</h3><p><code>@Reference</code> is used to configure Dubbo&rsquo;s Service consumer,for example:</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-Java data-lang=Java><span style=display:flex><span><span style=color:#268bd2>@Component</span>
</span></span><span style=display:flex><span><span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>GreetingServiceConsumer</span> {
</span></span><span style=display:flex><span> <span style=color:#268bd2>@Reference</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>private</span> GreetingService greetingService;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>public</span> String <span style=color:#268bd2>doSayHello</span>(String name) {
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span> greetingService.sayHello(name);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p>Via <code>@Reference</code>&rsquo;s properties, you can customize Dubbo&rsquo;s Service consumer:</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-Java data-lang=Java><span style=display:flex><span><span style=color:#719e07>package</span> org.apache.dubbo.config.annotation;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#268bd2>@Documented</span>
</span></span><span style=display:flex><span><span style=color:#268bd2>@Retention</span>(RetentionPolicy.RUNTIME)
</span></span><span style=display:flex><span><span style=color:#268bd2>@Target</span>({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE}) <span style=color:#586e75>// #1</span>
</span></span><span style=display:flex><span><span style=color:#268bd2>public</span> <span style=color:#268bd2>@interface</span> Reference {
</span></span><span style=display:flex><span> Class<span style=color:#719e07>&lt;?&gt;</span> interfaceClass() <span style=color:#719e07>default</span> <span style=color:#dc322f>void</span>.class; <span style=color:#586e75>// #2</span>
</span></span><span style=display:flex><span> String <span style=color:#268bd2>interfaceName</span>() <span style=color:#719e07>default</span> <span style=color:#2aa198>&#34;&#34;</span>; <span style=color:#586e75>// #3</span>
</span></span><span style=display:flex><span> String <span style=color:#268bd2>version</span>() <span style=color:#719e07>default</span> <span style=color:#2aa198>&#34;&#34;</span>; <span style=color:#586e75>// #4</span>
</span></span><span style=display:flex><span> String <span style=color:#268bd2>group</span>() <span style=color:#719e07>default</span> <span style=color:#2aa198>&#34;&#34;</span>; <span style=color:#586e75>// #5</span>
</span></span><span style=display:flex><span> String <span style=color:#268bd2>url</span>() <span style=color:#719e07>default</span> <span style=color:#2aa198>&#34;&#34;</span>; <span style=color:#586e75>// #6</span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> String <span style=color:#268bd2>application</span>() <span style=color:#719e07>default</span> <span style=color:#2aa198>&#34;&#34;</span>; <span style=color:#586e75>// #7</span>
</span></span><span style=display:flex><span> String <span style=color:#268bd2>module</span>() <span style=color:#719e07>default</span> <span style=color:#2aa198>&#34;&#34;</span>; <span style=color:#586e75>// #8</span>
</span></span><span style=display:flex><span> String <span style=color:#268bd2>consumer</span>() <span style=color:#719e07>default</span> <span style=color:#2aa198>&#34;&#34;</span>; <span style=color:#586e75>// #9</span>
</span></span><span style=display:flex><span> String <span style=color:#268bd2>protocol</span>() <span style=color:#719e07>default</span> <span style=color:#2aa198>&#34;&#34;</span>; <span style=color:#586e75>// #10</span>
</span></span><span style=display:flex><span> String <span style=color:#268bd2>monitor</span>() <span style=color:#719e07>default</span> <span style=color:#2aa198>&#34;&#34;</span>; <span style=color:#586e75>// #11</span>
</span></span><span style=display:flex><span> String<span style=color:#719e07>[]</span> <span style=color:#268bd2>registry</span>() <span style=color:#719e07>default</span> {}; <span style=color:#586e75>// #12</span>
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p>Which is more important:</p><ol><li><strong>@Reference</strong>:you can define it on a field in a class, you can define it on a method, you can even modify another annotation, it represent a reference to a service.Normally <code>@Reference</code> is defined in one field</li><li><strong>interfaceClass</strong> : specified <code>interface</code>&rsquo;s class implemented by the service provider</li><li><strong>interfaceName</strong>: specified <code>interface</code>&rsquo;s class name implemented by the service provider</li><li><strong>version</strong>: specified the version number of the service</li><li><strong>group</strong>:pecified the group of services</li><li><strong>url</strong>: invoking the registry directly by specifying the URL of the service provider</li><li><strong>application</strong>:application configuration</li><li><strong>module</strong>:module configuration</li><li><strong>consumer</strong>:service consumer configuration</li><li><strong>protocol</strong>:protocol configuration</li><li><strong>monitor</strong>:monitoring center configuration</li><li><strong>registr</strong>:registry configuration</li></ol><p>In addition, it should be noted that, <code>application</code>, <code>module</code>, <code>consumer</code>, <code>protocol</code>, <code>monitor</code>, <code>registry</code> (from 7 to 12) need to provide the name of the corresponding <code>spring bean</code>,These bean assembly completed either through traditional XML configuration,or by the modern Java Config. This article will show you how to use <code>Java Config</code>.</p><h2 id=example-practice>Example practice</h2><p>After learn what <code>@EnableDubbo</code>, <code>@Service</code>, <code>@Reference</code> is, there is a practical example showing how to use the annotation to develop a Dubbo application.The following code can be found at <a href=https://github.com/dubbo/dubbo-samples/tree/master/1-basic/dubbo-samples-annotation>https://github.com/dubbo/dubbo-samples/tree/master/1-basic/dubbo-samples-annotation</a></p><h3 id=1interface-definition>1.Interface Definition</h3><p>Define a simple <code>GreetingService</code> interface with only a simple method <code>sayHello</code> to the caller.</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-Java data-lang=Java><span style=display:flex><span><span style=color:#268bd2>public</span> <span style=color:#268bd2>interface</span> <span style=color:#268bd2>GreetingService</span> {
</span></span><span style=display:flex><span> String <span style=color:#268bd2>sayHello</span>(String name);
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><h3 id=2serverservice-implementation>2.Server:Service Implementation</h3><p>Implement the <code>GreetingService</code> interface, and mark it as a service for Dubbo via @Service.</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-Java data-lang=Java><span style=display:flex><span><span style=color:#268bd2>@Service</span>
</span></span><span style=display:flex><span><span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>AnnotatedGreetingService</span> <span style=color:#268bd2>implements</span> GreetingService {
</span></span><span style=display:flex><span> <span style=color:#268bd2>public</span> String <span style=color:#268bd2>sayHello</span>(String name) {
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span> <span style=color:#2aa198>&#34;hello, &#34;</span> <span style=color:#719e07>+</span> name;
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><h3 id=3serverassembly-service-provider>3.Server:Assembly Service Provider</h3><p>You can discover, assemble, and provide Dubbo&rsquo;s services through the Java config technology (@Configuration) and annotation scan (@EnableDubbo) in Spring.</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-Java data-lang=Java><span style=display:flex><span><span style=color:#268bd2>@Configuration</span>
</span></span><span style=display:flex><span><span style=color:#268bd2>@EnableDubbo</span>(scanBasePackages <span style=color:#719e07>=</span> <span style=color:#2aa198>&#34;com.alibaba.dubbo.samples.impl&#34;</span>)
</span></span><span style=display:flex><span><span style=color:#268bd2>static</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>ProviderConfiguration</span> {
</span></span><span style=display:flex><span> <span style=color:#268bd2>@Bean</span> <span style=color:#586e75>// #1</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>public</span> ProviderConfig <span style=color:#268bd2>providerConfig</span>() {
</span></span><span style=display:flex><span> ProviderConfig providerConfig <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> ProviderConfig();
</span></span><span style=display:flex><span> providerConfig.setTimeout(1000);
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span> providerConfig;
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>@Bean</span> <span style=color:#586e75>// #2</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>public</span> ApplicationConfig <span style=color:#268bd2>applicationConfig</span>() {
</span></span><span style=display:flex><span> ApplicationConfig applicationConfig <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> ApplicationConfig();
</span></span><span style=display:flex><span> applicationConfig.setName(<span style=color:#2aa198>&#34;dubbo-annotation-provider&#34;</span>);
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span> applicationConfig;
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>@Bean</span> <span style=color:#586e75>// #3</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>public</span> RegistryConfig <span style=color:#268bd2>registryConfig</span>() {
</span></span><span style=display:flex><span> RegistryConfig registryConfig <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> RegistryConfig();
</span></span><span style=display:flex><span> registryConfig.setProtocol(<span style=color:#2aa198>&#34;zookeeper&#34;</span>);
</span></span><span style=display:flex><span> registryConfig.setAddress(<span style=color:#2aa198>&#34;localhost&#34;</span>);
</span></span><span style=display:flex><span> registryConfig.setPort(2181);
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span> registryConfig;
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>@Bean</span> <span style=color:#586e75>// #4</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>public</span> ProtocolConfig <span style=color:#268bd2>protocolConfig</span>() {
</span></span><span style=display:flex><span> ProtocolConfig protocolConfig <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> ProtocolConfig();
</span></span><span style=display:flex><span> protocolConfig.setName(<span style=color:#2aa198>&#34;dubbo&#34;</span>);
</span></span><span style=display:flex><span> protocolConfig.setPort(20880);
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span> protocolConfig;
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p>Description:</p><ul><li>Scan all classes marked with <code>@Service</code> under <code>com.alibaba.dubbo.samples.impl</code> with <code>@EnableDubbo</code></li><li>Via @Configuration, all @Beans in the ProviderConfiguration are assembled using the way of <code>Java Config</code> and then injected into the Dubbo service, which means the class marked with <code>@Service</code>.Which included:
i. <strong>ProviderConfig</strong>:Service provider configuration
ii. <strong>ApplicationConfig</strong>:Application configuration
iii.<strong>RegistryConfig</strong>:registry configuration
iv. <strong>ProtocolConfig</strong>:Protocol configuration</li></ul><h3 id=4serverstart-service>4.Server:Start Service</h3><p>In the <code>main</code> method to provide external <code>Dubbo</code> service by starting a <code>Spring Context</code>.</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-Java data-lang=Java><span style=display:flex><span><span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>ProviderBootstrap</span> {
</span></span><span style=display:flex><span> <span style=color:#268bd2>public</span> <span style=color:#268bd2>static</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>main</span>(String<span style=color:#719e07>[]</span> args) <span style=color:#268bd2>throws</span> Exception {
</span></span><span style=display:flex><span> <span style=color:#719e07>new</span> EmbeddedZooKeeper(2181, <span style=color:#cb4b16>false</span>).start(); <span style=color:#586e75>// #1</span>
</span></span><span style=display:flex><span> AnnotationConfigApplicationContext context <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> AnnotationConfigApplicationContext(ProviderConfiguration.class); <span style=color:#586e75>// #2</span>
</span></span><span style=display:flex><span> context.start(); <span style=color:#586e75>// #3</span>
</span></span><span style=display:flex><span> System.in.read(); <span style=color:#586e75>// #4</span>
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p>Description:</p><ol><li>Start an embedded <code>zookeeper</code> and provide service registry on port <code>2181</code></li><li>Initialize an example of an AnnotationConfigApplicationContext and pass the <code>ProviderConfiguration</code> into the example to complete the automatic discovery and assembly of the <code>Dubbo</code> service.</li><li>Start the <code>Spring Context</code> and start providing external <code>Dubbo</code> services.</li><li>Because it is a server, you need to prevent the process exit by blocking the main thread.</li></ol><p>Start the <code>main</code> method of the server, you will see the following output, on behalf of the server startup success, and registered the <code>GreetingService</code> service in the <code>ZookeeperRegistry</code>:</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span><span style=color:#719e07>[</span>01/08/18 02:12:51:051 CST<span style=color:#719e07>]</span> main INFO transport.AbstractServer: <span style=color:#719e07>[</span>DUBBO<span style=color:#719e07>]</span> Start NettyServer <span style=color:#b58900>bind</span> /0.0.0.0:20880, <span style=color:#b58900>export</span> /192.168.99.1:20880, dubbo version: 2.6.2, current host: 192.168.99.1
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#719e07>[</span>01/08/18 02:12:51:051 CST<span style=color:#719e07>]</span> main INFO zookeeper.ZookeeperRegistry: <span style=color:#719e07>[</span>DUBBO<span style=color:#719e07>]</span> Register: dubbo://192.168.99.1:20880/com.alibaba.dubbo.samples.api.GreetingService?anyhost<span style=color:#719e07>=</span>true&amp;<span style=color:#268bd2>application</span><span style=color:#719e07>=</span>dubbo-annotation-provider&amp;default.timeout<span style=color:#719e07>=</span>1000&amp;<span style=color:#268bd2>dubbo</span><span style=color:#719e07>=</span>2.6.2&amp;<span style=color:#268bd2>generic</span><span style=color:#719e07>=</span>false&amp;<span style=color:#268bd2>interface</span><span style=color:#719e07>=</span>com.alibaba.dubbo.samples.api
</span></span></code></pre></div><h3 id=5serverreference-service>5.Server:Reference Service</h3><p>Marking the member variable of the <code>GreetingService</code> via <code>@Reference</code> .The <code>greetingService</code> is a reference to the <code>Dubbo</code> service, which means that it can simply provide through the interface to the remote party to initiate service calls, and the client does not implement <code>GreetingService</code> interface.</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-Java data-lang=Java><span style=display:flex><span><span style=color:#268bd2>@Component</span>(<span style=color:#2aa198>&#34;annotatedConsumer&#34;</span>)
</span></span><span style=display:flex><span><span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>GreetingServiceConsumer</span> {
</span></span><span style=display:flex><span> <span style=color:#268bd2>@Reference</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>private</span> GreetingService greetingService;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>public</span> String <span style=color:#268bd2>doSayHello</span>(String name) {
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span> greetingService.sayHello(name);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><h3 id=6serverassembly-service-consumer>6.Server:Assembly Service consumer</h3><p>Just like <strong>3. Server:Assembly Service Provider</strong> You can discover, assemble, and provide Dubbo&rsquo;s service consumer through the Java config technology (@Configuration) and annotation scan (@EnableDubbo) in Spring.</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-Java data-lang=Java><span style=display:flex><span><span style=color:#268bd2>@Configuration</span>
</span></span><span style=display:flex><span><span style=color:#268bd2>@EnableDubbo</span>(scanBasePackages <span style=color:#719e07>=</span> <span style=color:#2aa198>&#34;com.alibaba.dubbo.samples.action&#34;</span>)
</span></span><span style=display:flex><span><span style=color:#268bd2>@ComponentScan</span>(value <span style=color:#719e07>=</span> {<span style=color:#2aa198>&#34;com.alibaba.dubbo.samples.action&#34;</span>})
</span></span><span style=display:flex><span><span style=color:#268bd2>static</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>ConsumerConfiguration</span> {
</span></span><span style=display:flex><span> <span style=color:#268bd2>@Bean</span> <span style=color:#586e75>// #1</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>public</span> ApplicationConfig <span style=color:#268bd2>applicationConfig</span>() {
</span></span><span style=display:flex><span> ApplicationConfig applicationConfig <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> ApplicationConfig();
</span></span><span style=display:flex><span> applicationConfig.setName(<span style=color:#2aa198>&#34;dubbo-annotation-consumer&#34;</span>);
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span> applicationConfig;
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>@Bean</span> <span style=color:#586e75>// #2</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>public</span> ConsumerConfig <span style=color:#268bd2>consumerConfig</span>() {
</span></span><span style=display:flex><span> ConsumerConfig consumerConfig <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> ConsumerConfig();
</span></span><span style=display:flex><span> consumerConfig.setTimeout(3000);
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span> consumerConfig;
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>@Bean</span> <span style=color:#586e75>// #3</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>public</span> RegistryConfig <span style=color:#268bd2>registryConfig</span>() {
</span></span><span style=display:flex><span> RegistryConfig registryConfig <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> RegistryConfig();
</span></span><span style=display:flex><span> registryConfig.setProtocol(<span style=color:#2aa198>&#34;zookeeper&#34;</span>);
</span></span><span style=display:flex><span> registryConfig.setAddress(<span style=color:#2aa198>&#34;localhost&#34;</span>);
</span></span><span style=display:flex><span> registryConfig.setPort(2181);
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span> registryConfig;
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p>Description:</p><ul><li>Scan all classes marked with <code>@Service</code> under <code>com.alibaba.dubbo.samples.impl</code> with <code>@Reference</code></li><li>Via @Configuration, all @Beans in the ProviderConfiguration are assembled using the way of <code>Java Config</code> and then injected into the Dubbo service, which means the class marked with <code>@Reference</code>.Which included:
i. <code>ApplicationConfig</code>: Application configuration
ii. <code>ConsumerConfig</code>:Service consumer configuration
iii.<code>RegistryConfig</code>:Registry configuration.Note:The configuration here needs to be consistent with the configuration information of the EmbeddedZooKeeper when started by the service provider.</li></ul><h3 id=7server-initiate-remote-calls>7.Server: Initiate Remote Calls</h3><p>In the <code>main</code> method, you can start a <code>Spring Context</code> to find the service consumer of the assembled <code>Dubbo</code> from it, and initiate a remote call.</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-Java data-lang=Java><span style=display:flex><span><span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>ConsumerBootstrap</span> {
</span></span><span style=display:flex><span> <span style=color:#268bd2>public</span> <span style=color:#268bd2>static</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>main</span>(String<span style=color:#719e07>[]</span> args) {
</span></span><span style=display:flex><span> AnnotationConfigApplicationContext context <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> AnnotationConfigApplicationContext(ConsumerConfiguration.class); <span style=color:#586e75>// #1</span>
</span></span><span style=display:flex><span> context.start(); <span style=color:#586e75>// #2</span>
</span></span><span style=display:flex><span> GreetingServiceConsumer greetingServiceConsumer <span style=color:#719e07>=</span> context.getBean(GreetingServiceConsumer.class); <span style=color:#586e75>// #3</span>
</span></span><span style=display:flex><span> String hello <span style=color:#719e07>=</span> greetingServiceConsumer.doSayHello(<span style=color:#2aa198>&#34;annotation&#34;</span>); <span style=color:#586e75>// #4</span>
</span></span><span style=display:flex><span> System.out.println(<span style=color:#2aa198>&#34;result: &#34;</span> <span style=color:#719e07>+</span> hello); <span style=color:#586e75>// #5</span>
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p>Description:</p><ul><li>Initialize an example of an AnnotationConfigApplicationContext and pass the <code>ProviderConfiguration</code> into the example to complete the automatic discovery and assembly of the <code>Dubbo</code> service consumer.</li><li>start <code>Spring Context</code>.</li><li>Find <code>bean</code> which type is <code>GreetingServiceConsumer</code> from <code>Context</code>.</li><li>Call the <code>doSayHello</code> method and finally initiate a remote call via Dubbo&rsquo;s service reference (marked by @Reference)</li><li>Print call result
Start the Server&rsquo;s <code>main</code> method, you will see the following output, which returns the <code>result</code>: hello, annotation:</li></ul><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span><span style=color:#719e07>[</span>01/08/18 02:38:40:040 CST<span style=color:#719e07>]</span> main INFO config.AbstractConfig: <span style=color:#719e07>[</span>DUBBO<span style=color:#719e07>]</span> Refer dubbo service com.alibaba.dubbo.samples.api.GreetingService from url zookeeper://localhost:2181/com.alibaba.dubbo.registry.RegistryService?anyhost<span style=color:#719e07>=</span>true&amp;<span style=color:#268bd2>application</span><span style=color:#719e07>=</span>dubbo-annotation-consumer&amp;<span style=color:#268bd2>check</span><span style=color:#719e07>=</span>false&amp;default.timeout<span style=color:#719e07>=</span>3000&amp;<span style=color:#268bd2>dubbo</span><span style=color:#719e07>=</span>2.6.2&amp;<span style=color:#268bd2>generic</span><span style=color:#719e07>=</span>false&amp;<span style=color:#268bd2>interface</span><span style=color:#719e07>=</span>com.alibaba.dubbo.samples.api.GreetingService&amp;<span style=color:#268bd2>methods</span><span style=color:#719e07>=</span>sayHello&amp;<span style=color:#268bd2>pid</span><span style=color:#719e07>=</span>33001&amp;register.ip<span style=color:#719e07>=</span>192.168.99.1&amp;remote.timestamp<span style=color:#719e07>=</span>1533105502086&amp;<span style=color:#268bd2>side</span><span style=color:#719e07>=</span>consumer&amp;<span style=color:#268bd2>timestamp</span><span style=color:#719e07>=</span>1533105519216, dubbo version: 2.6.2, current host: 192.168.99.1
</span></span><span style=display:flex><span><span style=color:#719e07>[</span>01/08/18 02:38:40:040 CST<span style=color:#719e07>]</span> main INFO annotation.ReferenceBeanBuilder: &lt;dubbo:reference <span style=color:#268bd2>object</span><span style=color:#719e07>=</span><span style=color:#2aa198>&#34;com.alibaba.dubbo.common.bytecode.proxy0@673be18f&#34;</span> <span style=color:#268bd2>singleton</span><span style=color:#719e07>=</span><span style=color:#2aa198>&#34;true&#34;</span> <span style=color:#268bd2>interface</span><span style=color:#719e07>=</span><span style=color:#2aa198>&#34;com.alibaba.dubbo.samples.api.GreetingService&#34;</span> <span style=color:#268bd2>uniqueServiceName</span><span style=color:#719e07>=</span><span style=color:#2aa198>&#34;com.alibaba.dubbo.samples.api.GreetingService&#34;</span> <span style=color:#268bd2>generic</span><span style=color:#719e07>=</span><span style=color:#2aa198>&#34;false&#34;</span> <span style=color:#268bd2>id</span><span style=color:#719e07>=</span><span style=color:#2aa198>&#34;com.alibaba.dubbo.samples.api.GreetingService&#34;</span> /&gt; has been built.
</span></span><span style=display:flex><span>result: hello, annotation
</span></span></code></pre></div><h2 id=conclusion>Conclusion</h2><p>By studying this article, the reader can master the basic concepts of <code>Dubbo</code>&rsquo;s exclusive <code>annotations</code> , <code>@EnableDubbo</code>, <code>@Service</code>, <code>@Reference</code>, and master it&rsquo;s basic usage through a simple <code>Dubbo</code> application.</p><p>In addition to traditional <code>XML</code> configuration, <code>Spring</code> offers more modern configurations such as annotation drivers, externalization, and auto-assembly.This article focuses on the development of <code>Dubbo</code> applications through annotations. You can be seen that annotation mode programming is more concise and simple than XML configuration. In future, we will introduce the use of externalization configuration and automatic assembly in <code>Dubbo</code> further.</p><ul class="list-unstyled d-flex justify-content-between align-items-center mb-0 pt-5"><li><a href=/en/blog/2018/08/07/using-zookeeper-in-dubbo/ aria-label="Previous - Using Zookeeper in Dubbo" class="btn btn-primary"><span class=mr-1></span>Previous</a></li><li><a href=/en/blog/2018/08/10/dubbos-load-balance/ aria-label="Next - Dubbo's Load Balance" class="btn btn-primary">Next<span class=ml-1></span></a></li></ul></div><div id=pre-footer><h2>Feedback</h2><p class=feedback--prompt>Was this page helpful?</p><button class="btn btn-primary mb-4 feedback--yes">Yes</button>
<button class="btn btn-primary mb-4 feedback--no">No</button></div><script>const yes=document.querySelector(".feedback--yes"),no=document.querySelector(".feedback--no");document.querySelectorAll(".feedback--link").forEach(e=>{e.href=e.href+window.location.pathname});const sendFeedback=e=>{gtag||console.log("!gtag"),gtag("event","click",{event_category:"Helpful",event_label:window.location.pathname,value:e})},disableButtons=()=>{yes.disabled=!0,yes.classList.add("feedback--button__disabled"),no.disabled=!0,no.classList.add("feedback--button__disabled")};yes.addEventListener("click",()=>{sendFeedback(1),disableButtons(),document.querySelector(".feedback--response").classList.remove("feedback--response__hidden")}),no.addEventListener("click",()=>{sendFeedback(0),disableButtons(),document.querySelector(".feedback--response").classList.remove("feedback--response__hidden")})</script></main><div class="d-none d-xl-block col-xl-2 td-toc d-print-none"><div class="td-page-meta ml-2 pb-1 pt-2 mb-0"><a href=https://github.com/apache/dubbo-website/edit/master/content/en/blog/news/dubbo-annotation.md target=_blank><i class="fa fa-edit fa-fw"></i> Edit this page</a>
<a href="https://github.com/apache/dubbo-website/new/master/content/en/blog/news/dubbo-annotation.md?filename=change-me.md&amp;value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+matter%22+section+at+the+top+of+the+page+%28weight+controls+how+its+ordered+amongst+other+pages+in+the+same+directory%3B+lowest+number+first%29.%0A%2A+Add+a+good+commit+message+at+the+bottom+of+the+page+%28%3C80+characters%3B+use+the+extended+description+field+for+more+detail%29.%0A%2A+Create+a+new+branch+so+you+can+preview+your+new+file+and+request+a+review+via+Pull+Request.%0A" target=_blank><i class="fa fa-edit fa-fw"></i> Create child page</a>
<a href="https://github.com/apache/dubbo-website/issues/new?title=Use%20Annotations%20In%20Dubbo" target=_blank><i class="fab fa-github fa-fw"></i> Create an issue</a>
<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i> Create project issue</a></div><nav id=TableOfContents><ul><li><a href=#introduce-annotations>Introduce Annotations</a><ul><li><a href=#enabledubbo>@EnableDubbo</a></li><li><a href=#service>@Service</a></li><li><a href=#reference>@Reference</a></li></ul></li><li><a href=#example-practice>Example practice</a><ul><li><a href=#1interface-definition>1.Interface Definition</a></li><li><a href=#2serverservice-implementation>2.Server:Service Implementation</a></li><li><a href=#3serverassembly-service-provider>3.Server:Assembly Service Provider</a></li><li><a href=#4serverstart-service>4.Server:Start Service</a></li><li><a href=#5serverreference-service>5.Server:Reference Service</a></li><li><a href=#6serverassembly-service-consumer>6.Server:Assembly Service consumer</a></li><li><a href=#7server-initiate-remote-calls>7.Server: Initiate Remote Calls</a></li></ul></li><li><a href=#conclusion>Conclusion</a></li></ul></nav><div class="taxonomy taxonomy-terms-cloud taxo-tags"><h5 class=taxonomy-title>Tags</h5><ul class=taxonomy-terms><li><a class=taxonomy-term href=https://cn.dubbo.apache.org/en/tags/ecosystem/ data-taxonomy-term=ecosystem><span class=taxonomy-label>ecosystem</span><span class=taxonomy-count>1</span></a></li><li><a class=taxonomy-term href=https://cn.dubbo.apache.org/en/tags/news/ data-taxonomy-term=news><span class=taxonomy-label>news</span><span class=taxonomy-count>1</span></a></li><li><a class=taxonomy-term href=https://cn.dubbo.apache.org/en/tags/opentelemetry/ data-taxonomy-term=opentelemetry><span class=taxonomy-label>OpenTelemetry</span><span class=taxonomy-count>1</span></a></li><li><a class=taxonomy-term href=https://cn.dubbo.apache.org/en/tags/tracing/ data-taxonomy-term=tracing><span class=taxonomy-label>tracing</span><span class=taxonomy-count>1</span></a></li></ul></div></div></div></div></div><footer class="bg-dark py-5 row d-print-none footer-margin-0"><div class="container-fluid mx-sm-5"><div class=row><div class="col-6 col-sm-4 text-xs-center order-sm-2"><ul class="list-inline mb-0"><li class="list-inline-item mx-2 h3" data-toggle=tooltip data-placement=top title="Dubbo mailing list archive" aria-label="Dubbo mailing list archive"><a class=text-white target=_blank rel="noopener noreferrer" href=https://lists.apache.org/list.html?dev@dubbo.apache.org><i class="fa fa-envelope"></i></a></li></ul></div><div class="col-6 col-sm-4 text-right text-xs-center order-sm-3"><ul class="list-inline mb-0"><li class="list-inline-item mx-2 h3" data-toggle=tooltip data-placement=top title=GitHub aria-label=GitHub><a class=text-white target=_blank rel="noopener noreferrer" href=https://github.com/apache/dubbo><i class="fab fa-github"></i></a></li><li class="list-inline-item mx-2 h3" data-toggle=tooltip data-placement=top title="Subscribe to mailing list" aria-label="Subscribe to mailing list"><a class=text-white target=_blank rel="noopener noreferrer" href=mailto:dev-subscribe@dubbo.apache.org><i class="fa fa-envelope"></i></a></li></ul></div><div class="col-12 col-sm-4 text-center py-2 order-sm-2"><small class=text-white>&copy; 2024 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation. All Rights Reserved</small></div></div></div></footer><div class="row pt-2 pb-2 footer-margin-0"><div class="container-fluid mx-sm-5"><div class=text-center id=my-footer><img alt=apache_logo src=/imgs/apache_logo.png><ul><li><a href=https://www.apache.org>Foundation</a></li><li><a href=https://www.apache.org/licenses/>License</a></li><li><a href=https://dubbo.apache.org/en/overview/notices/>Security</a></li><li><a href=https://www.apache.org/events/current-event>Events</a></li><li><a href=https://www.apache.org/foundation/sponsorship.html>Sponsorship</a></li><li><a href=https://privacy.apache.org/policies/privacy-policy-public.html>Privacy</a></li><li><a href=https://www.apache.org/foundation/thanks.html>Thanks</a></li></ul></div></div></div><script src=/js/popper.min.js integrity=sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49 crossorigin=anonymous></script><script src=/js/bootstrap.min.js integrity=sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy crossorigin=anonymous></script><script src=/js/main.min.b075178d232d3b0039b3cb6af2fc2e9d90071820167a60f4eea3a79169975ee8.js integrity="sha256-sHUXjSMtOwA5s8tq8vwunZAHGCAWemD07qOnkWmXXug=" crossorigin=anonymous></script><script async src=https://widget.kapa.ai/kapa-widget.bundle.js data-website-id=d763c4f2-f871-400b-aeca-d986c4af73c2 data-project-name="Apache Dubbo" data-project-color=#E8442E data-button-text="Ask AI" data-search-mode-enabled=true data-modal-open-on-command-k=true data-modal-disclaimer="The AI supports multiple languages, but it may not be accessible in China due to recaptcha, a proxy is required." data-project-logo=https://pbs.twimg.com/profile_images/1011849068283191302/FJbH5vbF_400x400.jpg data-modal-example-questions="What is Apache Dubbo?,How to run Apache Dubbo?" data-button-position-top data-button-position-right=20px data-button-position-bottom=200px data-button-position-left></script><script>(function(e,t,n,s){e[s]=e[s]||[];var a=t.getElementsByTagName(n)[0],i=t.createElement(n);i.async=!0,i.id="beacon-aplus",i.setAttribute("exparams","userid=&aplus&sidx=aplusSidex&ckx=aplusCkx"),i.src="//g.alicdn.com/alilog/mlog/aplus_v2.js",i.crossorigin="anonymous",a.parentNode.insertBefore(i,a)})(window,document,"script","aplus_queue"),function(e){var t=e.createElement("script");t.type="text/javascript",t.async=!0,t.src="//g.alicdn.com/aes/??tracker/3.3.4/index.js,tracker-plugin-pv/3.0.5/index.js,tracker-plugin-event/3.0.0/index.js,tracker-plugin-autolog/3.0.3/index.js,tracker-plugin-survey/3.0.3/index.js,tracker-plugin-jserror/3.0.3/index.js,tracker-plugin-resourceError/3.0.3/index.js",t.onload=function(){window.AES_CONFIG=window.AES_CONFIG||{env:"prod"},window.aes=new AES({pid:"zN245h",user_type:6}),window.AESPluginAutologConfig={exposure:"auto"},window.AEMPluginInstances=[aes.use(AESPluginPV,window.AESPluginPVConfig||{enableHistory:!0}),aes.use(AESPluginEvent,window.AESPluginEventConfig||{}),aes.use(AESPluginSurvey,window.AESPluginEventConfig||{}),aes.use(AESPluginAutolog,window.AESPluginAutologConfig||{}),aes.use(AESPluginJSError,window.AESPluginJSError||{}),aes.use(AESPluginResourceError,window.AESPluginResourceError||{})]},setTimeout(function(){e.getElementsByTagName("body")[0].appendChild(t)},800)}(document)</script></body></html>