반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- K8S
- nestjs공부
- 플러터 공부
- 기술면접공부
- nestjs
- querydsl
- 코테준비
- 스프링공부
- 자바공부
- DDD
- 스프링부트
- Flutter
- 프로그래머스
- JPA
- 자료구조공부
- 코테공부
- Axon framework
- JPA예제
- JPA 공부
- 스프링 공부
- 스프링
- 카프카
- Kafka
- 플러터 개발
- nestjs스터디
- 스프링부트공부
- 기술공부
- 알고리즘공부
- JPA공부
- JPA스터디
Archives
- Today
- Total
DevBoi
[Spring] ObjectProvider + FuntionalInterface 본문
반응형
Functional Interface와 인터페이스를 결합하는 방법에 대해서 알아보자
1개의인터페이스가 있고 이를 가지고 Configuration을 만들어보자
ObjectProvider를 활용해서 한개의 인터페이스로 여러개의 빈을 만드는 과정이다.
간단하지만 아래와 같이 설계했다.
public interface Food {
public String getEat();
interface FoodHandler {
public String eat();
}
}
public interface FoodFunc {
Food.FoodHandler supply();
}
public class FoodImpl implements Food{
FoodHandler handler;
public Food with(FoodFunc handler){
this.handler = handler.supply();
return this;
}
@Override
public String getEat() {
return this.handler.eat();
}
}
public class KoreanFood implements Food.FoodHandler{
@Override
public String eat() {
return "korean";
}
}
public class EngFood implements Food.FoodHandler{
@Override
public String eat() {
return "eng";
}
}
@Configuration
public class FoodConfiguration {
@Bean
Food food(ObjectProvider<Food.FoodHandler> handlers){
return new FoodImpl().with(()->new KoreanFood());
}
}
이렇게 되면 FoodConfiguration 의 Food로 주입되는 빈은 코리안 푸드가 되고
푸드를 사용하는 객체에서는 geteat을 하면, korea가 나오게 된다.
@RestController
public class FoodController {
@Autowired
Food food;
@RequestMapping("/food")
public String foodeat(){
return food.getEat();
}
}
이렇게 하면 어떤게 좋을까?
아래와 같이, 같은 인터페이스를 사용하는 빈이라도, 여러개의 빈으로 생성할 수있다.
@Configuration
public class FoodConfiguration {
@Bean
Food koreafood(ObjectProvider<Food.FoodHandler> handlers){
return new FoodImpl().with(()->new KoreanFood());
}
@Bean
Food engfood(ObjectProvider<Food.FoodHandler> handlers){
return new FoodImpl().with(()->new EngFood());
}
}
사용하는 곳에서는 아래와 같다.
@RestController
public class FoodController {
@Autowired
Food koreafood;
@Autowired
Food engfood;
@RequestMapping("/food")
public String foodeat(){
System.out.println(engfood.getEat());
return koreafood.getEat();
}
}
Food에 대해서 동일 인터페이스를 쓰지만 빈의 구성을 다르게 가져가고싶을때 유용하다,
해당으로 하면 빈에 할당되는 별도 특성을 다르게 줄수 있어서, 좀더 확장성 측면에서 유리하게 된다.
ObjectProvider에서 제공해주는 리스트를 화면에 출력해보고싶을떄는 아래와 같이 뿌려보면 된다.
@Bean
Food koreafood(ObjectProvider<Food.FoodHandler> handlers){
handlers.stream().iterator().forEachRemaining(System.out::println);
return new FoodImpl().with(()->handlers.stream().filter(KoreanFood.class::isInstance));
}
반응형
'Develop > [Spring]' 카테고리의 다른 글
[Spring] Springboot 3.2 Swagger 설정 (0) | 2023.07.22 |
---|---|
[Spring] ObjectMapper 사용 (0) | 2023.07.10 |
[Spring] ObjectProvider에 대해서. (0) | 2023.06.20 |
[Spring] 멀티모듈의 개념 (0) | 2023.06.18 |
[Spring] Fegin 잘 쓰기 (0) | 2023.06.14 |