之前用xml配置的方式集成了dubbo,手动写了在service通过自定义注解的方式对数据源的选择进行读写分离的操作。
发布服务后,dubbo调用服务时,对有自定义注解的serviceImpl方法进行拦截,这个时候AOP是有效的。
今天想把项目架构改成springboot的接口,通过API发布dubbo服务,但是在调用的时候,发现AOP失效了,目前估计是代理的原因,具体还在排查。
最终排查的结果就是采用如下的方式,各种问题全部解决:
@Configuration
@Data
public class DubboProviderConfig implements InitializingBean, ApplicationContextAware {
private void fileServiceExport() {
ServiceBean<FileService> config = new ServiceBean<FileService>();
config.setRef(act.getBean(FileService.class));
setConfig(config, FileService.class);
MethodConfig method = new MethodConfig();
method.setName("save");
method.setRetries(0);
List<MethodConfig> methods = new ArrayList<MethodConfig>();
methods.add(method);
config.setMethods(methods);
config.setVersion("1.0.0");
config.setTimeout(1200000);
config.export();
}
private void setConfig(ServiceBean<?> serviceConfig, Class<?> c) {
serviceConfig.setApplication(applicationConfig());
serviceConfig.setRegistry(registryConfig());
serviceConfig.setProtocol(protocolConfig());
serviceConfig.setInterface(c);
}
@Override
public void afterPropertiesSet() throws Exception {
fileServiceExport();
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.act = applicationContext;
}
}
写一个单独的dubbo服务发布类,实现InitializingBean, ApplicationContextAware接口,在afterPropertiesSet方法中发布dubbo服务,这样就不需要在容器中注册ServiceBean<FileService>的bean了,而ServiceBean.setRef引用,直接引用spring的@service bean就行了。