背景:
A项目是一个SpringBoot架构的项目,是一个对外提供api服务,使用shiro作为权限管理,mybatis作为数据层。项目包名称com.cc.dd
B项目是一个Springmvc+mybatis架构的项目,分为四层,controller,service,dao,entity 4个模块,项目包名com.aaa.bbb,使用xml文件配置beans。
现在把B项目service,dao,entity 3个模块,使用maven编译3个jar包,在A项目中使用,能够让A项目调研B项目service层提供的服务。
问题1:SpringBoot如何管理引入的3个jar包,也就是SpringBoot如何初始化3个jar中的bean,只有初始化之后才能使用。
在springBoot启动类直接导入B项目管理管理beans的xml文件,因为B项目采用的spring+beans.xml的模式管理bean,所以初始化bean的工作全部都xml文件中配置,因此springBoot只需要根据xml文件就能够初始化B项目的实例。如下代码,xml文件根据项目实际名称配置。
@ImportResource(locations = {"classpath*:*-Context.xml"}) @SpringBootApplication public class Application extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
问题2 :如果A项目采用了spring注解的方式 管理Beans,配置方式就是下面这样了 。增加扫描A项目包的路径,因为springBoot默认只扫描启动内所在的包路径及其子目录,A项目的包结构和B项目完全不一样,如果不手动增加组件扫描路径,
SpringBoot不会主动数扫描你jar中的bean类的。
@SpringBootApplication @ComponentScan(basePackages={"com.cc.dd"}) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
问题3:由于A项目使用的mybatis,B项目也使用了mybatis,因此在项目启动的时候,会出现一个bean对应了多个SqlSessionFactory的问题,B项目的Dao无法选择唯一一个SqlSessionFactory,因此在B项目的创建SessionFactory的时候,增加@Primary 注解。
@Primary的意思是在多个相同的bean中,优先使用用@Primary注解的bean,因此B项目优先使用自己项目中的bean.