[SPRING] Spring @Autowired 및 @Qualifier [닫힘]
SPRINGSpring @Autowired 및 @Qualifier [닫힘]
@Autowired로 자동 감지됩니까? @Qualifier를 사용할 때 이름으로 의존성 주입합니까? 어떻게 이러한 주석을 사용하여 setter 및 생성자 주입을 수행 할 수 있습니까?
해결법
-
==============================
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.@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.@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; }
from https://stackoverflow.com/questions/40830548/spring-autowired-and-qualifier by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] URL 요청에 배열을 보내는 방법 (0) | 2018.12.24 |
---|---|
[SPRING] 응답 유형에 적합한 HttpMessageConverter가 없습니다. (0) | 2018.12.24 |
[SPRING] 서블릿 컨테이너를 다시 시작하지 않고 Spring 구성 파일을 다시로드 / 새로 고침 (0) | 2018.12.24 |
[SPRING] 스프링 테스트에서 @EnableScheduling 사용 안함 (0) | 2018.12.24 |
[SPRING] 스프링 IoC 및 일반 인터페이스 유형 [중복] (0) | 2018.12.24 |