@Qualifier, @Primary
DiscountPolicy 인터페이스는 FixDiscountPolicy, RateDiscountPolicy 라는 구현체 두개를 갖고있다.
만약 두개의 구현체 모두 스프링 컨테이너에 등록이 되어있고 어느 클래스에서 DiscountPolicy를
DI 받아야 하는 상황이라면 FixDiscountPolicy, RateDiscountPolicy 사이에 충돌이 일어날 것이다.
이럴 경우 사용할 수 있는 방법 두 가지를 설명하겠다.
- @Qualifier
DiscountPolicy 구현체들 중 사용하고 싶은 클래스에 @Qualifier("xxxDiscountPolicy) 라고 작성해준다.
"" 안은 이름 옵션을 설정해주는 것이다. 그런 후 DI가 발생하는 곳에 동일하게 작성하여 주면 된다.
동작 순서는 이름이 같은 @Qualifier끼리 매칭을 한다. 존재하지 않으면 ""에 작성한 이름과 같은 빈이 있는지 찾는다.
하지만 @Qualifier는 클래스에 태그를 붙여 동일한 태그를 찾는 동작이다. 이름으로 매칭시키는 일은 안만드는게 좋다. - @Primary
사용하고 싶은 클래스에 @Primary를 작성해 주면 된다. 그 이후 따로 작성해야할 코드는 없다.
//@Qualifier 사용해서 생성자 주입.
@Autowired
public OrderServiceImpl(MemberRepository memberRepository,
@Qualifier("mainDiscountPolicy") DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
@Qualifier는 클래스 파일에 작성하고 DI가 일어나는 곳에도 적어주어야 한다. @Primary는 클래스 파일에만
작성해주면 된다.
각 구현 파일에 @Qualifier 와 @Primary가 작성되어 있다면 @Qualifier가 작성되어있는 클래스가 우선 순위를 받는다.
빈 생명주기 콜백
객체가 생성되고 소멸될 때 필요한 작업이 있는 경우가 있다. 초기화 작업, 종료 작업 이라고 한다.
스프링 빈은 객체 생성 후 의존관계를 주입한다. 이 과정이 끝나야 정보들이 주입이 되어 있는 것이다.
그런데 이 타이밍을 개발자가 언제인지 알기 쉽지 않다. 의존 관계가 주입이 끝난 직후
(필요한 정보가 다 세팅이 된 후), 스프링 빈이 소멸되기 직전에 메서드를 알아서 실행 시켜주는 방법
2개가 있다.
- 빈 등록 초기화, 소멸 메서드 지정 (설정 정보 사용)
설정 정보에 작성하는 방법이다. (Bean을 사용할 때를 의미한다.) destroyMethod는 default 값이 inferred(추론)이다.
close(), shutdown() 으로 이름이 지정된 메서드를 자동으로 종료 메서드로 추론해서 호출해준다. 그래서 따로 적어주지
않아도 종료 메서드로 사용한다. 설정 정보 사용의 특징은 메서드 이름을 자유롭게 지정이 가능하며 스프링 코드에 의존하지 않는다.
설정 정보를 사용하기에 고칠 수 없는 외부 라이브러리에도 초기화, 종료 메서드를 적용할 수 있다. - @PostConstruct, @PreDestroy
의미 그대로 생성자 이후, 소멸 전에 사용할 메서드 위에 붙여주기만 하면된다. 너무 편해~ 자바에서 제공하는 javax 패키지여서
스프링 아닌 곳에서도 사용 가능하다. 단점은 외부 라이브러리에 적용을 못한다.
//설정 정보 사용
@Configuration
static class LifeCycleConfig {
@Bean(initMethod = "init", destroyMethod = "close")
public NetworkClient networkClient() {
NetworkClient networkClient = new NetworkClient();
networkClient.setUrl("http://hello-spring.dev");
return networkClient;
}
}
결론: @PostConstruct, @PreDestroy 쓰면 되는데 외부 라이브러리를 초기화, 종료 해야하면 설정 정보 사용하면 된다.
728x90
반응형
'Spring' 카테고리의 다른 글
[Spring] 웹 스코프 (request) & 프록시 (2) | 2022.08.11 |
---|---|
[Spring] 빈 스코프 (프로토타입) (0) | 2022.08.09 |
[Spring] 의존관계 자동 주입 방법 & 옵션 처리 & LOMBOK(롬복) (0) | 2022.08.01 |
[Spring] @ComponentScan & @Autowired (의존관계 자동 주입) (1) | 2022.07.26 |
[Spring] 싱글톤 컨테이너 (1) | 2022.07.23 |