class AService(bService: BService) { println(s"hi from $this constructor, b is $bService") def greet: Unit = println(s"hi from $this greet, b is $bService") } class BService(aService: AService) { println(s"hi from $this constructor, a is $aService") def greet: Unit = println(s"hi from $this greet, a is $aService") } trait TopComponent { val aService: AService = new AService(bService) val bService: BService = new BService(aService) } object Application extends App with TopComponent { aService.greet bService.greet }