The one-function protocols strike me as unidiomatic; why not use functions directly? `(fn […] …)` would work just as well as `(reify P (f [this …] …))` (`this` is never used).<p>Update: I looked at the code again and noticed that `stdin-transport` implements <i>two</i> protocols. Guess I need to think a little bit more about this.
Check out Stuart Sierra's "component" for another take. Of course, another take is that you're better off just constructing objects by calling their constructors directly.
A chapter from the O'Reilly book covers this subject pretty well. With Clojure's java interop, you can still use Spring. Thanks to the homoiconicity of the language, support for higher order functions, and with some clever use of Clojure's load-file function in core, you kind of get DI baked into the language for free.