복붙노트

[SPRING] 자동 와이어 링 및 고유 빈 없음의 문제점

SPRING

자동 와이어 링 및 고유 빈 없음의 문제점

2 클래스 (B, C) 클래스 A 확장합니다.

@Service
public class A  extends AbstratClass<Modele>{

    @Autowired
    A(MyClass  br) {
        super(br);
    }


@Service
public class B  extends A{

  @Autowired
  B (MyClass  br) {
     super(br);
  }



@Service
public class C  extends A{

  @Autowired
  C (MyClass  br) {
     super(br);
  }

그러나 나는이 메시지를 가지고있다.

나는 정말로 왜이 메시지를 가지고 있는지 & 봄 문서를 읽은 후에도 해결할 방법을 얻지 못한다.

미리 감사드립니다.

해결법

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

    1.@Qualifier 주석을 사용하여 수업을 다시 작성해야합니다.

    @Qualifier 주석을 사용하여 수업을 다시 작성해야합니다.

    @Service
    @Qualifier("a")
    public class A  extends AbstratClass<Modele>{
    
        @Autowired
        A(MyClass  br) {
            super(br);
        }
    
    
    @Service
    @Qualifier("b")
    public class B  extends A{
    
      @Autowired
      B (MyClass  br) {
         super(br);
      }
    
    @Service
    @Qualifier("c")
    public class C  extends A{
    
      @Autowired
      C (MyClass  br) {
         super(br);
      }
    

    또한 Spring bean을 autowiring하는 A 유형의 인스턴스에 @Qualifier 어노테이션을 사용해야한다.

    이 같은:

    public class Demo {
    
        @Autowired
        @Qualifier("a")
        private A a;
    
        @Autowired
        @Qualifier("b")
        private A a2;
    
        public void demo(..) {..}
    }
    

    프로덕션 코드에서이 Spring 구성을 갖고 싶지 않다면 XML 또는 Java 구성을 사용하여 종속성 삽입 로직을 작성해야합니다.

    유형 A를 확장하는 서비스 클래스 중 하나 위에 @Primary 주석을 사용하여 유형 A의 기본 bean을 지정할 수도 있습니다. 그런 다음 Spring은 @Qualifier 주석을 지정하지 않고 autowire 할 수 있습니다.

    Spring은 어떤 bean을 삽입 할 것인지를 결코 추측하지 않으므로, 타입의 하나 이상의 bean만큼 @Primary로 어느 것을 표시할지 지정해야한다.

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

    2.당신은 A 타입의 bean을 autowire하려고 (다른 곳에서) 노력하고있다.

    당신은 A 타입의 bean을 autowire하려고 (다른 곳에서) 노력하고있다.

    @Autowired
    private A beanA;
    

    그러나 당신은 이것을 준수하는 2 개의 콩을 가지고 있습니다.

    @Resource를 사용하고 정확히 어떤 bean을 지정하여 이것을 해결할 수 있습니다 :

    @Resource("b")
    private A beanA;
    

    (여기서 "b"는 삽입 된 빈의 이름 임) 또는 @Qualifier 주석을 사용합니다.

  3. ==============================

    3.일반적으로 같은 클래스의 두 빈을 정의하면이 오류가 발생합니다.

    일반적으로 같은 클래스의 두 빈을 정의하면이 오류가 발생합니다.

    <bean id="a" class="com.package.MyClass"/>
    <bean id="b" class="com.package.MyClass"/>
    

    위의 두 줄을 처리하면 동일한 클래스의 두 콩이 생깁니다.

    다른 클래스에서이 클래스를 자동 응답하려고하면이 유형의 오류가 발생합니다.

    두 가지 해결책이 있습니다.

    첫 번째 방법

    두 번째 방법

    JSR250 API를 사용하십시오 (클래스 경로에 넣을 수있는 jar 파일).

    그런 다음 아래의 autowriring을 수행하십시오.

    @Resource("a")
    MyClass a
    
    @Resource("b")
    MyClass a
    
  4. from https://stackoverflow.com/questions/2699608/problem-with-autowiring-no-unique-bean by cc-by-sa and MIT license