Spring @Transactional AOP proxy mechanism why same-class calls bypass the proxy REQUIRES_NEW behavior Hexagonal Architecture ports and adapters domain module isolation ArchUnit enforcing no Spring imports in domain layer