One could say that Scala supports dependency injection out of the box with the help of traits and self-type annotations. Take a look on a Cake Pattern:
http://jonasboner.com/2008/10/06/real-world-scala-dependency-injection-di/
Basically, this approach uses traits with declared dependencies (by using self-types) to let the compiler do the work of wiring them together.
This is the declaration registry:
object ComponentRegistry extends
UserServiceComponent with
UserRepositoryComponent
{
val userRepository = new UserRepository
val userService = new UserService
}
...registering the user repository:
trait UserRepositoryComponent {
val userRepository: UserRepository
class UserRepository {
...
}
}
...and the user service component that depends on the repository:
trait UserServiceComponent {
this: UserRepositoryComponent =>
val userService: UserService
class UserService {
...
}
}