복붙노트

[SPRING] @Autowired를 사용하여 팩토리 패턴과 같은 구현을 동적으로 주입하는 방법

SPRING

@Autowired를 사용하여 팩토리 패턴과 같은 구현을 동적으로 주입하는 방법

저는 Sprint를 처음 접했고 애플리케이션에 Spring 3.x 및 roo1.1.1을 사용하고 있습니다.

다른 클래스로 @Autowired 될 인터페이스의 다중 구현이 있습니다. 런타임에 어떤 구현을 수행할지 결정할 수있을 것입니다. 이것은 팩토리 패턴과 같은 방법으로 달성해야합니다.

public interface SomeInterface {
    public void doSomething();
}

구현 1.

public class SomeOb implements SomeInterface {
    public void doSomething() {
        //Do something for first implementation here
    }
}

구현 2.

public class SomeOtherOb implements SomeInterface {
    public void doSomething() {
        //Do something for first implementation here
    }
}

이제 내 서비스에서 이처럼 자동 유선이 필요했습니다.

@Service 
public class MyService {

   @Autowired
   SomeInterface ob;
   //Rest of the code here

}

1) 자동 구현 할 구현을 선택하는 논리는 런타임 만 알고 있으므로 @Qualifier 주석을 사용하여 자격을 부여 할 수 없습니다. 2) 나는 FactoryBean을 만들려 고했다.

public class SomeFactoryBean implements FactoryBean<SomeInterface> {
@Override
public SomeInterface getObject() throws Exception {
    if(/*Somecondition*/) {
        return new SomeOb();
    } else
        return new SomeOtherOb();
}

@Override
public Class<? extends SomeInterface> getObjectType() {
    if(/*Somecondition*/) {
        return SomeOb.class;
    } else
        return SomeOtherOb.class;
}

@Override
public boolean isSingleton() {
    return false;
}
}

applicationContext.xml에서 언급 한 태그가 있습니다.

웹 서버를 실행할 때 다음과 같은 오류가 발생합니다.

No unique bean of type [com.xxxx.xxxx.SomeInterface] is defined: expected single matching bean but found 3: [xxxx, xxxxxxx, xxxxFactory]

누구 든지이 문제를 해결하도록 도와 줄 수 있습니까? 내가이 일을하지 않는다면이 일을 올바르게하도록 지시하십시오.

도움을 주셔서 감사합니다. jjk

해결법

  1. ==============================

    1.제안 해 주셔서 감사합니다. 동료의 도움으로 문제를 해결할 수있었습니다. 내가 잘못한 것

    제안 해 주셔서 감사합니다. 동료의 도움으로 문제를 해결할 수있었습니다. 내가 잘못한 것

    이러한 변경을 한 후에는 매력처럼 작동했습니다.

  2. ==============================

    2.주어진 응용 프로그램 인스턴스에 대해 Bean의 구현이 하나만 필요한 경우 isSingleton ()에서 true를 반환합니다.

    주어진 응용 프로그램 인스턴스에 대해 Bean의 구현이 하나만 필요한 경우 isSingleton ()에서 true를 반환합니다.

    그러나 나는 당신의 디자인에 의문을 제기합니다.

    항상 속성 파일을 사용하여 이와 같은 구현을 전환합니다. 한때 사이트에 대해 CAPTCHA 통합을 구현해야했습니다. 우리는 JCaptcah와 ReCAPTCHA API로 프로토 타이핑을하고있었습니다. 필요한 기능 만 포함 된 새 인터페이스를 만든 다음 두 API에 대한 구현을 만들었습니다. Spring 설정 파일과 Maven 프로파일에서 플레이스 홀더를 사용하여 컴파일 타임 또는 배치 시간에 구현 클래스를 전환 할 수 있습니다 (예 : mvn jetty : run -DcaptchaImpl = recaptcha 또는 -DcaptchaImpl = jcaptcha).

    달성하려는 작업을 알지 못하면 더 많은 조언을 제공하기가 어렵습니다.

  3. from https://stackoverflow.com/questions/5725222/how-to-use-autowired-to-dynamically-inject-implementation-like-a-factory-patter by cc-by-sa and MIT license