Spring Boot提倡以JavaConfig的方式进行配置,就是使用注释来描述Bean配置的组件,从而取代让许多开发者诟病已久的xml配置方式。Spring Boot官方也提供了很多相关的JavaConfig例子,例如数据库配置,消息队列配置等。本文将提供一个JavaConfig配置Dubbo的例子。

  1import org.springframework.beans.factory.annotation.Value;
  2import org.springframework.context.annotation.Bean;
  3import org.springframework.context.annotation.Configuration;
  4import com.alibaba.dubbo.config.ApplicationConfig;
  5import com.alibaba.dubbo.config.MonitorConfig;
  6import com.alibaba.dubbo.config.ProtocolConfig;
  7import com.alibaba.dubbo.config.ProviderConfig;
  8import com.alibaba.dubbo.config.RegistryConfig;
  9import com.alibaba.dubbo.config.spring.AnnotationBean;
 10
 11@Configuration
 12public class DubboConfig {
 13
 14    // 应用名称
 15	public static final String APPLICATION_NAME = "spring-boot-demo";
 16	// 扫描service包路径
 17	public static final String ANNOTATION_PACKAGE = "com.cipher.springboot.service";
 18
 19    // 以下信息将从配置文件application.properties中读取                          
 20	@Value("${dubbo_registry_address}")
 21    private String registryAddress;
 22    @Value("${dubbo_port}")
 23	private int dubboPort;
 24	@Value("${dubbo_register}")
 25	private boolean dubboRegister;
 26
 27	/**
 28	 * 提供方应用信息,用于计算依赖关系
 29	 *
 30	 * @return
 31	 */
 32	@Bean
 33	public ApplicationConfig applicationConfig() {
 34		ApplicationConfig applicationConfig = new ApplicationConfig();
 35		applicationConfig.setName(APPLICATION_NAME);
 36		return applicationConfig;
 37	}
 38
 39	/**
 40	 * 与<dubbo:annotation/>相当.
 41     * 提供方扫描带有@com.alibaba.dubbo.config.annotation.
 42	 * Service的注解类
 43	 *
 44	 * @return
 45	 */
 46	@Bean
 47	public static AnnotationBean annotationBean() {
 48		AnnotationBean annotationBean = new AnnotationBean();
 49		annotationBean.setPackage(ANNOTATION_PACKAGE);
 50		return annotationBean;
 51	}
 52
 53	/**
 54	 * 使用zookeeper注册中心暴露服务地址
 55	 *
 56	 * @return
 57	 */
 58	@Bean
 59	public RegistryConfig registryConfig() {
 60		RegistryConfig registryConfig = new RegistryConfig();
 61		registryConfig.setAddress(registryAddress);
 62		registryConfig.setRegister(dubboRegister);
 63		return registryConfig;
 64	}
 65
 66	/**
 67	 * 用dubbo协议在指定端口暴露服务
 68	 *
 69	 * @return
 70	 */
 71	@Bean
 72	public ProtocolConfig protocolConfig() {
 73		ProtocolConfig protocolConfig = new ProtocolConfig("dubbo", dubboPort);
 74		// 默认为hessian2,但不支持无参构造函数类,而这种方式的效率很低
 75		protocolConfig.setSerialization("java");
 76		return protocolConfig;
 77	}
 78
 79	/**
 80	 * 监控中心配置,protocol="registry",表示从注册中心发现监控中心地址
 81	 *
 82	 * @return
 83	 */
 84	@Bean
 85	public MonitorConfig monitorConfig() {
 86		MonitorConfig monitorConfig = new MonitorConfig();
 87		monitorConfig.setProtocol("registry");
 88		return monitorConfig;
 89	}
 90
 91	/**
 92	 * 当ProtocolConfig和ServiceConfig某属性没有配置时,采用此缺省值
 93	 *
 94	 * @return
 95	 */
 96	@Bean
 97	public ProviderConfig providerConfig() {
 98		ProviderConfig providerConfig = new ProviderConfig();
 99		providerConfig.setTimeout(10000);
100		providerConfig.setThreadpool("fixed");
101		providerConfig.setThreads(100);
102		providerConfig.setAccepts(1000);
103		return providerConfig;
104	}
105}