我在一个研究项目中使用Picocontainer。我对如何使用它有疑问。
以下是我的课程:
public class DependencySupplier {
public static MutablePicoContainer pico;
static {
pico = new DefaultPicoContainer();
pico.registerComponentImplementation(CollectionDao.class, CollectionDaoImpl.class);
pico.registerComponentImplementation(ReadingDao.class, ReadingDaoImpl.class);
pico.registerComponentImplementation(CollectionDetails.class, CollectionDetailsImpl.class);
pico.registerComponentImplementation(Reading.class, ReadingImpl.class);
}
public static CollectionDao getCollectionDao() {
return (CollectionDao) pico.getComponentInstance(CollectionDao.class);
}
public static ReadingDao getReadingDao() {
return (ReadingDao) pico.getComponentInstance(ReadingDao.class);
}
}
我的怀疑是:
AddressImpl类如下:
public class AddressImpl implements Address {
private String address1;
private String address2;
private String address3;
private String address4;
public AddressImpl(String address1, String address2, String address3,
String address4) {
super();
this.address1 = address1;
this.address2 = address2;
}
public String getAddress1() {
return address1;
}
public void setAddress1(String address1) {
this.address1 = address1;
}
public String getAddress2() {
return address2;
}
public void setAddress2(String address2) {
this.address2 = address2;
}
public String getAddress3() {
return address3;
}
}
如何使用上述实现将Address对象实例化为'address1','address2'必须由用户提供并在运行时可用?
答案 0 :(得分:1)
嗯,实际上它不适合使用pico ...
在大多数情况下,您不应该直接从微微上下文中查找组件。
您需要在pico中注册您的DAO,服务和其他逻辑类......他们需要获取引用的DAO等,只需将它们声明为构造函数参数即可。然后在你的bootstrap类中注册你需要从容器中获取主逻辑类的组件并调用它的方法(或使用Startable生命周期) 至于地址实例,我不确定你是否需要从pico中实例化它们(因为我没有看到容器可能为地址实现的任何依赖关系,那么有什么意义呢?)
但是如果你需要,你可以注册像pico.registerComponentInstance(new AddressImpl(...))这样的就绪实例,然后你可以用构造函数参数Address [] addrs注入所有可用的实例。还有另一种方法,直接从微微实例化几个实例,但我认为你根本不需要它