diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..40a6a7e
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+/target
+/.settings
+/.project
+/.classpath
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..125794c
--- /dev/null
+++ b/README.md
@@ -0,0 +1,98 @@
+spring-boot-starter-dubbo
+===================================
+
+[中文版文档](https://github.com/alibaba/spring-boot-starter-dubbo/blob/master/README_zh.md)
+
+Spring Boot with dubbo support. Dubbo is an RPC framework.
+
+Support jdk version 1.6 or 1.6+
+
+(please import googlestyle-java.xml if you want to modify the code)
+
+### How to publish dubbo
+
+* add Dependencies:
+
+```xml
+
+ com.alibaba
+ spring-boot-starter-dubbo
+ 1.0.0-SNAPSHOT
+
+```
+* add dubbo configuration in application.properties, demo:
+
+```properties
+spring.dubbo.appname=spring-boot-starter-dubbo-provider-test
+spring.dubbo.registry=multicast://224.0.0.0:1111
+spring.dubbo.protocol=dubbo
+```
+
+* then add `@EnableDubboConfiguration` on Spring Boot Application, indicates that dubbo is enabled.(web or non-web application can use dubbo provider)
+
+```java
+@SpringBootApplication
+@EnableDubboConfiguration
+public class DubboProviderLauncher {
+ //...
+}
+```
+
+* code your dubbo service, add `@Service`(import com.alibaba.dubbo.config.annotation.Service) on your service class, and interfaceClass is the interface which will be published.
+
+```java
+@Service(interfaceClass = IHelloService.class)
+public class HelloServiceImpl implements IHelloService {
+ //...
+}
+```
+
+* start Spring Boot.
+
+
+### How to consume Dubbo
+
+* add Dependencies:
+
+```xml
+
+ com.alibaba
+ spring-boot-starter-dubbo
+ 1.0.0-SNAPSHOT
+
+```
+
+* add dubbo configuration in application.properties, demo:
+
+```properties
+spring.dubbo.appname=spring-boot-starter-dubbo-consumer-test
+spring.dubbo.registry=multicast://224.0.0.0:1111
+spring.dubbo.protocol=dubbo
+```
+
+* then add `@EnableDubboConfiguration` on Spring Boot Application
+
+```java
+@SpringBootApplication
+@EnableDubboConfiguration
+public class DubboConsumerLauncher {
+ //...
+}
+```
+
+* injection interface by the `@DubboConsumer` annotation.
+
+```java
+@Component
+public class HelloConsumer {
+ @DubboConsumer
+ private IHelloService iHelloService;
+
+}
+```
+
+### Reference
+
+* dubbo: http://dubbo.io/
+* spring-boot: http://projects.spring.io/spring-boot/
+* spring-boot-starter-dubbo: https://github.com/linux-china/spring-boot-dubbo
diff --git a/README_zh.md b/README_zh.md
new file mode 100644
index 0000000..b608e5a
--- /dev/null
+++ b/README_zh.md
@@ -0,0 +1,98 @@
+spring-boot-starter-dubbo
+===================================
+
+[English](https://github.com/alibaba/spring-boot-starter-dubbo/blob/master/README.md)
+
+Spring Boot with dubbo support. dubbo是一个RPC框架。
+
+支持jdk版本为1.6或者1.6+
+
+(在修改源码前,请导入googlestyle-java.xml以保证一致的代码格式)
+
+### 如何发布dubbo服务
+
+* 添加依赖:
+
+```xml
+
+ com.alibaba
+ spring-boot-starter-dubbo
+ 1.0.0-SNAPSHOT
+
+```
+
+* 在application.properties添加dubbo的相关配置信息,样例配置如下:
+
+```properties
+spring.dubbo.appname=spring-boot-starter-dubbo-provider-test
+spring.dubbo.registry=multicast://224.0.0.0:1111
+spring.dubbo.protocol=dubbo
+```
+
+* 接下来在Spring Boot Application的上添加`@EnableDubboConfiguration`, 表示要开启dubbo功能. (dubbo provider服务可以使用或者不使用web容器)
+
+```java
+@SpringBootApplication
+@EnableDubboConfiguration
+public class DubboProviderLauncher {
+ //...
+}
+```
+
+* 编写你的dubbo服务,只需要添加要发布的服务实现上添加`@Service`(import com.alibaba.dubbo.config.annotation.Service)注解 ,其中interfaceClass是要发布服务的接口.
+
+```java
+@Service(interfaceClass = IHelloService.class)
+public class HelloServiceImpl implements IHelloService {
+ //...
+}
+```
+
+* 启动你的Spring Boot应用,观察控制台,可以看到dubbo启动相关信息.
+
+
+### 如何消费Dubbo服务
+
+* 添加依赖:
+
+```xml
+
+ com.alibaba
+ spring-boot-starter-dubbo
+ 1.0.0-SNAPSHOT
+
+```
+
+* 在application.properties添加dubbo的相关配置信息,样例配置如下:
+
+```properties
+spring.dubbo.appname=spring-boot-starter-dubbo-consumer-test
+spring.dubbo.registry=multicast://224.0.0.0:1111
+spring.dubbo.protocol=dubbo
+```
+
+* 开启`@EnableDubboConfiguration`
+
+```java
+@SpringBootApplication
+@EnableDubboConfiguration
+public class DubboConsumerLauncher {
+ //...
+}
+```
+
+* 通过`@DubboConsumer`注入需要使用的interface.
+
+```java
+@Component
+public class HelloConsumer {
+ @DubboConsumer
+ private IHelloService iHelloService;
+}
+```
+
+### 参考文档
+
+* dubbo 介绍: http://dubbo.io/
+* spring-boot 介绍: http://projects.spring.io/spring-boot/
+* spring-boot-starter-dubbo 参考: https://github.com/linux-china/spring-boot-dubbo
diff --git a/googlestyle-java.xml b/googlestyle-java.xml
new file mode 100644
index 0000000..bf0ba90
--- /dev/null
+++ b/googlestyle-java.xml
@@ -0,0 +1,291 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..b00835c
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,105 @@
+
+ 4.0.0
+
+ com.alibaba
+ spring-boot-starter-dubbo
+ 1.0.0-SNAPSHOT
+ jar
+
+ spring-boot-starter-dubbo
+ https://github.com/xionghuiCoder/spring-boot-starter-dubbo
+
+
+ UTF-8
+ 1.6
+ 2.5.3
+ 1.3.5.RELEASE
+
+
+
+
+ com.alibaba
+ dubbo
+ ${dubbo.version}
+
+
+ org.springframework
+ spring
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+ true
+
+
+ org.springframework.boot
+ spring-boot-starter
+ true
+
+
+ junit
+ junit
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-dependencies
+ ${spring-boot-dependencies.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.3
+
+ ${project.build.sourceEncoding}
+
+ ${java.version}
+ true
+
+
+
+
+
+
+ scm:git:git@github.com:xionghuiCoder/spring-boot-starter-dubbo.git
+ scm:git:git@github.com:xionghuiCoder/spring-boot-starter-dubbo.git
+ https://github.com/xionghuiCoder/spring-boot-starter-dubbo
+
+
+
+
+ jackxiong
+ 熊辉
+ xionghui.xh@alibaba-inc.com
+
+ developer
+
+
+
+ Tom
+ 孙忠英
+ zhongying.sun@alibaba-inc.com
+
+ developer
+
+
+
+
diff --git a/src/main/java/com/alibaba/boot/dubbo/DubboAutoConfiguration.java b/src/main/java/com/alibaba/boot/dubbo/DubboAutoConfiguration.java
new file mode 100644
index 0000000..0fec854
--- /dev/null
+++ b/src/main/java/com/alibaba/boot/dubbo/DubboAutoConfiguration.java
@@ -0,0 +1,77 @@
+package com.alibaba.boot.dubbo;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import com.alibaba.boot.dubbo.endpoint.DubboEndpoint;
+import com.alibaba.boot.dubbo.endpoint.DubboOperationEndpoint;
+import com.alibaba.boot.dubbo.health.DubboHealthIndicator;
+import com.alibaba.boot.dubbo.metrics.DubboMetrics;
+import com.alibaba.dubbo.config.ApplicationConfig;
+import com.alibaba.dubbo.config.ProtocolConfig;
+import com.alibaba.dubbo.config.RegistryConfig;
+
+/**
+ * Dubbo common configuration
+ *
+ * @author xionghui
+ * @email xionghui.xh@alibaba-inc.com
+ * @since 1.0.0
+ */
+@Configuration
+@EnableConfigurationProperties(DubboProperties.class)
+public class DubboAutoConfiguration {
+ @Autowired
+ private DubboProperties properties;
+
+ @Bean
+ @ConditionalOnMissingBean
+ public ApplicationConfig dubboApplicationConfig() {
+ ApplicationConfig appConfig = new ApplicationConfig();
+ appConfig.setName(this.properties.getAppname());
+ return appConfig;
+ }
+
+ @Bean
+ @ConditionalOnMissingBean
+ public ProtocolConfig dubboProtocolConfig() {
+ ProtocolConfig protocolConfig = new ProtocolConfig();
+ protocolConfig.setName(this.properties.getProtocol());
+ protocolConfig.setPort(this.properties.getPort());
+ protocolConfig.setThreads(this.properties.getThreads());
+ return protocolConfig;
+ }
+
+ @Bean
+ @ConditionalOnMissingBean
+ public RegistryConfig dubboRegistryConfig() {
+ RegistryConfig registryConfig = new RegistryConfig();
+ registryConfig.setAddress(this.properties.getRegistry());
+ return registryConfig;
+ }
+
+ @Bean
+ public DubboHealthIndicator dubboHealthIndicator() {
+ return new DubboHealthIndicator();
+ }
+
+ @Bean
+ public DubboEndpoint dubboEndpoint() {
+ return new DubboEndpoint();
+ }
+
+ @Bean
+ public DubboMetrics dubboConsumerMetrics() {
+ return new DubboMetrics();
+ }
+
+
+ @Bean
+ public DubboOperationEndpoint dubboOperationEndpoint() {
+ return new DubboOperationEndpoint();
+ }
+
+}
diff --git a/src/main/java/com/alibaba/boot/dubbo/DubboConsumerAutoConfiguration.java b/src/main/java/com/alibaba/boot/dubbo/DubboConsumerAutoConfiguration.java
new file mode 100644
index 0000000..86d467f
--- /dev/null
+++ b/src/main/java/com/alibaba/boot/dubbo/DubboConsumerAutoConfiguration.java
@@ -0,0 +1,179 @@
+package com.alibaba.boot.dubbo;
+
+import java.lang.reflect.Field;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.BeanCreationException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.config.BeanPostProcessor;
+import org.springframework.boot.autoconfigure.AutoConfigureAfter;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import com.alibaba.boot.dubbo.annotation.DubboConsumer;
+import com.alibaba.boot.dubbo.annotation.EnableDubboConfiguration;
+import com.alibaba.boot.dubbo.domain.ClassIdBean;
+import com.alibaba.dubbo.config.ApplicationConfig;
+import com.alibaba.dubbo.config.RegistryConfig;
+import com.alibaba.dubbo.config.annotation.Service;
+import com.alibaba.dubbo.config.spring.ReferenceBean;
+
+/**
+ * DubboConsumerAutoConfiguration, use {@link Service#version} and {@link Service#timeout}
+ * properties.
+ *
+ * @author xionghui
+ * @email xionghui.xh@alibaba-inc.com
+ * @since 1.0.0
+ */
+@Configuration
+@ConditionalOnClass(Service.class)
+@ConditionalOnBean(annotation = EnableDubboConfiguration.class)
+@AutoConfigureAfter(DubboAutoConfiguration.class)
+@EnableConfigurationProperties(DubboProperties.class)
+public class DubboConsumerAutoConfiguration {
+ public static final Map DUBBO_REFERENCES_MAP =
+ new ConcurrentHashMap();
+
+ @Autowired
+ private ApplicationContext applicationContext;
+
+ @Autowired
+ private DubboProperties properties;
+
+ @Autowired
+ private ApplicationConfig applicationConfig;
+ @Autowired
+ private RegistryConfig registryConfig;
+
+ @Bean
+ public BeanPostProcessor beanPostProcessor() {
+ return new BeanPostProcessor() {
+ @Override
+ public Object postProcessBeforeInitialization(Object bean, String beanName)
+ throws BeansException {
+ Class> objClz = bean.getClass();
+ if (org.springframework.aop.support.AopUtils.isAopProxy(bean)) {
+ objClz = org.springframework.aop.support.AopUtils.getTargetClass(bean);
+ }
+
+ try {
+ for (Field field : objClz.getDeclaredFields()) {
+ DubboConsumer dubboConsumer = field.getAnnotation(DubboConsumer.class);
+ if (dubboConsumer != null) {
+ Class> type = field.getType();
+ ReferenceBean> consumerBean =
+ DubboConsumerAutoConfiguration.this.getConsumerBean(type, dubboConsumer);
+ String group = consumerBean.getGroup();
+ String version = consumerBean.getVersion();
+ ClassIdBean classIdBean = new ClassIdBean(type, group, version);
+ Object dubboReference =
+ DubboConsumerAutoConfiguration.DUBBO_REFERENCES_MAP.get(classIdBean);
+ if (dubboReference == null) {
+ synchronized (this) {
+ // double check
+ dubboReference =
+ DubboConsumerAutoConfiguration.DUBBO_REFERENCES_MAP.get(classIdBean);
+ if (dubboReference == null) {
+ consumerBean.setApplicationContext(
+ DubboConsumerAutoConfiguration.this.applicationContext);
+ consumerBean
+ .setApplication(DubboConsumerAutoConfiguration.this.applicationConfig);
+ RegistryConfig registry = consumerBean.getRegistry();
+ if (registry == null) {
+ consumerBean.setRegistry(DubboConsumerAutoConfiguration.this.registryConfig);
+ }
+ consumerBean
+ .setApplication(DubboConsumerAutoConfiguration.this.applicationConfig);
+ consumerBean.afterPropertiesSet();
+ // 理论上dubboReference不能为空,否则就会抛NullPointerException了
+ dubboReference = consumerBean.getObject();
+ DubboConsumerAutoConfiguration.DUBBO_REFERENCES_MAP.put(classIdBean,
+ dubboReference);
+ }
+ }
+ }
+ field.setAccessible(true);
+ field.set(bean, dubboReference);
+ field.setAccessible(false);
+ }
+ }
+ } catch (Exception e) {
+ throw new BeanCreationException(beanName, e);
+ }
+ return bean;
+ }
+
+ @Override
+ public Object postProcessAfterInitialization(Object bean, String beanName)
+ throws BeansException {
+ return bean;
+ }
+ };
+ }
+
+ /**
+ * 设置相关配置信息, @see DubboConsumer
+ *
+ * @param interfaceClazz
+ * @param dubboConsumer
+ * @return
+ * @throws BeansException
+ */
+ private ReferenceBean getConsumerBean(Class interfaceClazz, DubboConsumer dubboConsumer)
+ throws BeansException {
+ ReferenceBean consumerBean = new ReferenceBean();
+ consumerBean.setInterface(interfaceClazz);
+ String canonicalName = interfaceClazz.getCanonicalName();
+ consumerBean.setId(canonicalName);
+ String registry = dubboConsumer.registry();
+ if (registry != null && registry.length() > 0) {
+ RegistryConfig registryConfig = new RegistryConfig();
+ registryConfig.setAddress(registry);
+ consumerBean.setRegistry(registryConfig);
+ }
+ String group = dubboConsumer.group();
+ if (group == null || "".equals(group)) {
+ group = this.properties.getGroup();
+ }
+ if (group != null && !"".equals(group)) {
+ consumerBean.setGroup(group);
+ }
+ String version = dubboConsumer.version();
+ if (version == null || "".equals(version)) {
+ version = this.properties.getVersion();
+ }
+ if (version != null && !"".equals(version)) {
+ consumerBean.setVersion(version);
+ }
+ int timeout = dubboConsumer.timeout();
+ consumerBean.setTimeout(timeout);
+ String client = dubboConsumer.client();
+ consumerBean.setClient(client);
+ String url = dubboConsumer.url();
+ consumerBean.setUrl(url);
+ String protocol = dubboConsumer.protocol();
+ consumerBean.setProtocol(protocol);
+ boolean check = dubboConsumer.check();
+ consumerBean.setCheck(check);
+ boolean lazy = dubboConsumer.lazy();
+ consumerBean.setLazy(lazy);
+ int retries = dubboConsumer.retries();
+ consumerBean.setRetries(retries);
+ int actives = dubboConsumer.actives();
+ consumerBean.setActives(actives);
+ String loadbalance = dubboConsumer.loadbalance();
+ consumerBean.setLoadbalance(loadbalance);
+ boolean async = dubboConsumer.async();
+ consumerBean.setAsync(async);
+ boolean sent = dubboConsumer.sent();
+ consumerBean.setSent(sent);
+ return consumerBean;
+ }
+}
diff --git a/src/main/java/com/alibaba/boot/dubbo/DubboProperties.java b/src/main/java/com/alibaba/boot/dubbo/DubboProperties.java
new file mode 100644
index 0000000..f3533d2
--- /dev/null
+++ b/src/main/java/com/alibaba/boot/dubbo/DubboProperties.java
@@ -0,0 +1,107 @@
+package com.alibaba.boot.dubbo;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+/**
+ * dubbo properties
+ *
+ * @author xionghui
+ * @email xionghui.xh@alibaba-inc.com
+ * @since 1.0.0
+ */
+@ConfigurationProperties(prefix = "spring.dubbo")
+public class DubboProperties {
+ /**
+ * dubbo application name
+ */
+ private String appname;
+ /**
+ * dubbo registry address
+ */
+ private String registry;
+ /**
+ * communication protocol, default is dubbo
+ */
+ private String protocol = "dubbo";
+ /**
+ * dubbo listen port, default 20800
+ */
+ private int port = 20800;
+ /**
+ * dubbo thread count, default 200
+ */
+ private int threads = 200;
+
+ /**
+ * dubbo version, may override by {@link com.alibaba.dubbo.config.annotation.Service#version()}
+ */
+ private String version = "";
+
+ /**
+ * dubbo group, may override by {@link com.alibaba.dubbo.config.annotation.Service#group()}
+ */
+ private String group = "";
+
+ public String getAppname() {
+ return this.appname;
+ }
+
+ public void setAppname(String appname) {
+ this.appname = appname;
+ }
+
+ public String getRegistry() {
+ return this.registry;
+ }
+
+ public void setRegistry(String registry) {
+ this.registry = registry;
+ }
+
+ public String getProtocol() {
+ return this.protocol;
+ }
+
+ public void setProtocol(String protocol) {
+ this.protocol = protocol;
+ }
+
+ public int getPort() {
+ return this.port;
+ }
+
+ public void setPort(int port) {
+ this.port = port;
+ }
+
+ public int getThreads() {
+ return this.threads;
+ }
+
+ public void setThreads(int threads) {
+ this.threads = threads;
+ }
+
+ public String getVersion() {
+ return this.version;
+ }
+
+ public void setVersion(String version) {
+ this.version = version;
+ }
+
+ public String getGroup() {
+ return this.group;
+ }
+
+ public void setGroup(String group) {
+ this.group = group;
+ }
+
+ @Override
+ public String toString() {
+ return "DubboProperties [appname=" + this.appname + ", registry=" + this.registry
+ + ", protocol=" + this.protocol + ", port=" + this.port + ", threads=" + this.threads
+ + ", version=" + this.version + ", group=" + this.group + "]";
+ }
+}
diff --git a/src/main/java/com/alibaba/boot/dubbo/DubboProviderAutoConfiguration.java b/src/main/java/com/alibaba/boot/dubbo/DubboProviderAutoConfiguration.java
new file mode 100644
index 0000000..30271fb
--- /dev/null
+++ b/src/main/java/com/alibaba/boot/dubbo/DubboProviderAutoConfiguration.java
@@ -0,0 +1,92 @@
+package com.alibaba.boot.dubbo;
+
+import java.util.Map;
+
+import javax.annotation.PostConstruct;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.AutoConfigureAfter;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.Configuration;
+
+import com.alibaba.boot.dubbo.annotation.EnableDubboConfiguration;
+import com.alibaba.dubbo.config.ApplicationConfig;
+import com.alibaba.dubbo.config.ProtocolConfig;
+import com.alibaba.dubbo.config.RegistryConfig;
+import com.alibaba.dubbo.config.annotation.Service;
+import com.alibaba.dubbo.config.spring.ServiceBean;
+
+/**
+ * DubboProviderAutoConfiguration
+ *
+ * @author xionghui
+ * @email xionghui.xh@alibaba-inc.com
+ * @since 1.0.0
+ */
+@Configuration
+@ConditionalOnClass(Service.class)
+@ConditionalOnBean(annotation = EnableDubboConfiguration.class)
+@AutoConfigureAfter(DubboAutoConfiguration.class)
+@EnableConfigurationProperties(DubboProperties.class)
+public class DubboProviderAutoConfiguration {
+ @Autowired
+ private ApplicationContext applicationContext;
+
+ @Autowired
+ private DubboProperties properties;
+
+ @Autowired
+ private ApplicationConfig applicationConfig;
+
+ @Autowired
+ private ProtocolConfig protocolConfig;
+ @Autowired
+ private RegistryConfig registryConfig;
+
+ @PostConstruct
+ public void init() throws Exception {
+ Map beans = this.applicationContext.getBeansWithAnnotation(Service.class);
+ for (Map.Entry entry : beans.entrySet()) {
+ this.initProviderBean(entry.getKey(), entry.getValue());
+ }
+ }
+
+ public void initProviderBean(String beanName, Object bean) throws Exception {
+ Service service = this.applicationContext.findAnnotationOnBean(beanName, Service.class);
+ ServiceBean