복붙노트

[SPRING] Spring @Autowired 및 @Qualifier [닫힘]

SPRING

Spring @Autowired 및 @Qualifier [닫힘]

@Autowired로 자동 감지됩니까? @Qualifier를 사용할 때 이름으로 의존성 주입합니까? 어떻게 이러한 주석을 사용하여 setter 및 생성자 주입을 수행 할 수 있습니까?

해결법

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

    1.@Autowired와 함께 @Qualifier를 사용할 수 있습니다. 실제로 Spring은 모호한 bean 유형이 발견되면 명시 적으로 bean을 선택하도록 요청할 것입니다.이 경우 한정자를 제공해야합니다

    @Autowired와 함께 @Qualifier를 사용할 수 있습니다. 실제로 Spring은 모호한 bean 유형이 발견되면 명시 적으로 bean을 선택하도록 요청할 것입니다.이 경우 한정자를 제공해야합니다

    예를 들어 다음과 같은 경우에는 한정자를 제공해야합니다

    @Component
    @Qualifier("staff") 
    public Staff implements Person {}
    
    @Component
    @Qualifier("employee") 
    public Manager implements Person {}
    
    
    @Component
    public Payroll {
    
        private Person person;
    
        @Autowired
        public Payroll(@Qualifier("employee") Person person){
              this.person = person;
        }
    
    }
    

    편집하다:

    Lombok 1.18.4에서는 @Qualifier가있을 때 마지막으로 생성자 삽입시 보일러 플레이트를 피할 수 있으므로 다음을 수행 할 수 있습니다.

    @Component
    @Qualifier("staff") 
    public Staff implements Person {}
    
    @Component
    @Qualifier("employee") 
    public Manager implements Person {}
    
    
    @Component
    @RequiredArgsConstructor
    public Payroll {
       @Qualifier("employee") private final Person person;
    }
    

    새로운 lombok.config 규칙 copyableAnnotations를 사용한다면 (프로젝트의 루트에 lombok.config 파일을 만들면됩니다) :

    # Copy the Qualifier annotation from the instance variables to the constructor
    # see https://github.com/rzwitserloot/lombok/issues/745
    lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier
    

    이것은 최신 lombok 1.18.4에서 최근 소개되었습니다.

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

    2.@Qualifier 어노테이션은 동일한 유형의 빈이 여러 개인 경우 자동 와이어 링 충돌을 해결하는 데 사용됩니다.

    @Qualifier 어노테이션은 동일한 유형의 빈이 여러 개인 경우 자동 와이어 링 충돌을 해결하는 데 사용됩니다.

    @Qualifier 주석은 @Component로 주석 처리 된 모든 클래스 또는 @Bean으로 주석 된 메소드에서 사용할 수 있습니다. 이 주석은 생성자 인수 또는 메서드 매개 변수에도 적용 할 수 있습니다.

    전의:-

    public interface Vehicle {
         public void start();
         public void stop();
    }
    

    2 개의 콩이있다, 차와 자전거는 차량 인터페이스를 구현한다.

    @Component(value="car")
    public class Car implements Vehicle {
    
         @Override
         public void start() {
               System.out.println("Car started");
         }
    
         @Override
         public void stop() {
               System.out.println("Car stopped");
         }
     }
    
    @Component(value="bike")
    public class Bike implements Vehicle {
    
         @Override
         public void start() {
              System.out.println("Bike started");
         }
    
         @Override
         public void stop() {
              System.out.println("Bike stopped");
         }
    }
    

    @Qualifier 주석을 사용하여 @Autowired를 사용하여 VehicleService의 자전거 빈을 주입합니다. @Qualifier를 사용하지 않으면 NoUniqueBeanDefinitionException이 발생합니다.

    @Component
    public class VehicleService {
    
        @Autowired
        @Qualifier("bike")
        private Vehicle vehicle;
    
        public void service() {
             vehicle.start();
             vehicle.stop();
        }
    }
    
  3. ==============================

    3.@Autowired by autowire (또는 검색) by-type @ 이름으로 자동 와이어 링 (또는 검색) 할 수있는 @Qualifier

    @Autowired by autowire (또는 검색) by-type @ 이름으로 자동 와이어 링 (또는 검색) 할 수있는 @Qualifier

    @Component("beanname")
    public class A{}
    
    public class B{
    
    //Constructor
    @Autowired  
    public B(@Qualifier("beanname")A a){...} //  you need to add @autowire also 
    
    //property
    @Autowired
    @Qualifier("beanname")
    private A a;
    
    }
    
    //If you don't want to add the two annotations, we can use @Resource
    public class B{
    
    //property
    @Resource(name="beanname")
    private A a;
    
    //Importing properties is very similar
    @Autowired
    @Value("${property.name}")  //Spring expresssions
    private A a;
    }
    
  4. from https://stackoverflow.com/questions/40830548/spring-autowired-and-qualifier by cc-by-sa and MIT license