2

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

如何使用上述实现将地址对象实例化为“地址1”和“地址2”必须由用户提供并且在运行时可用?

4

1 回答 1

1

好吧,实际上这不是使用 pico 的正确方法......

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

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

但是,如果您需要,您可以注册准备好的实例,例如 pico.registerComponentInstance(new AddressImpl(...)) 然后您可以使用构造函数参数 Address[] addrs 注入所有可用的实例。还有另一种方法,直接从 pico 实例化几个实例,但我认为你只是不需要它

于 2013-07-09T08:34:37.173 回答