前言:

  以前我们在建项目的时候, 要么将所有的package建在一个项目里面, 在处理引用的时候, 真的很方便. 不用担心, 有些东西配置不到或者读取不到.

  或者, 将package独立出去, 到一个项目中或者子项目中. 这时候, 项目中的引用处理, 还是有些麻烦的. 不过好处更多, 不再表述.

  在 idea 里面, 推荐使用 多模块 建项目, 而不再是 eclipse 里面的那种方式. 那这里, 就试着将一个springboot 的项目拆分到子模块中去, 看看效果如何.

项目拆分:

1. 目录变化

  

2. 父项目

父pom.xml理论上来说, 应该是对子项目中的引用进行一个约束, 主要是版本约束.

所以父 pom.xm 中, 应该使用  dependencyManagement 来约束 子项目中 jar 包版本.

然后对于一些子项目都用得着的引用, 可以提到 父项目中去.

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5.  
  6. <groupId>cn.elvinle</groupId>
  7. <artifactId>parent</artifactId>
  8. <version>0.0.1-SNAPSHOT</version>
  9. <packaging>pom</packaging>
  10.  
  11. <name>parent</name>
  12. <description>Demo project for Spring Boot</description>
  13.  
  14. <parent>
  15. <groupId>org.springframework.boot</groupId>
  16. <artifactId>spring-boot-starter-parent</artifactId>
  17. <version>1.5.9.RELEASE</version>
  18. <relativePath/> <!-- lookup parent from repository -->
  19. </parent>
  20.  
  21. <modules>
  22. <module>pojo</module>
  23. <module>web</module>
  24. <module>dao</module>
  25. <module>service</module>
  26. <module>simpl</module>
  27. </modules>
  28.  
  29. <properties>
  30. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  31. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  32. <java.version>1.8</java.version>
  33. <druid.version>1.1.3</druid.version>
  34. <mybatis.boot.starter.version>1.3.1</mybatis.boot.starter.version>
  35. <mysql.connector.java.version>5.1.44</mysql.connector.java.version>
  36. </properties>
  37.  
  38. <dependencyManagement>
  39. <dependencies>
  40. <dependency>
  41. <groupId>com.alibaba</groupId>
  42. <artifactId>druid</artifactId>
  43. <version>${druid.version}</version>
  44. </dependency>
  45.  
  46. <dependency>
  47. <groupId>org.mybatis.spring.boot</groupId>
  48. <artifactId>mybatis-spring-boot-starter</artifactId>
  49. <version>${mybatis.boot.starter.version}</version>
  50. </dependency>
  51.  
  52. <dependency>
  53. <groupId>mysql</groupId>
  54. <artifactId>mysql-connector-java</artifactId>
  55. <version>${mysql.connector.java.version}</version>
  56. </dependency>
  57.  
  58. </dependencies>
  59. </dependencyManagement>
  60.  
  61. <!--申明依赖关系-->
  62. <dependencies>
  63. <dependency>
  64. <groupId>org.springframework.boot</groupId>
  65. <artifactId>spring-boot-starter-web</artifactId>
  66. </dependency>
  67.  
  68. <dependency>
  69. <groupId>org.springframework.boot</groupId>
  70. <artifactId>spring-boot-starter-test</artifactId>
  71. </dependency>
  72.  
  73. </dependencies>
  74.  
  75. <build>
  76. <plugins>
  77. <plugin>
  78. <groupId>org.springframework.boot</groupId>
  79. <artifactId>spring-boot-maven-plugin</artifactId>
  80. </plugin>
  81. </plugins>
  82. </build>
  83. </project>

3. 子项目 - pojo

3.1 pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5.  
  6. <parent>
  7. <groupId>cn.elvinle</groupId>
  8. <artifactId>parent</artifactId>
  9. <version>0.0.1-SNAPSHOT</version>
  10. </parent>
  11.  
  12. <groupId>cn.elvinle</groupId>
  13. <artifactId>pojo</artifactId>
  14. <version>0.0.1-SNAPSHOT</version>
  15. <packaging>jar</packaging>
  16.  
  17. <name>pojo</name>
  18. <description>Demo project for Spring Boot</description>
  19.  
  20. <properties>
  21. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  22. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  23. <java.version>1.8</java.version>
  24. </properties>
  25.  
  26. <build>
  27. <plugins>
  28. <plugin>
  29. <groupId>org.springframework.boot</groupId>
  30. <artifactId>spring-boot-maven-plugin</artifactId>
  31. </plugin>
  32. </plugins>
  33. </build>
  34. </project>

3.2 db实体

  1. package cn.elvinle.pojo;
  2.  
  3. /**
  4. * @author: elvin
  5. */
  6. public class User {
  7. private int id;
  8.  
  9. private String name;
  10.  
  11. public int getId() {
  12. return id;
  13. }
  14.  
  15. public void setId(int id) {
  16. this.id = id;
  17. }
  18.  
  19. public String getName() {
  20. return name;
  21. }
  22.  
  23. public void setName(String name) {
  24. this.name = name;
  25. }
  26. }

对于pojo和dao中的内容, 可以使用mybatis逆向工程生成, 可以省去很多麻烦.

4. 子项目 - dao

4.1 pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5.  
  6. <parent>
  7. <groupId>cn.elvinle</groupId>
  8. <artifactId>parent</artifactId>
  9. <version>0.0.1-SNAPSHOT</version>
  10. </parent>
  11.  
  12. <groupId>cn.elvinle</groupId>
  13. <artifactId>dao</artifactId>
  14. <version>0.0.1-SNAPSHOT</version>
  15. <packaging>jar</packaging>
  16.  
  17. <name>dao</name>
  18. <description>Demo project for Spring Boot</description>
  19.  
  20. <properties>
  21. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  22. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  23. <java.version>1.8</java.version>
  24. </properties>
  25.  
  26. <dependencies>
  27. <!-- 内部引用 -->
  28. <dependency>
  29. <groupId>cn.elvinle</groupId>
  30. <artifactId>pojo</artifactId>
  31. <version>0.0.1-SNAPSHOT</version>
  32. </dependency>
  33.  
  34. <!-- 外部引用 -->
  35. <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
  36. <dependency>
  37. <groupId>com.alibaba</groupId>
  38. <artifactId>druid</artifactId>
  39. </dependency>
  40.  
  41. <dependency>
  42. <groupId>mysql</groupId>
  43. <artifactId>mysql-connector-java</artifactId>
  44. </dependency>
  45.  
  46. <dependency>
  47. <groupId>org.mybatis.spring.boot</groupId>
  48. <artifactId>mybatis-spring-boot-starter</artifactId>
  49. </dependency>
  50. </dependencies>
  51.  
  52. <build>
  53. <plugins>
  54. <plugin>
  55. <groupId>org.springframework.boot</groupId>
  56. <artifactId>spring-boot-maven-plugin</artifactId>
  57. </plugin>
  58. </plugins>
  59. </build>
  60. </project>

4.2 mapper

UserMapper.java:

  1. public interface UserMapper {
  2. public List<User> getAll();
  3. }

UserMapper.xml:

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
  3. <mapper namespace="cn.elvinle.dao.mapper.UserMapper" >
  4.  
  5. <select id="getAll" resultType="cn.elvinle.pojo.User">
  6. select * from user
  7. </select>
  8.  
  9. </mapper>

5. 子项目 - service

5.1 pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5.  
  6. <parent>
  7. <groupId>cn.elvinle</groupId>
  8. <artifactId>parent</artifactId>
  9. <version>0.0.1-SNAPSHOT</version>
  10. </parent>
  11.  
  12. <groupId>cn.elvinle</groupId>
  13. <artifactId>service</artifactId>
  14. <version>0.0.1-SNAPSHOT</version>
  15. <packaging>jar</packaging>
  16.  
  17. <name>service</name>
  18. <description>Demo project for Spring Boot</description>
  19.  
  20. <properties>
  21. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  22. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  23. <java.version>1.8</java.version>
  24. </properties>
  25.  
  26. <dependencies>
  27. <dependency>
  28. <groupId>cn.elvinle</groupId>
  29. <artifactId>pojo</artifactId>
  30. <version>0.0.1-SNAPSHOT</version>
  31. </dependency>
  32. </dependencies>
  33.  
  34. <build>
  35. <plugins>
  36. <plugin>
  37. <groupId>org.springframework.boot</groupId>
  38. <artifactId>spring-boot-maven-plugin</artifactId>
  39. </plugin>
  40. </plugins>
  41. </build>
  42. </project>

5.2 UserService.java

  1. public interface UserService {
  2. public List<User> getAll();
  3. }

6. 子项目 - simpl

6.1 pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5.  
  6. <parent>
  7. <groupId>cn.elvinle</groupId>
  8. <artifactId>parent</artifactId>
  9. <version>0.0.1-SNAPSHOT</version>
  10. </parent>
  11.  
  12. <groupId>cn.elvinle</groupId>
  13. <artifactId>simpl</artifactId>
  14. <version>0.0.1-SNAPSHOT</version>
  15. <packaging>jar</packaging>
  16.  
  17. <name>simpl</name>
  18. <description>Demo project for Spring Boot</description>
  19.  
  20. <properties>
  21. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  22. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  23. <java.version>1.8</java.version>
  24. </properties>
  25.  
  26. <dependencies>
  27. <dependency>
  28. <groupId>cn.elvinle</groupId>
  29. <artifactId>pojo</artifactId>
  30. <version>0.0.1-SNAPSHOT</version>
  31. </dependency>
  32. <dependency>
  33. <groupId>cn.elvinle</groupId>
  34. <artifactId>service</artifactId>
  35. <version>0.0.1-SNAPSHOT</version>
  36. </dependency>
  37. <dependency>
  38. <groupId>cn.elvinle</groupId>
  39. <artifactId>dao</artifactId>
  40. <version>0.0.1-SNAPSHOT</version>
  41. </dependency>
  42. </dependencies>
  43.  
  44. <build>
  45. <plugins>
  46. <plugin>
  47. <groupId>org.springframework.boot</groupId>
  48. <artifactId>spring-boot-maven-plugin</artifactId>
  49. </plugin>
  50. </plugins>
  51. </build>
  52. </project>

6.2 UserSImpl

  1. @Service
  2. public class UserSImpl implements UserService {
  3.  
  4. @Autowired
  5. private UserMapper userMapper;
  6.  
  7. @Override
  8. public List<User> getAll() {
  9. System.out.println("UserSImpl getAll");
  10.  
  11. return userMapper.getAll();
  12. }
  13. }

7. 子项目 - web

关键的地方来了.

7.1 pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5.  
  6. <parent>
  7. <groupId>cn.elvinle</groupId>
  8. <artifactId>parent</artifactId>
  9. <version>0.0.1-SNAPSHOT</version>
  10. </parent>
  11.  
  12. <groupId>cn.elvinle</groupId>
  13. <artifactId>web</artifactId>
  14. <version>0.0.1-SNAPSHOT</version>
  15. <packaging>jar</packaging>
  16.  
  17. <name>web</name>
  18. <description>Demo project for Spring Boot</description>
  19.  
  20. <properties>
  21. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  22. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  23. <java.version>1.8</java.version>
  24. </properties>
  25.  
  26. <dependencies>
  27. <dependency>
  28. <groupId>cn.elvinle</groupId>
  29. <artifactId>simpl</artifactId>
  30. <version>0.0.1-SNAPSHOT</version>
  31. </dependency>
  32. </dependencies>
  33.  
  34. <build>
  35. <plugins>
  36. <plugin>
  37. <groupId>org.springframework.boot</groupId>
  38. <artifactId>spring-boot-maven-plugin</artifactId>
  39. </plugin>
  40. </plugins>
  41. </build>
  42. </project>

7.2 application.yml

  1. server:
  2. context-path: /parent
  3. port: 8080
  4.  
  5. mybatis:
  6. config-location: /mapper/*.xml
  7.  
  8. spring:
  9. datasource:
  10. username: root
  11. password: root
  12. url: jdbc:mysql://localhost:3306/shop?useUnicode=true&characterEncoding=utf-8
  13. driver-class-name: com.mysql.jdbc.Driver

7.3 控制器

  1. @RestController
  2. @RequestMapping("api")
  3. public class ApiController {
  4.  
  5. @Autowired
  6. private UserService userService;
  7.  
  8. @RequestMapping("index")
  9. public List<User> index(){
  10.  
  11. List<User> all = userService.getAll();
  12.  
  13. return all;
  14. }
  15. }

到目前为止, 没什么特别的, 都是正常修改, 接下来, 会出现与不分模块不同的地方.

7.4 入口处修改

  1. @ComponentScan({"cn.elvinle"})
  2. @SpringBootApplication
  3. public class WebApplication {
  4.  
  5. public static void main(String[] args) {
  6. SpringApplication.run(WebApplication.class, args);
  7. }
  8. }

这时候, 如果直接运行起程序, 是不会成功访问的. 原因在于, mybatis的自动化配置和自动化创建, 没有支持到多模块中.

这时候, 需要我们手动进行配置和创建.

7.5 Mybatis java 配置

  1. <!-- mybatis 的工厂 -->
  2. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  3. <property name="dataSource" ref="dataSource" />
  4. <property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml"/>
  5. <!-- 自动扫描mapping.xml文件 -->
  6. <!--<property name="mapperLocations" value="classpath:mapper/*.xml" />-->
  7. </bean>
  8.  
  9. <!-- DAO接口所在包名,Spring会自动查找其下的类 -->
  10. <bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  11. <property name="basePackage" value="cn.elvinle.bookshop.mapper" />
  12. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
  13. </bean>

可以对照着上面的配置文件, 进行java配置

MybatisConfig:

  1. @Configuration
  2. public class MybatisConfig {
  3.  
  4. @Value("${mybatis.config-location}")
  5. private String mapperLocationPattern;
  6.  
  7. @Bean
  8. @ConfigurationProperties(prefix = "spring.datasource")
  9. public DataSource dataSource(){return new com.alibaba.druid.pool.DruidDataSource();
  10. }
  11.  
  12. @Bean(name="sqlSessionFactory")
  13. public SqlSessionFactory sqlSessionFactory() throws Exception{
  14. SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
  15. sqlSessionFactoryBean.setDataSource(dataSource());
  16. PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
  17. sqlSessionFactoryBean.setMapperLocations(resolver.getResources(mapperLocationPattern));
  18. return sqlSessionFactoryBean.getObject();
  19. }
  20. }

MybatisMapperScannerConfig:

  1. @Configuration
  2. @AutoConfigureAfter(MybatisConfig.class)
  3. @MapperScan("cn.elvinle.dao.mapper")
  4. public class MybatisMapperScannerConfig {
  5. public MapperScannerConfigurer mapperScannerConfigurer(){
  6. MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
  7. mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
  8. mapperScannerConfigurer.setBasePackage("cn.elvinle.dao.mapper");
  9. return mapperScannerConfigurer;
  10. }
  11. }

OK, 到这里, 就可以把程序跑起来了, 看一下结果:

springboot 多模块 -- 将 dao(mybatis) 拆分出去的更多相关文章

  1. springboot 多模块 -- 将web拆分出去 - 流动计算架构

    前言: 之前将各层都拆分出去, 作为一个独立的可替换的子模块. 感觉比以前确实是灵活了一些. 不管是电商项目, 还是现在公司做的项目, 其中, 有很多的业务逻辑, 都是一样的, 但是由于不在一个系统中 ...

  2. springboot多模块开发以及整合dubbo\zookeeper进行服务管理

    之前研究了springboot单工程的使用,参考git地址:https://github.com/qiao-zhi/springboot-ssm 下面研究springboot多模块开发的过程. 1.模 ...

  3. 使用Gradle构建springboot多模块项目,并混合groovy开发

    idea设置本地gradle 打包: build.gradle //声明gradle脚本自身需要使用的资源,优先执行 buildscript { ext { springBootVersion = ' ...

  4. 使用IDEA构建Spring-boot多模块项目配置流程

    使用IDEA构建Spring-boot多模块项目配置流程 1.创建项目 点击Create New Project 在左侧选中Spring Initializer,保持默认配置,点击下一步. 在Grou ...

  5. Springboot 2.0.4 整合Mybatis出现异常Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required

    在使用Springboot 2.0.4 整合Mybatis的时候出现异常Property 'sqlSessionFactory' or 'sqlSessionTemplate' are require ...

  6. 记Spring搭建功能完整的个人博客「Oyster」全过程[其二] Idea中Maven+SpringBoot多模块项目开发的设计和各种坑(模块间依赖和打包问题)

    大家好嘞,今天闲着没事干开写写博客,记录一下Maven+SpringBoot的多模块设计和遇到的坑. 多模块设计 简单说明一下截止目前的需求: 需要RESTful API:对文章.标签.分类和评论等的 ...

  7. JAVA - SpringBoot项目引用generator生成 Mybatis文件

    JAVA - SpringBoot项目引用generator生成 Mybatis文件  在spring官网https://start.spring.io/自动生成springboot项目,这里选择项目 ...

  8. SpringBoot系列(五)Mybatis整合完整详细版

    SpringBoot系列(五)Mybatis整合 目录 mybatis简介 项目创建 entity dao service serviceImpl mapper controller 1. Mybat ...

  9. SpringBoot多模块项目打包问题

    项目结构图如下: 在SpringBoot多模块项目打包时遇见如下错误: 1.repackage failed: Unable to find main class -> [Help 1] 解决步 ...

随机推荐

  1. 中国移动物联网平台数据转发 c# 控制台程序

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.N ...

  2. Android Studio开发之Gradle科普

    我们以前开发都是用 Eclipse ,而 Eclipse 大家都知道是一种 IDE (集成开发环境),最初是用来做 Java 开发的,而 Android 是基于 Java 语言的,所以最初 Googl ...

  3. C语言中:static与extern对变量和函数的作用

    1.两者对全局变量 static对全局变量,表示定义一个内部变量 extern对全局变量,表示声明一个外部变量 说明: 1.内部变量:定义的变量只能在本文件中访问,不能被其他文件访问. 2.不同文件中 ...

  4. 6、GNU makefile工程管理学习的一个例子

    在之前我们已经学习了一个文件的编译过程,但是做过项目的都知道,一个工程中的源文件不计其数,其按类型.功能.模块会分别放在若干个目录中,而这些文件如何编译就需要有一个编译规则,虽然现在很多大型的项目都是 ...

  5. spfa负环判断

    正常spfa中加入time数组,循环判断一个点是否入队并更新了n次以上注意是 > n!!其余的没有什么问题 扩展的还有,寻找所有负环上的点,这个可以在spfa中time 发现负环的时候,对那个点 ...

  6. 使用PinYin4j.jar将汉字转换为拼音

    package com.Test.util; import net.sourceforge.pinyin4j.PinyinHelper; import net.sourceforge.pinyin4j ...

  7. [php-error-report]PHP Strict Standards: Only variables should be passed by reference

    // 报错代码:PHP Strict Standards: Only variables should be passed by reference $arr_userInfo['im_nation_ ...

  8. AreaHttpControllerSelector 对 Web Api 实现 Area 路由控制

    结合此文章:http://www.cnblogs.com/wuhuacong/p/5828038.html using System; using System.Collections.Concurr ...

  9. Redis常见使用说明

    1 概述Remote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统.Redis是一个开源的使用ANSI C语言编写. ...

  10. C# json字符串转为对象

    方法1: using System.Web.Script.Serialization; string ss = "{\"NewsCount\":\"3482\& ...