首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HK2工厂实现单例

HK2工厂实现单例
EN

Stack Overflow用户
提问于 2018-03-30 00:21:01
回答 1查看 1.8K关注 0票数 1

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

目标:如何实施单件工厂?

代码语言:javascript
复制
    // 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;
        }

在启动应用程序时,我在下面的日志中看到

代码语言:javascript
复制
    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
  1. 当作用域= Singleton
代码语言:javascript
复制
- creating two objects of MyFactory
- Next request fails with null pointer exception @Inject.

  1. 当作用域= RequestScoped,PerLookup
代码语言:javascript
复制
- Every request creates two objects of MyFactory

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

那么,(1)应该工作还是我错过了什么?

为什么是工厂的两个对象?

有什么建议吗?提前谢谢。

代码语言:javascript
复制
HK2 Version : 2.5.0-b60
Jersey Version: 2.26

关于NPE的附加信息

它不是来自HK2,而是.in(Singleton.class)和.in(PerLookup.class)之间的行为差异。

代码语言:javascript
复制
// 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

代码语言:javascript
复制
bindFactory(MyFactory.class,Singleton.class).to(SomeObject.class).in(Singleton.class);

没有NPE在上面的位置当下面

代码语言:javascript
复制
bindFactory(MyFactory.class,Singleton.class).to(SomeObject.class).in(PerLookup.class);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-31 13:07:40

在执行bindFactory时,使用第二个参数将Factory绑定为Singleton。您所做的方式--仅提供方法--绑定为Singleton。因此,为了使工厂本身也成为一个单身汉,可以这样做:

代码语言:javascript
复制
bindFactory(MyFactory.class, Singleton.class).to(SomeObject.class).in(Singelton.class);

这应该得到了提供的东西和工厂本身作为单身汉的约束。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49566860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档