Overview

What is PicoContainer?

PicoContainer is a highly embeddable full service Inversion of Control (IoC) container for components honor the Dependency Injection pattern. The project started in 2003 and pioneered Constructor Injection auto-wiring.

You could use it as a lightweight alternative to Sun's J2EE patterns for web applications or general solutions.

What is Dependency Injection? Martin Fowler has a good article from 2003, but here is another view: It is a good design pattern that, for large enterprise applications, facilitates:

  • easy best practice unit testing vs little and difficult unit testing.
  • component reuse vs rewriting through ignorance or need
  • centralized configuration vs components reading their own config (scattered)
  • clean & declarative architecture vs a nest of singletons that nobody can make sense of
  • maintainability vs developers having difficulties fixing bugs
  • adaptability vs developers not knowing where to start to add features

Dependency Injection is quite often, but not exclusively, used by Agile practitioners. It counters the situation where the enterprise application:

  • has grown to be thousands of classes, with dozens if not hundreds of Singletons
  • draws similarities to Spaghetti, Hairballs or Balls of Mud
  • has made development staff looking after it miserable
  • suffers repeated allegations of being unable to be developed without complete rewrite

Despite it being very compact in size (the core is ~224K and it has no mandatory dependencies outside the JDK), PicoContainer supports different dependency injection types (Constructor, Setter, Annotated Field / Method) and offers multiple lifecycle and monitoring strategies.

PicoContainer has originally been implemented in Java but is also available for other platforms and languages. These are detailed here.

Where Next?

The Introduction page discusses basic PicoContainer usage, and has pictures - yay!

Related projects

NanoContainer builds on top of PicoContainer the support for several scripting meta-languages (XML, Groovy, Bsh, Jython and Rhyno), AOP, Web frameworks (Struts and WebWork), Persistence (Hibernate) SOAP, JMX, and much more.