如何使用PIcocontainer

时间:2013-07-03 13:12:05

标签: java dependency-injection picocontainer

我在一个研究项目中使用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);
        }   
    }

我的怀疑是:

  1. 这是使用pico的正确方法吗?
  2. 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;
        }
    }
    
  3. 如何使用上述实现将Address对象实例化为'address1','address2'必须由用户提供并在运行时可用?

1 个答案:

答案 0 :(得分:1)

嗯,实际上它不适合使用pico ...

在大多数情况下,您不应该直接从微微上下文中查找组件。

您需要在pico中注册您的DAO,服务和其他逻辑类......他们需要获取引用的DAO等,只需将它们声明为构造函数参数即可。然后在你的bootstrap类中注册你需要从容器中获取主逻辑类的组件并调用它的方法(或使用Startable生命周期) 至于地址实例,我不确定你是否需要从pico中实例化它们(因为我没有看到容器可能为地址实现的任何依赖关系,那么有什么意义呢?)

但是如果你需要,你可以注册像pico.registerComponentInstance(new AddressImpl(...))这样的就绪实例,然后你可以用构造函数参数Address [] addrs注入所有可用的实例。还有另一种方法,直接从微微实例化几个实例,但我认为你根本不需要它