有没有办法注入一个依赖项,以便它可以在构造函数中使用?

时间:2013-08-01 23:01:55

标签: java spring dependency-injection

我有对象A

@Component("a")
Class A{
   public SomeObject getC(){
       return anObject;
   }
}

我想在构建另一个对象B时使用

@Service("b")
Class B{
   @Autowired
   @Qualifier("a")
   A a;

   SomeObject c;

   public B(){

      c = a.getC();
   }

其中a是数据库的连接器。基本上我想在初始化时从数据库加载对象c,之后仍然可以获得对数据库的更新。问题是我尝试这样做,我得到以下初始化错误。

 org.springframework.beans.factory.BeanCreationException: Error creating bean with name  defined in file
 Instantiation of bean failed;
 Could not instantiate bean class
 Constructor threw exception; nested exception is java.lang.NullPointerException

这是否可能,因为必须在构造对象B之前注入依赖项,或者我该怎么做?

2 个答案:

答案 0 :(得分:2)

您的问题有两种解决方案。实际上,您可以在Spring中使用constructor injection,但您可能希望使用带注释的方法@PostConstruct。它将在所有必要的注入发生之后但在bean投入使用之前执行(例如,通过使其可用于另一个bean或servlet),并且您可以执行任何您喜欢的代码,并且知道bean处于有效的构造状态。

@Service("b")
class B {
    @Autowired
    @Qualifier("a")
    A a;

    SomeObject c;

    public B(){}

    @PostConstruct
    private void initializeSomeObject() {
        c = a.getSomeObject();
    }
}

答案 1 :(得分:1)

首先创建Bean,然后注入其依赖项,这就是您获得NullPointerException的原因。试试这个:

@Service("b")
Class B{

    A a;

    SomeObject c;

    @Autowired
    @Qualifier("a")
    public B(A a){
        this.a = a;
        c = a.getC();
    }
}