概述
A作為被引用的項目,目錄結構如下:
可以看到A目錄中只有基礎的service類以及mybatis操作數據庫的相關文件,service類中包含查詢數據庫的方法。
Tips: 項目A也可以是一個包含啟動類和配置文件的Springboot項目,一般情況下只會將公共的方法和類提取打包成公共jar供其他項目引用,而且這里啟動類的配置對后續引用也會造成影響,不利於排查。所以不推薦使用,盡量刪除在被引用的項目無用的配置文件和test文件,在主項目中進行必要的配置。
A項目作為公共項目打成jar供其他項目引用,注意被引入的項目不能使用默認的maven-plugin打包,否則引入此jar包的項目編譯時會報找不到程序包的錯誤
需要替換成以下配置:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build>
配置完成后使用maven工具進行打包
成功之后可以看到本地maven倉庫中會出現上圖左邊標記出的jar,其他項目引用時,只需要在pom文件中使用上面的坐標引入依賴。
C項目引用A項目,目錄結構如下:
項目C作為主程序,需要有啟動類和配置文件,下面詳細說明一下啟動類的配置。
C項目本身只需要配置掃描當前項目的dao接口。因為@SpirngBootApplication默認包含了@ComponentScan注解並且處於其他類文件的根目錄,所以可以自動掃描到同級下面的所有@Service、@Controller類。
如果要掃描到A項目的類和接口就要添加A的目錄,寫法如下:
@MapperScan同時掃描A的dao接口和C項目的dao接口
@ComponentScan同時注冊A和C項目下需要被使用的類
這里如果MapperScan只掃描了C項目,那調用A的dao接口中的方法時,會初始化失敗項目無法啟動,
如果ComponentScan只掃描了A項目,那么訪問C項目的Controller會報404錯誤。
Tips:如果被引入的jar和主項目兩個項目的文件路徑全都一致的話,就不需要額外再配置掃描被引入的項目的目錄。
配置文件application.yml:
server: port: 8082 spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://**.**.**.***:3306/database?usessl = false&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true username: username password: password type: com.zaxxer.hikari.HikariDataSource hikari: minimum-idle: 5 maximum-pool-size: 15 auto-commit: true idle-timeout: 30000 pool-name: DatebookHikariCP max-lifetime: 1800000 connection-timeout: 30000 connection-test-query: SELECT 1 mybatis: configuration: mapUnderscoreToCamelCase: true call-setters-on-nulls: true # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl mapper-locations: classpath*:mapper/*.xml
這里對服務的端口、數據庫連接、mybatis進行了配置。
注意:如果引入的其它的jar並且要使用它對應的mapper/*.xml文件時,要修改mapper-locations配置,使用通配符掃描所有calsspath對應目錄下的mapper文件
mapper-locations: classpath*:mapper/*.xml
測試:CccController.java
/** * @ClassName CController * @Description 測試調用其他jar中的方法 * @Author Sue * @Create 2020/1/15 9:39 **/ @RestController @RequestMapping("/ccc") public class CcController { @Autowired private CcService ccService; @Autowired private AbcService abcService; @Autowired private AbcMapper abcMapper; @GetMapping("/test01") public Map<String, Object> test01() { Map<String, Object> res = new HashMap<>(); res.put("code", 200); //C項目service方法 res.put("c_service", ccService.queryOne()); //A項目的dao和service中的方法 res.put("abc_mapper", abcMapper.queryOne()); res.put("abc_service", abcService.queryOne()); return res; } }
我們在C項目的Controller中調用了C項目的查詢數據的方法和A項目查詢數據庫的方法,訪問接口成功返回數據,說明我們成功的在C項目中引用A項目並調用了其操作數據庫的方法。
{"code":200,"c_service":9419,"abc_service":9419,"abc_mapper":9419}
EOF