Instead of a traditional layered architecture (where the UI depends on Business depends on Data), Hexagonal Architecture places the at the center. External systems interact with the domain through ports (interfaces) and adapters (implementations).
// Note: ProductJpaEntity is a JPA-annotated class that the domain never sees. // bootstrap/Application.java @SpringBootApplication public class Application public static void main(String[] args) SpringApplication.run(Application.class, args); // Manual wiring if not using Spring's @Autowired on fields @Bean public CreateProductService createProductService(ProductRepository repo) return new CreateProductService(repo); designing hexagonal architecture with java pdf
// application/port/in/CreateProductUseCase.java (Incoming Port) package com.example.application.port.in; import com.example.domain.model.Product; public interface CreateProductUseCase { Product execute(CreateProductCommand command); Instead of a traditional layered architecture (where the
Driving Adapter (REST) → Incoming Port (Interface) → Application Service → Outgoing Port (Interface) ← Driven Adapter (JPA) // bootstrap/Application
@Override public Optional<Product> findById(String id) return jpaRepository.findById(id).map(this::toDomain);
@RequiredArgsConstructor public class CreateProductService implements CreateProductUseCase private final ProductRepository productRepository; // depends on outgoing port