younsik
younsik.tech
younsik
전체 방문자
오늘
어제

공지사항

  • 시리즈 모음
  • 분류 전체보기 (34)
    • Dev (17)
      • 일반 (2)
      • 환경세팅 (11)
      • Issue (4)
    • SpringBoot (4)
      • Boot (2)
      • JPA (2)
      • Redis (0)
      • Webflux (0)
    • ElasticStack (0)
      • Elasticsearch (0)
      • Logstash (0)
      • Kibana (0)
    • Docker&Kubernetes (0)
      • Docker (0)
      • Kubernetes (0)
    • Cloud (4)
      • AWS (4)
      • GCP (0)
    • Ops (2)
      • DevOps (1)
      • MLOps (1)
    • Database (1)
      • MySQL (1)
      • MongoDB (0)
      • Cassandra (0)
    • ML&DL (0)
      • Machine Learning (0)
      • Deep Learning (0)
    • Tensorflow (1)
      • Installation (1)
      • Basic (0)
      • TFX (0)
    • Pytorch (0)
      • Installation (0)
      • Basic (0)
    • Hands-on (5)
      • SpringBoot (5)

블로그 메뉴

  • 홈
  • Github
  • GitBlog
  • 태그
  • 방명록

링크 모음

실무 예제로 배우는 Elasticsearch 검색엔진

인기 글

태그

  • boot
  • jenv
  • Issue
  • Intel
  • Kubeflow
  • Intellij
  • Beginner
  • JPA
  • Spring
  • Node
  • amvu
  • codesource
  • asdf
  • miniforge
  • zplug
  • 환경세팅
  • docker
  • Java
  • Homebrew
  • AWS
  • mlops
  • MVC
  • erlang
  • 개발환경
  • MAC
  • gradle
  • ubuntu
  • GIT
  • openjdk
  • m1

최근 댓글

최근 글

hELLO · Designed By 정상우.
younsik

younsik.tech

SpringBoot/Boot

[Bean] Router 구현

2022. 4. 12. 16:38

가끔 특정 비지니스 로직에서 주어진 입력에 따라 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
    'SpringBoot/Boot' 카테고리의 다른 글
    • [Gradle] 외부 파일로 Dependency 버전 관리 하기
    younsik
    younsik
    younsik.tech의 기술 블로그

    티스토리툴바