一、引入
通过配置文件能配置的属性,在使用注解的方式中也可以通过注解的相应属性进行配置,但是通过注解的方式对指定的方法进行配置时会有一定的局限性。
二、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);
}
}