写在开头:以前做过一些springboot项目,里面有已经配置好的springboot+mybaits配置,想拿过来直接用。
准备阶段,先下载了一个dubbo的demo,然后本地搭建了一个简单的dubbo,zk dubboadmin provide consumer都是在本地的,能在admin中看到服务提供者和消费者,哈哈哈,以为这样就可以了。
坑一,当想将以前的一个springboot改造的时候发现问题了,第一以前没有spring对应的配置文件,只有一个yml文件,现在dubbo中给的是一个xml,好吧想办法再通过applicationcontext加载它吧,然后配置好springboot这样不就兼容了两者了吗,后来各种jar包冲突,头痛。
坑二,dubbmo的容器有三种,选择那种比较合适呢,springboot自带tomcat的容器,是否也可以用这个呢,答案是可以的,不过我感觉我这边的使用方式不对。后面再研究一下。
误区,其实启动springboot用的比较多的是注解方式,很多东西都是通过各种注解来说明的比如@Service @Component @RestController 等这类注释,而dubbo是用过配置文件中的 <dubbo:service interface ***>等来实现的,可能是初用dubbo,没有了解其他方式,这是问题来了,加载了bean的时候需要用到springboot启动所扫描的Service服务怎么办能用注解直接使用吗,答案是否定的,因为springboot启动的时候在自己的tomcat中注解实例化的对象,而配置文件中的是用里一个context初始化的bean,这时如果你没有再配置文件中有显示的bean引用或者构造注入,调用的是默认的不带参数的构造函数,从而没有初始化那些注解,从而不能使用boot启动时候的那些bean。这时候有两种方式,第一修改配置文件,显示注入需要用到的bean,二通过参数传递,由于springboot启动后返回了context,可以直接getBean的方式直接获取想要的bean,这样就可以在dubbo中使用springboot启动的那些bean。浅薄理解,我计划实验一下,springboot在注解和配置文件同时存在的情况下spring的初始化情况,或者参考一下网上的整合方案,给朋友们趟一下看看会有哪些问题。实际上我一定要用boot的原因是我不想配置数据库连接的大量配置,我只想用简单的springboot的mapper注解功能,实现数据库访问。
好了,这篇博文会持续更新,请大家耐心等待。
一点点代码:
public static KeyWordSet bean;
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(Provider.class, args);
bean = run.getBean(KeyWordSet.class);
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("provider.xml");
System.out.println(context.getDisplayName() + ": here");
System.out.println(bean+"start");
}