@Configuration
주석이 달린 클래스를 만듭니다 .
@Configuration
public class MyApplicationContext {
}
각 <bean>
태그에 대해 다음 과 @Bean
같이 주석이 달린 메소드를 만듭니다 .
@Configuration
public class MyApplicationContext {
@Bean(name = "someBean")
public SomeClass getSomeClass() {
return new SomeClassImpl(someInterestingProperty); // We still need to inject someInterestingProperty
}
@Bean(name = "anotherBean")
public AnotherClass getAnotherClass() {
return new AnotherClassImpl(getSomeClass(), beanFromSomewhereElse); // We still need to inject beanFromSomewhereElse
}
}
수입하기 위해 beanFromSomewhereElse
우리는 정의를 가져와야합니다. XML로 정의 할 수 있으며 다음을 사용할 것입니다 @ImportResource
.
@ImportResource("another-application-context.xml")
@Configuration
public class MyApplicationContext {
...
}
Bean이 다른 @Configuration
클래스에 정의되어 있으면 @Import
주석을 사용할 수 있습니다 .
@Import(OtherConfiguration.class)
@Configuration
public class MyApplicationContext {
...
}
다른 XML이나 @Configuration
클래스를 가져온 후에는 @Configuration
다음과 같이 클래스에 개인 멤버를 선언하여 컨텍스트에서 선언 한 Bean을 사용할 수 있습니다 .
@Autowired
@Qualifier(value = "beanFromSomewhereElse")
private final StrangeBean beanFromSomewhereElse;
또는 이에 의존하는 Bean을 정의하는 메소드에서 다음과 같이 매개 변수로 직접 beanFromSomewhereElse
사용 @Qualifier
합니다.
@Bean(name = "anotherBean")
public AnotherClass getAnotherClass(@Qualifier (value = "beanFromSomewhereElse") final StrangeBean beanFromSomewhereElse) {
return new AnotherClassImpl(getSomeClass(), beanFromSomewhereElse);
}
속성 가져 오기는 다른 xml 또는 @Configuration
클래스 에서 bean을 가져 오는 것과 매우 유사합니다 . 사용하는 대신 다음과 같이 속성과 함께 @Qualifier
사용 @Value
합니다.
@Autowired
@Value("${some.interesting.property}")
private final String someInterestingProperty;
이것은 SpEL 표현식 에서도 사용할 수 있습니다 .
Spring이 이러한 클래스를 Bean 컨테이너로 취급 할 수 있도록하려면이 태그를 컨텍스트에 넣어 메인 xml에 표시해야합니다.
<context:annotation-config/>
이제 @Configuration
간단한 빈을 만드는 것과 똑같은 클래스를 가져올 수 있습니다 .
<bean class="some.package.MyApplicationContext"/>
스프링 XML을 모두 피하는 방법이 있지만이 답변의 범위에 포함되지 않습니다. 이 옵션 중 하나는 내 답변을 기반으로하는 내 블로그 게시물 에서 찾을 수 있습니다 .
기본적으로 다음과 같은 몇 가지 장점으로 인해 XML을 사용하는 것보다 빈을 선언하는이 방법이 훨씬 더 편합니다.
단점은 내가보기에 그리 많지 않지만 몇 가지 생각할 수 있습니다.