当前位置: 首页 > 知识库问答 >
问题:

HK2工厂实施单例

孔驰
2023-03-14

我正在尝试理解HK2工厂在泽西应用程序中的实现。

    // Below is the simple factory implementation

    public class MyFactory implements Factory<SomeObject> {

        private static final Logger logger = LoggerFactory.getLogger(MyFactory.class);
        private final CloseableService closeService;

        @Inject
        public MyFactory(CloseableService closeService) {
            this.closeService = closeService;
        }

        @Override
        public MyFactory provide() {
            logger.debug("provide object from MyFactory");
            SomeObject objectFromFactory = new SomeObject();
            this.closeService.add(() -> dispose(objectFromFactory));
            return objectFromFactory;
        }

        @Override
        public void dispose(SomeObject instance) {
            // destroy instance
             logger.debug("dispose object from MyFactory");
        }
    }

    // and binding
     bindFactory(MyFactory.class).to(SomeObject.class).in(Singelton.class);

     // to check object creation and destruction
     bind(HK2InstanceListener.class).to(InstanceLifecycleListener.class).in(Singleton.class);

    // and injecting in some resource class

    @Inject
    SomeObject useThisObject;

    //updated information 

    AbstractBinder abstractBinder = configureBinder();

    ServiceLocator appServiceLocator = configureHK2(abstractBinder);

    public static AbstractBinder configureBinder() {
            return new AbstractBinder() {
                @Override
                protected void configure() {
         bindFactory(MyFactory.class).to(SomeObject.class).in(Singelton.class);

           // to check object creation and destruction
         bind(HK2InstanceListener.class).to(InstanceLifecycleListener.class).in(Singleton.class);

         }
         }

    public ServiceLocator configureHK2(AbstractBinder binder) {
            ServiceLocatorFactory factory = ServiceLocatorFactory.getInstance();
            ServiceLocator locator = factory.create("my-test-server");

            DynamicConfigurationService dcs = locator.getService(DynamicConfigurationService.class);
            DynamicConfiguration dc = dcs.createDynamicConfiguration();

            locator.inject(binder);
            binder.bind(dc);
            dc.commit();
            return locator;
        }
    10:38:34.122 [grizzly-http-server-0] DEBUG com.test.HK2InstanceListener - HK2 before object create : com.test.MyFactory
    10:38:34.125 [grizzly-http-server-0] DEBUG com.test.HK2InstanceListener - HK2 before object create : com.test.MyFactory
    10:38:34.125 [grizzly-http-server-0] DEBUG com.test.HK2InstanceListener - HK2 after object create : com.test.MyFactory
    10:38:34.125 [grizzly-http-server-0] DEBUG com.test.MyFactory provide - object from MyFactory
    10:38:35.700 [grizzly-http-server-0] DEBUG com.test.HK2InstanceListener - HK2 after object create : com.test.MyFactory

    10:38:37.743 [grizzly-http-server-0] DEBUG com.test.MyFactory - dispose object from MyFactory
    null
  • 每个请求都会创建MyFactory的两个对象

单例工厂,我的理解是,工厂(MyFactory)的一个单一对象,它在注入时提供某种对象。

所以(1)应该工作还是我遗漏了什么?

HK2 Version : 2.5.0-b60
Jersey Version: 2.26
// SomeObject looks like

Class SomeObject
{

    private Stack<String> someStack; 

     public SomeObject() {

        // this may be the issue for Singleton
        this.someStack = new Stack();
    }

    public someOperation(String stackIt)
    {
        // NPE location
        this.someStack.push(stackIt);
    }
}

当位置在下方时,位置在上方的NPE

bindFactory(MyFactory.class,Singleton.class).to(SomeObject.class).in(Singleton.class);

在以下位置时,在上面位置无NPE

bindFactory(MyFactory.class,Singleton.class).to(SomeObject.class).in(PerLookup.class);

共有1个答案

督建柏
2023-03-14

执行bindFactory时,使用第二个参数将工厂绑定为单例。按照您的操作方式,只将provide方法绑定为单例。因此,为了使工厂本身也是一个单元体,可以这样做:

bindFactory(MyFactory.class, Singleton.class).to(SomeObject.class).in(Singelton.class);

这将使所提供的东西和工厂本身都被绑定为单例。

 类似资料:
  • 我试图在Jersey测试类中注入一个由HK2工厂服务提供的对象,但得到未满足的依赖项异常。 MultiException有3个异常。它们是: org.glassfish.hk2.api.unsatifiedDependencyException:在SystemInjecteeImpl(requiredtype=closeableService,parent=TestFactory,qualifie

  • 我在我的泽西应用程序中使用HK2容器。我需要使用我的自定义工厂方法从HK2容器中获取注入的实例。例如, 这是我的代码: 我需要这样做的原因是有时,我手动分配具有依赖关系的类,因此以这种方式每次使用@Inject返回null。例如,如果我使用新的 BusinessLogic() ,则@Inject的记录器为空。我也必须绑定商业逻辑并使用IOC才能获得ILogge。 我需要这样的东西: 我需要使用依赖

  • 问题内容: 我正在尝试实现我的第一个工厂设计模式,但不确定将工厂制造的对象添加到列表时如何避免使用instanceof。这就是我想要做的: 根据我在SO上阅读的内容,使用“ instanceof”是一种代码味道。有没有一种更好的方法可以检查工厂创建的不使用“ instanceof”的车辆类型? 我欢迎任何有关实施的反馈/建议,因为我什至不确定我是否会采用正确的方法。 完整示例如下: 问题答案: 您

  • 本文向大家介绍js简单工厂模式用法实例,包括了js简单工厂模式用法实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了js简单工厂模式用法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的javascript程序设计有所帮助。

  • 本文向大家介绍PHP设计模式之简单工厂和工厂模式实例分析,包括了PHP设计模式之简单工厂和工厂模式实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP设计模式之简单工厂和工厂模式。分享给大家供大家参考,具体如下: 工厂模式是创建型模式的一种,分为简单工厂模式,工厂模式,抽象工厂模式,简单工厂可以称之为工厂模式的一个特例 先用一段简单的代码说明一下,现在假设我们是顾客,需要苹果味饮

  • 活字印刷 面向对象 话说三国时期,曹操带领百万大军攻打东吴,大军在长江赤壁驻扎,军船连成一片,眼看就要灭掉东吴,统一天下,曹操大悦,于是大宴众文武,在酒席间,曹操诗兴大发,不觉吟道:喝酒唱歌,人生真爽。众文武齐呼:“丞相好诗!于是一臣子速命印刷工匠刻板印刷,以便流传天下。” 样张出来给曹操一看,曹操感觉不妥,说到:“喝与唱,此话过俗,应该为‘对酒当歌’较好!”,于是此臣就命工匠重新来过。工匠眼看连