Spring & kotlin: ¿Cuál es la diferencia entre el constructor y la inyección tardía?

Tuve un problema con mi aplicación usando spring an kotlin. Al principio tenía un controller y un service como este:

Aquí está el service:

@Service class StuffService { @Inject lateinit var environment : Environment fun doStuff() = [HERE FUNCTION CODE USING environment VARIABLE] } 

Aquí está el controller:

 @RestController class StuffController { @Inject lateinit var stuffService : StuffService @RequestMapping("/doStuff") fun doStuff() = stuffService.doStuff() } 

Desafortunadamente, esto me da este error cuando comienzo Springboot:

 kotlin.UninitializedPropertyAccessException: lateinit property environment has not been initialized 

Así que traté de inyectar a través de constructor:

 @Service class StuffService(val environment : Environment) {...} @RestController class StuffController(val stuffService: StuffService) {...} 

¡Con ese código funciona! No tengo ningún error

Me pregunto cuál es la diferencia. No entiendo qué pasó. ¿Alguien puede ayudarme a entender?