2017-10-31 2 views
1

나는 인터페이스 계층과 같이 있습니다자바 봄 부팅 구성은 표준

public interface Shape { 
    //code 
} 

@Component 
public class Circle implements Shape { 
    //code 
} 

@Component 
public class Square implements Shape { 
    //code 
} 

내가 봄 부팅 콩 규칙을 사용하여 이러한를 연결하는 가장 좋은 방법을 알고 싶습니다.

해결 방법 1 :

@Component(value = "Circle") 
public class Circle implements Shape { 
    //code 
} 

@Component(value = "Square") 
public class Square implements Shape { 
    //code 
} 

@Configuration 
public class ShapeConfig { 
    @Bean 
    Foo circleFoo(@Qualifiers("Circle") Shape shape) { 
     return new Foo(shape); 
    } 

    @Bean 
    Foo squareFoo(@Qualifiers("Square") Shape shape) { 
     return new Foo(shape); 
    } 
} 

해결 방법 2 :

@Component 
public class Circle implements Shape { 
    //code 
} 

@Component 
public class Square implements Shape { 
    //code 
} 

@Configuration 
public class ShapeConfig { 
    @Bean 
    Foo circleFoo(Circle shape) { 
     return new Foo(shape); 
    } 

    @Bean 
    Foo squareFoo(Square shape) { 
     return new Foo(shape); 
    } 
} 

이 경우 가장 좋은 자바/봄 연습은 무엇입니까? 내가 조금 장황 할 가치와 @Qualifier 물건을 찾을 구체적인 구현에 배선이

그것은 응용 프로그램의 구현에 따라 달라집니다
+0

흥미로운 질문 ... 나는 명확한 답을 가지고 있지 않지만, 그럴 경우 해결 방법 2로 갈 것입니다. 가능한 경우 마술 주석을 피하는 경향이 있습니다. 한정어로 아무 것도 얻지 못한다면, 그렇게 사소한 것을 봄으로 위임하는 것이 무의미한 것처럼 보인다. – SrThompson

답변

1

눈살을 찌푸리게하는 경우 궁금 해요

은 자동으로 묶어 경우, 스프링은 먼저하려고 autowire byName 그런 다음 타입별로 찾아서 생성자별로 (타입별로 빈을 찾지 못한 경우) 찾아 낸다.

동일한 유형 및 다른 이름을 가진 여러 가지 bean이 없기 때까지 우리는 솔루션 2 (우리는 생성자 대신 autowire byName을 사용할 수 있습니다)가 좋지만, 2 개 이상이 있고 2 개가있는 경우 같은 종류의 콩은 우리가 (한정자) 솔루션 1 이동 예 :

@Configuration 
    public class Config { 
    @Bean(name = "circle1") 
    public Circle getCircle1(){ 
     Circle c = new Circle(); 
     c.setRadius(1.5); 
     return c; 
    } 

    @Bean(name = "circle2") 
    public Circle getCircle2(){ 
     Circle c = new Circle(); 
     c.setRadius(10); 
     return c; 
    } 
    } 

내가 자동으로 묶어주기 위해 같은 난 예선의 도움으로 autowire하기 한

@Component 
CirculeService { 
@Autowire @Qualifier("circle1") Circle circle1 
@Autowire @Qualifier("circle2") Circle circle2 
} 

여기 exapme 위의 서비스를 (있다고 가정 생성자 별)