TIL

Fundamentals

Application Modules

ApplicationModules

var modules = ApplicationModules.of(Application::class)
## example.inventory ##
> Logical name: inventory
> Base package: example.inventory
> Spring beans:
  + ….InventoryManagement
  o ….SomeInternalComponent

## example.order ##
> Logical name: order
> Base package: example.order
> Spring beans:
  + ….OrderManagement
  + ….internal.SomeInternalComponent
ApplicationModules.of(
  Application::class, 
  JavaClass.Predicates.resideInAPackage("com.example.db")
).verify()

Simple Application Modules

Advanced Application Modules

 Example
└─  src/main/java
   ├─  example
   |  └─  Application.java
   ├─  example.inventory
   |  ├─  InventoryManagement.java
   |  └─  SomethingInventoryInternal.java
   ├─  example.order
   |  └─  OrderManagement.java
   └─  example.order.internal
      └─  SomethingOrderInternal.java

Open Application Modules

@org.springframework.modulith.ApplicationModule(
  type = Type.OPEN
)
package example.inventory

Explicit Application Module Dependencies

package example.inventory

@ApplicationModule(allowedDependencies = "order")
class ModuleMetadata {}

Named Interfaces

 Example
└─  src/main/java
   ├─  example
   |  └─  Application.java
   ├─ …
   ├─  example.order
   |  └─  OrderManagement.java
   ├─  example.order.spi
   |  ├—  package-info.java
   |  └─  SomeSpiInterface.java
   └─  example.order.internal
      └─  SomethingOrderInternal.java
// example.order.spi 내부의 package-info.java 파일
package example.order.spi

import org.springframework.modulith.PackageInfo
import org.springframework.modulith.NamedInterface

@PackageInfo
@NamedInterface("spi")
class ModuleMetadata {}
@org.springframework.modulith.ApplicationModule(
  allowedDependencies = "order :: spi"
)
package example.inventory

Customizing Module Detection

spring.modulith.detection-strategy=explicitly-annotated
spring.modulith.detection-strategy=example.CustomApplicationModuleDetectionStrategy
package example

class CustomApplicationModuleDetectionStrategy : ApplicationModuleDetectionStrategy {

  override fun getModuleBasePackages(basePackage: JavaPackage): Stream<JavaPackage> {
    // Your module detection goes here
  }
}

Customizing the Application Modules Arrangement

package example

import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
import org.springframework.modulith.Modulithic

@Modulithic
@SpringBootApplication
class DemoApplication

fun main(args: Array<String>) {
  runApplication<DemoApplication>(*args)
}