2013-08-01 5 views
1

나는 내가이 데이터베이스에 연결 그래서생성자에서 사용할 수 있도록 종속성을 삽입하는 방법이 있습니까?

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

    SomeObject c; 

    public B(){ 

     c = a.getC(); 
    } 

같은 다른 객체 B의 건설에 사용하려는

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

객체가 있습니다. 기본적으로 초기화시 데이터베이스에서 객체 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가 생성되기 전에 종속성을 주입해야하기 때문에 이것이 가능합니까? 아니면 어떻게해야합니까?

답변

1

빈이 먼저 생성 된 다음 종속성이 주입되므로 NullPointerException이 발생합니다. 시도해보십시오.

@Service("b") 
Class B{ 

    A a; 

    SomeObject c; 

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

감사합니다.이 기능은 생성자 앞에 Qualifier 주석이없는 Autowired로 작동합니다. – user1809913

2

두 가지 해결책이 있습니다. 실제로 constructor injection을 Spring과 함께 사용할 수 있지만 대신 @PostConstruct 주석이 달린 메소드를 사용하려고 할 수 있습니다. 필요한 모든 인젝션이 발생했지만 빈이 서비스되기 전 (예 : 다른 빈 또는 서블릿에서 사용 가능하게 됨) 실행되면 실행될 것이며, 원하는 지식을 가진 모든 코드를 실행할 수 있습니다. 빈은 유효한 생성 된 상태에있다.

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

    SomeObject c; 

    public B(){} 

    @PostConstruct 
    private void initializeSomeObject() { 
     c = a.getSomeObject(); 
    } 
} 
관련 문제