一、引入
  通过配置文件能配置的属性,在使用注解的方式中也可以通过注解的相应属性进行配置,但是通过注解的方式对指定的方法进行配置时会有一定的局限性。

二、SpringBoot与Dubbo整合的三种方式
 1、在SpringBoot的项目中导入dubbo-starter,在application.properties/application.yml中配置dubbo相关的属性,使用dubbo的@Service注解暴露服务,使用@Reference订阅服务,通常我们使用@EnableDubbo来启用dubbo,在老版本中也可以通过在application.properties文件中配置dubbo.scan.base-packages属性来启用dubbo(此时则不再需要使用@EnableDubbo注解):此时不需要dubbo的xml配置文件,但缺陷是无法做到方法级别的精确配置

dubbo.scan.base-packages=com.bdm.gmall

 2、保留dubbo的xml配置文件(比如concumer.xml和provider.xml):可进行方法级别的配置,此时不再需要在application.properties/application.yml文件中进行dubbo相关的配置,在暴露服务和订阅服务时也不再需要使用dubbo的@Service注解和@Reference注解(使用@Autowired就可以),也不需要在主配置类中使用@EnableDubbo注解来启用dubbo,只需要在主配置类中使用@ImportResource将dubbo的配置文件引入即可,以服务提供者为例:
 主配置类:

//@EnableDubbo
@ImportResource(locations="classpath:provider.xml")
@SpringBootApplication
public class BootUserServiceProviderApplication {

	public static void main(String[] args) {
		SpringApplication.run(BootUserServiceProviderApplication.class, args);
	}
}

 服务提供者实现类:不需要dubbo的@Service暴露服务,因为在配置文件中已经暴露了

@Component
//@Service //此注解是dubbo的暴露服务注解
public class UserServiceImpl implements UserService {

	public List<UserAddress> getUserAddressList(String userId) {
		UserAddress address1 = new UserAddress(1, "北京市昌平区宏福科技园综合楼3层", "1", "李老师", "010-56253825", "Y");
		UserAddress address2 = new UserAddress(2, "深圳市宝安区西部硅谷大厦B座3层(深圳分校)", "1", "王老师", "010-56253825", "N");
		return Arrays.asList(address1, address2);
	}
}

  总结:导入dubbo-starter,使用@ImportResource导入dubbo的配置文件
 3、完全使用注解,使用配置类将dubbo的配置以bean的方式注册到IOC容器,每一个dubbo的xml标签都有一个对应的Config类,比如dubbo:application的对应类为ApplicationConfig,dubbo:registry的对应类为RegistryConfig等,相当于将xml的配置转化为一个个的bean,同时在主配置类中指定dubbo的包扫描路径,另外需要使用dubbo的@Service注解暴露服务:
 配置类如下:其他配置可参见官网

@Configuration
public class DubboConfig {

	@Bean
	public ApplicationConfig applicationConfig() {
		ApplicationConfig config = new ApplicationConfig();
		config.setName("boot-user-service-provider");
		return config;
	}

	@Bean
	public RegistryConfig registryConfig() {
		RegistryConfig config = new RegistryConfig();
		config.setProtocol("zookeeper");
		config.setAddress("127.0.0.1:2181");
		return config;
	}

	@Bean
	public ServiceConfig<UserService> serviceConfig(UserService userService) {
		ServiceConfig<UserService> config = new ServiceConfig<UserService>();
		config.setInterface(UserService.class);
		config.setRef(userService);// 由于我们将UserService的实现加入到了IOC容器,所以可以这么写
		config.setVersion("1.0.0");

		// 配置mothod信息
		List<MethodConfig> methods = new ArrayList<>();
		MethodConfig mConfig = new MethodConfig();
		mConfig.setName("getUserAddressList");
		mConfig.setTimeout(1000);
		methods.add(mConfig);
		config.setMethods(methods);

		return config;
	}
}

 指定包扫描路径:可使用@EnableDubbo也可使用@DubboComponentScan

//@ImportResource(locations="classpath:provider.xml")
@EnableDubbo(scanBasePackages="com.bdm.gmall")
@SpringBootApplication
public class BootUserServiceProviderApplication {

	public static void main(String[] args) {
		SpringApplication.run(BootUserServiceProviderApplication.class, args);
	}
}

 使用dubbo的@Service暴露服务:

@Component
@Service //此注解是dubbo的暴露服务注解
public class UserServiceImpl implements UserService {

	public List<UserAddress> getUserAddressList(String userId) {
		UserAddress address1 = new UserAddress(1, "北京市昌平区宏福科技园综合楼3层", "1", "李老师", "010-56253825", "Y");
		UserAddress address2 = new UserAddress(2, "深圳市宝安区西部硅谷大厦B座3层(深圳分校)", "1", "王老师", "010-56253825", "N");
		return Arrays.asList(address1, address2);
	}
}