가끔 특정 비지니스 로직에서 주어진 입력에 따라 Bean을 선택적으로 사용하고 싶은 경우가 있다
Interface를 사용하여 해당 인터페이스를 구현한 Bean들을 컬렉션(List or Map)에 넣어 사용할 수 있다
1. Interface
public interface SampleInterface {
// 임시로 String으로 구현하였으나 Enum으로도 구현 가능하다
boolean isTarget(String targetName);
}
2. Implements
import org.springframework.stereotype.Component;
@Component
public class SampleComponent implements SampleInterface {
private static final String COMPONENT_NAME = "SAMPLE1";
// 생략
@Override
public boolean isTarget(String targetName) {
return COMPONENT_NAME.equals(targetName);
}
}
3. Router 구현
import java.util.List;
import java.util.NoSuchElementException;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
@Component
@RequriedArgsConstructor
public class SampleRouter {
// Map으로 구현할 경우 key=BeanName / value=구현체가 된다
// private final Map<String, SampleInterface> sampleInterfaceMap;
private final List<SampleInterface> sampleInterfaceList;
public SampleInterface getComponent(String targetName) {
return sampleInterfaceList.stream()
.filter(e -> e.isTarget(targetName))
.findFirst()
.orElseThrown(() -> new NoSuchElementException("Wrong Target"));
}
}
4. 사용법
import org.springframework.stereotype.Service;
import lombok.RequiredArgsConstructor;
@Service
@RequiredArgsConstructor
public class SampleService {
private final SampleRouter sampleRouter;
// 생략
private SampleInterface getFromRouter(String targetName) {
return sampleRouter.getComponent(targetName);
}
}
'SpringBoot > Boot' 카테고리의 다른 글
[Gradle] 외부 파일로 Dependency 버전 관리 하기 (0) | 2022.04.14 |
---|