PicoContainer是非常轻量级的Ioc容器,提供依赖注入和对象生命周期管理的功能,纯粹的小而美的Ioc容器。而Spring是Ioc+,提供如AOP等其他功能,是大而全的框架,不只是Ioc容器。
官网地址:http://picocontainer.com/
Bean模式(Behaviors)
- Caching:单例模式;
- Implementation Hiding:只能使用抽象类,不允许向下转换为实现类;
- Thread Safety:多线程安全模式;
- Interception:拦截器模式,对象方法调用前后进行拦截;
详见:http://picocontainer.com/behaviors.html
注入类型
支持各种方式的注入,常见的就是构造函数注入、setter方法注入以及注解注入。
生命周期Lifecycle
- StartableLifecycleStrategy:需要bean实现Startable 接口,容器启动时自动调用bean的start接口;容器关闭时调用其stop方法。
- ReflectionLifecycleStrategy:容器启动和停止时,会通过反射调用bean的start/stop/dispose方法;
- JavaEE5LifecycleStrategy:容器启动和停止时,会根据注解调用bean的start/stop/dispose方法;
- 自定义
代码示例
<dependency>
<groupId>org.picocontainer</groupId>
<artifactId>picocontainer</artifactId>
<version>2.15</version>
</dependency>
import org.picocontainer.MutablePicoContainer;
import org.picocontainer.PicoBuilder;
import org.picocontainer.Startable;
public class PicoContainerTest {
public static void main(String[] args) {
MutablePicoContainer container = new PicoBuilder().withLocking().withCaching().withLifecycle().build();
container.addComponent("k1", TestClass1.class);
container.addComponent("k2", TestClass2.class);
container.start();
TestClass1 c1 = (TestClass1) container.getComponent("k1");
c1.test();
TestClass2 c2 = (TestClass2) container.getComponent("k2");
c2.test();
container.stop();
}
public static class TestClass1 implements Startable {
@Override
public void start() {
System.out.println(TestClass1.class.getSimpleName() + " start");
}
@Override
public void stop() {
System.out.println(TestClass1.class.getSimpleName() + " stop");
}
public void test() {
System.out.println(TestClass1.class.getSimpleName() + " test");
}
}
public static class TestClass2 implements Startable {
@Override
public void start() {
System.out.println(TestClass2.class.getSimpleName() + " start");
}
@Override
public void stop() {
System.out.println(TestClass2.class.getSimpleName() + " stop");
}
public void test() {
System.out.println(TestClass2.class.getSimpleName() + " test");
}
}
}