PicoContainer两分钟入门手册/Two minute tutorial
http://www.picocontainer.org/Two+minute+tutorial
这个手册可以让你在2分钟内快速入门,但是它不会告诉你为什么要这么做,如果你想知道的话,请看下一篇《五分钟介绍》
下载和安装
下载jar文件,并把它添加到你的classpath环境变量中
下载地址:http://www.picocontainer.org/Download
写两个简单的组件
public class Boy {
public void kiss(Object kisser) {
System.out.println("I was kissed by " + kisser);
}
}public class Girl {
Boy boy;
public Girl(Boy boy) {
this.boy = boy;
}
public void kissSomeone() {
boy.kiss(this);
}
}
装载组件
MutablePicoContainer pico = new DefaultPicoContainer();
pico.registerComponentImplementation(Boy.class);
pico.registerComponentImplementation(Girl.class);
实例化并使用组件
Girl girl = (Girl) pico.getComponentInstance(Girl.class);
girl.kissSomeone();
getComponentInstance方法将会先观察Girl类,它发现Girl需要一个Boy作为构造器的参数,所以,它会先创建一个Boy对象,然后传递给Girl,最后才创建Girl对象。
注意:Girl对象并没有主动去获取一个Boy对象,而是通过容器提供给它的。这叫做“好莱坞原则”————“不要找我,我会找你的”。
Introduce an interface for the dependency
Change the Boy class to implement a Kissable interface and change the Girl class to depend on Kissable instead.
为依赖引入接口
修改Boy类使它实现Kissable接口,而Girl则依赖于Kissable接口
public interface Kissable {
void kiss(Object kisser);
}public class Boy implements Kissable {
public void kiss(Object kisser) {
System.out.println("I was kissed by " + kisser);
}
}
public class Girl {
Kissable kissable;
public Girl(Kissable kissable) {
this.kissable = kissable;
}
public void kissSomeone() {
kissable.kiss(this);
}
}
装载组件:
MutablePicoContainer pico = new DefaultPicoContainer();
pico.registerComponentImplementation(Boy.class);
pico.registerComponentImplementation(Girl.class);
运行:
Girl girl = (Girl) pico.getComponentInstance(Girl.class);
girl.kissSomeone();
Boy将会被传递给Girl,因为 PicoContainer 知道它是一个 Kissable。
Girl和Boy将不会有任何的依赖,这叫做依赖注射原则。从此以后两个组件不再互相依赖,而依靠接口凑在一起。
使用简单的生命周期管理
改写Girl类,使之实现简单的生命周期管理。
public class Girl implements Startable {
Kissable kissable;
public Girl(Kissable kissable) {
this.kissable = kissable;
}
public void start() {
kissable.kiss(this);
}
public void stop() {
}
}
装载组件之后,不再像之前那样直接调用Girl类,而是使用如下方式:
pico.start();
这将会实例化所有实现了Startable接口的组件,并调用他们的start方法。要停止或销毁容器可以使用以下方式:
pico.stop();
pico.dispose();