ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java-Guice字段注入不起作用(返回null)

2019-11-11 11:11:28  阅读:205  来源: 互联网

标签:testing dependency-injection guice frameworks java


我在使用Guice使用null值时遇到问题. Nex我为您展示了类似情况的示例.我知道场注入是一种不好的做法,但是我希望它在演示中像这样工作

我有一个名为B的具体类(这是我要注入的类):

class B{

    @Inject
    public B(){}

    public void fooMethod(){
        System.out.println("foo!")
    }
}

我有一个名为A的抽象类,它具有类B(我想通过字段注入注入的类):

abstract class A{

    @Inject
    protected B b;

}

现在,另一个名为C的具体类扩展了A:

class C extends A{

    public void barMethod(){
        System.out.println("is b null? " + (b==null)); // is true
    }
}

我的向导配置如下:

class ConfigModule extends AbstractModule {

    @Override
    protected void configure(){
        // bind(B.class) // I have also tried this
    }

    @Provides
    B getB(){
        return new B();
    }

    @Provides
    C getC(){
        return new C();
    }
}

然后我对Spock进行了测试:

@UseModules(ConfigModule)
class Test extends Specification{

    @Inject
    public C c;

    def "test"() {
        // Here goes the test using:
        c.barMethod();
    }       
}

谢谢 :)

解决方法:

这就是让您失望的原因:

@Provides
C getC(){
    return new C();
}

删除它.实际上,删除整个模块-您定义的方法都无法帮助您进行注入.

当您创建@Provides C方法时,Guice假定您按照自己的方式创建C,并且不会填充@Inject注释的字段或调用@Inject注释的方法.但是,当C具有@Inject批注或公共无参数构造函数时,Guice将检查对象并根据其@Inject字段和方法创建对象,这就是您要寻找的行为.

标签:testing,dependency-injection,guice,frameworks,java
来源: https://codeday.me/bug/20191111/2019553.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有