Skip to main content

将基于Spring-Boot开发工程调整成多Maven-Module的实战总结

Submitted by taotao on Sun, 12/23/2018 - 08:47

概述

在基于Spring Boot开发的项目中,为了便于后期的维护, 需要将项目按照模块进行划分,先将项目按照业务逻辑模块进行划分, 然后根据划分的业务模块再基于Maven的Module形式组织工程。

下面主要记录我将UC项目中单Module的Spring Boot工程,调整成多Module的形式的过程, 以及碰到的问题和解决过程。

调整过程

将项目按照如下三个大的module进行划分: API/Core/Web, 其中API定义所有的模块的行为但是不定义如何实现的,Core是基于API中接口的具体实现, Web是提供Http接口服务模块。基于这个边界的定义,自然我们就有如下的上下关系:

    web
     ^
     |
     |
    core
     ^
     |
     |
    api

API模块举例说明,比如我们在该模块中,有一个子模块为api-authentication, 该模块主要定义了和用户认证逻辑的所有业务接口,比如:

public interface AuthenticationPolicy {

  boolean isSatisfied(AuthenticationBuilder builder) throws AccountSecurityException;

  boolean isSupport(int userType);

}

那么在Core模块中,有一个子模块为: core-authentication模块,其中有这个接口的一个实现类:

public class InternalUserPolicy implements AuthenticationPolicy {

  private UserService userService;

  public InternalUserPolicy(UserService userService) {
    this.userService = userService;
  }

  @Override
  public boolean isSatisfied(AuthenticationBuilder builder) throws AccountSecurityException {
       ......
       ......
   }

  @Override
  public boolean isSupport(int userType) {
    return userType == UserType.ACCOUNT_USER_INTERNAL_USER.getValue();
  }
}

在Web模块中,我们有LonginController,需要引用Polocy的实现类,那么我们就需要将该对象 加入到Spring IOC中去,如何加入? 根据Spring Boot的规范,我们在core-authentication模块的 src/main/resources目录下新增文件:META-INF/spring.factories,添加如下内容:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=your.package.AuthenticationConfiguration

并在core-authentication模块中新增加your.package.AuthenticationConfiguration,该文件有如下的定义:

  @Bean
  public InternalUserPolicy getInternalUserPolicy() {
    return new InternalUserPolicy(userService);
  }

通过如上的方式,我们就可以让凡是引用core-authentication模块的spring-boot工程自动装配Policy对象到IOC中,

于是在Web模块的子模块中引用该模块即可。

在Web模块下,设计出的如下的子模块:

web-api-user-login
web-api-user-dashboard
web-api-privilege-checking
web-watchdog
web-configuration
......

其中所有含有web-api字符的模块,都含有controller接口,提供Http接口给外部调用。 那我们如何将一个多Maven Module的工程,以Spring-Boot工程的形式启动? Spring Boot工程需要有一个默认的启动类,以及对应的配置类,默认是通过扫描启动类包路经 下的class文件来启动工程。

在Web模块下面有web-configuration子模块,这个模块的意图是装配所有在web模块下的子模块的配置对象到IOC中, 那么就需能够要让Spring Boot工程加载web-configuration模块, 因此就需要在web-configuration模块中,将自身内部的configuration对象都通过spring boot的机制装配到spring ioc容器中。

为了能够让web工程启动,于是决定再新建两个模块:

web-init
web-app

在web-init模块添加工程的启动类:UserCenterApplication.java, 在web-app模块引入了web-configuration模块和web-init模块, Spring Boot会自动将web-configuration中的配置对象装配到IOC容器中。

然后在web-app模块中引用web模块中任意的其他子模块,比如:web-api-authentication模块, 就可以将该字模块加载到web工程中,对外提供服务。

最后还需要在web-app工程的pom.xml文件中指定mainClass:

<build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
          <mainClass>your.package.web.UserCenterWebApplication</mainClass>
        </configuration>
      </plugin>
    </plugins>
  </build>

通过如上的步骤就可以实现多maven module的形式来组织Spring Boot工程。

Add new comment

Plain text

  • No HTML tags allowed.
  • Lines and paragraphs break automatically.
  • Web page addresses and email addresses turn into links automatically.