2016-11-02 2 views
0

스프링 빈에 싱글 톤 객체 의존성을 주입하고 싶습니다. catch는 객체를 주입하고자하는 클래스에 액세스하고 수정할 수 없다는 것입니다. 예제를 설명하겠습니다.스프링 빈에 의존성 삽입하기

그래서 내 인터페이스 및 다음과 같은이 인터페이스의 구현이 있습니다. 내 구성 클래스의 다음

public interface MyServiceProxy { 

    String BEAN_NAME = "MyServiceProxy"; 

    Data getData(String dataId); 
} 


public class MyServiceProxyImpl implements MyServiceProxy { 

    private final MyServiceClient client; 

    public MyServiceProxyImpl(MyServiceClient client) { 
     this.client = client; 
    } 

    @Override 
    public Data getData(String dataId) {//...} 

, 나는 빈을 만드는 오전,하지만 난 생성자에서 그것에게 MyServiceClient 개체를 전달해야하고, 캐치는 외부 패키지이기 때문에이 빈 MyServiceClient을 할 수 없다는 것입니다 나는 그것을 수정할 수 없다.

@Configuration 
public class MyServiceProxyConfiguration { 

    @Bean(name = MyServiceProxy.BEAN_NAME) 
    public MyServiceProxy getMyServiceProxy(MyServiceClient client) { // could not autowire client 
     return new MyServiceProxyImpl(client); 
    } 
} 

그래서 내가하고 싶은 것이, getMyServiceProxy 콩에 인수를/통과 autowire하기 할 수있는 것입니다. 현재 IntelliJ에서 오류가 발생했습니다 클라이언트를 autowire 할 수 없습니다. 어떻게이 일을 성취 할 수 있습니까?

UPDATE 다음 작업 같은

겠습니까 뭔가? IntelliJ는 여전히 "autowire 수 없음"오류를보고하기 때문입니다. 그래서 client을 반환하는 bean 메소드를 생성했다면, 주입 할 메소드에 @Inject 어노테이션을 추가하십시오. 이 코드를 테스트하지 않았습니다

@Configuration 
public class MyServiceProxyConfiguration { 

    @Bean 
    public MyServiceClient getMyServiceClient() { 
     return MyServiceClient.getInstance(); //initiate MyServiceClient 
    } 

    @Bean(name = MyServiceProxy.BEAN_NAME) 
    public MyServiceProxy getMyServiceProxy(MyServiceClient client) { 
     return new MyServiceProxyImpl(client); 
    } 
} 

을하지만, 그것을 작동합니다 :

public class MyServiceClientBuilder { 

    private final ClientBuilder builder; 

    public MyServiceClientBuilder(ClientBuilder builder) { 
     this.builder = builder; 
    } 

    @Bean 
    public MyServiceClient build() { 
     return builder.newClient(); 
    } 


@Configuration 
public class MyServiceProxyConfiguration { 

    @Inject 
    @Bean(name = MyServiceProxy.BEAN_NAME) 
    public MyServiceProxy getMyServiceProxy(MyServiceClient client) { // could not autowire client 
     return new MyServiceProxyImpl(client); 
    } 
} 
+0

메소드에서 인수를 제거하고'return new MyServiceProxyImpl (MyServiceClient.getInstance())'를 사용하는 것은 어떻습니까? –

+0

업데이트 된 코드에서 MyServiceClientBuilder에 주석이 없기 때문에 Spring은'MyServiceClientBuilder'에서 해당 @ @ Bean 주석을 무시하기 때문에 'MyServiceClient'는 Bean으로 생성되지 않습니다. 하지만 내 대답에는 비슷한 것이 있습니다. 확인해 보셨습니까? –

+0

@BojanTrajkovski 안녕하세요, 네, 있습니다. 나는 당신이 옳다고 생각합니다. 나는 그것을 시도 할 것이다. 감사! – zwiebl

답변

2

이 같은 구성 파일에서 별도의 콩으로 MyServiceClient을 정의 할 수 있습니다.

관련 문제