Spring의 Java Config를 사용하면 런타임에서만 얻을 수있는 생성자 인수가있는 프로토 타입 범위의 Bean을 획득 / 인스턴스화해야합니다. 다음 코드 예제 (간단하게 단순화)를 고려하십시오.
@Autowired
private ApplicationContext appCtx;
public void onRequest(Request request) {
//request is already validated
String name = request.getParameter("name");
Thing thing = appCtx.getBean(Thing.class, name);
//System.out.println(thing.getName()); //prints name
}
여기서 Thing 클래스는 다음과 같이 정의됩니다.
public class Thing {
private final String name;
@Autowired
private SomeComponent someComponent;
@Autowired
private AnotherComponent anotherComponent;
public Thing(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
공지 사항 name
입니다 final
그것이 단지 생성자를 통해 제공 할 수 있으며, 불변성을 보장한다. 다른 종속성은 Thing
클래스 의 구현 별 종속성이며 요청 처리기 구현에 알려지지 않아야합니다.
이 코드는 Spring XML 설정과 완벽하게 호환됩니다.
<bean id="thing", class="com.whatever.Thing" scope="prototype">
<!-- other post-instantiation properties omitted -->
</bean>
Java 구성으로 동일한 것을 어떻게 달성합니까? 다음은 Spring 3.x를 사용하여 작동하지 않습니다.
@Bean
@Scope("prototype")
public Thing thing(String name) {
return new Thing(name);
}
이제 팩토리를 만들 수 있습니다. 예 :
public interface ThingFactory {
public Thing createThing(String name);
}
그러나 이는 ServiceLocator 및 Factory 디자인 패턴을 대체하기 위해 Spring을 사용하는 전체 요점을 무효화 합니다.이 사용 사례에 이상적입니다.
Spring Java Config가 이것을 할 수 있다면, 나는 피할 수 있습니다 :
- 팩토리 인터페이스 정의
- 팩토리 구현의 정의
- 팩토리 구현을위한 테스트 작성
Spring이 이미 XML 구성을 통해 지원하는 매우 사소한 작업에 대해서는 많은 작업 (상대적으로 말하면)입니다.
Thing
구현은 실제로 더 복잡하고 다른 bean에 의존성을 가지고 있습니다 (간단히 생략했습니다). 따라서 요청 처리기 구현에서 필요하지 않은 API / Bean에 처리기를 밀접하게 연결하기 때문에 Request 처리기 구현에 대해 알고 싶지 않습니다. 귀하의 (우수한) 질문을 반영하여 질문을 업데이트하겠습니다.
@Qualifier
매개 변수를 setter에 넣을 수 있다는 것을 알고 있습니다 @Autowired
.
@Bean
작동합니다. 이 @Bean
메소드는 전달한 적절한 인수와 함께 호출됩니다 getBean(..)
.