Other Behaviors

Property Applying

This is where there are a number of setters for a component that will be could be set after instantiation. A way of handing in some configuration if you like.

class Foo {
 String message;
 public void setMessage(String message) {
 this.message = message;
 }
 public String toString() {
 return message;
 }
}
...
pico = new DefaultPicoContainer(new PropertyApplying());
pico.addComponent(Foo.class);
PropertyApplicator pa = (PropertyApplicator) pico.getComponentAdapter(Foo.class);
pa.setProperty("message", "hello");
System.out.println(pico.getComponent(Foo.class)); // prints hello
pico = new DefaultPicoContainer();
pico.as(APPLY_PROPERTIES).addComponent(Foo.class);
PropertyApplicator pa = (PropertyApplicator) pico.getComponentAdapter(Foo.class);
pa.setProperty("message", "hello");
System.out.println(pico.getComponent(Foo.class)); // prints hello
pico = new PicoBuilder().withProperties().build();
pico.addComponent(Foo.class);
PropertyApplicator pa = (PropertyApplicator) pico.getComponentAdapter(Foo.class);
pa.setProperty("message", "hello");
System.out.println(pico.getComponent(Foo.class)); // prints hello
import static org.picocontainer.behaviors.Behaviors.propertyApplying;
...
pico = new PicoBuilder().withBehaviors(propertyApplying()).build();
pico.addComponent(Foo.class);
PropertyApplicator pa = (PropertyApplicator) pico.getComponentAdapter(Foo.class);
pa.setProperty("message", "hello");
System.out.println(pico.getComponent(Foo.class)); // prints hello
Handling Behavior Chains
import static org.picocontainer.behaviors.Behaviors.caching;
import static org.picocontainer.behaviors.Behaviors.propertyApplying;
...
pico = new PicoBuilder().withBehaviors(caching(), propertyApplying()).build();
pico.addComponent(Foo.class);
Cached cached = (Cached) pico.getComponentAdapter(Foo.class);
PropertyApplicator pa = (PropertyApplicator) getDelegate(PropertyApplicator.class);
pa.setProperty("message", "hello");
System.out.println(pico.getComponent(Foo.class)); // prints hello

Automatic

This is where a component is going to be instantiated regardless of whether:

  • it is looked up
  • any component that needs it is looked up
  • it is Startable

It is most likely that you're doing this because the component in question is self contained and doing something once only. Alternatively, you're cutting a legacy codebase over from nest-of-singletons to dependency injection in stages.

class Foo {

 public Foo() {
 System.out.println("Foo was instantiated");
 }
}

...
pico = new DefaultPicoContainer(new Automatic());
pico.addComponent(Foo.class);
pico.addComponent("bar", String.class);
pico.getComponent("bar"); // Foo instantiated too.
pico = new DefaultPicoContainer();
pico.as(AUTOMATIC).addComponent(Foo.class);
pico.addComponent("bar", String.class);
pico.getComponent("bar"); // Foo instantiated too.
pico = new PicoBuilder().withAutomatic().build();
pico.addComponent(Foo.class);
pico.addComponent("bar", String.class);
pico.getComponent("bar"); // Foo instantiated too.
import static org.picocontainer.behaviors.Behaviors.automatic;
...
pico = new PicoBuilder().withBehaviors(automatic()).build();
pico.addComponent(Foo.class);
pico.addComponent("bar", String.class);
pico.getComponent("bar"); // Foo instantiated too.