[SPRING] @Configuration과 @Bean 어노테이션으로 작업하는 Spring
SPRING@Configuration과 @Bean 어노테이션으로 작업하는 Spring
나는 코드를 가지고있다:
@Configuration
public class BeanSample {
@Bean(destroyMethod = "stop")
public SomeBean someBean() throws Exception {
return new SomeBean("somebean name1");
}
class SomeBean {
String name;
public SomeBean(String name) {
this.name = name;
}
public void stop() {
System.out.println("stop");
}
}
public static void main(String[] args) throws Exception {
BeanSample beanSample = new BeanSample();
SomeBean someBean1 = beanSample.someBean();
ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(
new String[] {"appContext.xml"});
SomeBean someBean2 = (SomeBean) appContext.getBean("someBean");
if (someBean1 == someBean2) System.out.println("OK");
}
}
일단 BeanSample.getSomeBean ()을 시작하면 SomeBean이 'someBean'에서 사용할 수있게되기를 기대합니다.
이제는 오류가 있습니다. 'someBean'이라는 bean이 정의되지 않았습니다.
사실, 나는 콩을 고르는 데 사용해야하는 앱 컨텍스트를 이해하지 못하고 있습니다.
@Configuration 정보 :
@Configuration 주석을 사용해야하는 이유는 무엇입니까? (이 중 하나를 사용하면 내 IDE가 내 수업을 강조하므로 봄에 관련이 있으므로 이해해야합니다.)
- OK : 대답을 얻은 후 코드는 다음과 같습니다.
public static void main(String[] args) throws Exception {
AnnotationConfigApplicationContext appContext = new AnnotationConfigApplicationContext(BeanSample.class);
SomeBean someBean2 = (SomeBean) appContext.getBean("someBean");
if (someBean2 != null) System.out.println("OK");
}
해결법
-
==============================
1.먼저 Java 구성을 사용하는 경우 다음과 같이 컨텍스트를 인스턴스화해야합니다.
먼저 Java 구성을 사용하는 경우 다음과 같이 컨텍스트를 인스턴스화해야합니다.
new AnnotationConfigApplicationContext(BeanSample.class)
둘째, @Configuration 어노테이션은 어노테이션 된 클래스에서 빈을 만들지 않는다. Bean을 생성하는 데 @Bean 메소드 만 사용됩니다.
BeanSample bean을 원한다면, 하나를 생성하는 또 다른 @Bean 메소드를 생성해야한다. 그런데 왜 다시 원하니? @Configuration 클래스는 구성 컨테이너로만 사용하고 다른 컨테이너로는 사용하지 않아야한다고 생각합니다.
셋째, @Bean의 기본 빈 이름은 프로퍼티 게터 규칙을 따르지 않습니다. 메소드 이름은 직접 사용됩니다. 예를 들어, bean은 someBean이 아니라 getSomeBean으로 이름 지정됩니다. 이 방법을 다음으로 변경하십시오.
@Bean(destroyMethod = "stop") public SomeBean someBean() throws Exception { return new SomeBean("somebean name1"); }
마지막으로 @Configuration 클래스를 인스턴스화하면 안됩니다. 그 메소드는 bean을 생성하는 목적을 제공합니다. 그러면 Spring은 라이프 사이클을 처리하고 속성을 주입합니다. 반대로 클래스를 인스턴스화하고 메소드를 직접 호출하면 반환 된 객체는 Spring과 아무 관련이없는 일반 객체가됩니다.
-
==============================
2.곁에 생성 한 콩
곁에 생성 한 콩
@Bean public SomeBean getSomeBean()
는 기본 이름을 가지며 이는 생산자 메소드 getSomeBean의 이름입니다.
그래서 당신은 두 가지 일을 할 수 있습니다.
@Bean public SomeBean getSomeBean() {...} ... SomeBean bean = (SomeBean) appContext.getBean("getSomeBean"); if (bean != null) System.out.println("OK");
또는
@Bean(name="someBean") public SomeBean getSomeBean() {...} ... SomeBean bean = (SomeBean) appContext.getBean("someBean"); if (bean != null) System.out.println("OK");
ClassPathXmlApplicationContext 대신 AnnotationConfigApplicationContext를 사용한 완전한 예제
import java.util.Arrays; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class BeanSample { @Bean(name="someBean") public SomeBean getSomeBean() throws Exception { return new SomeBean("somebean name1"); } class SomeBean { String name; public SomeBean(final String name) { this.name = name; } public void stop() { System.out.println("stop"); } } public static void main(final String[] args) throws Exception { AnnotationConfigApplicationContext appContext = new AnnotationConfigApplicationContext(BeanSample.class); BeanSample beanSample = (BeanSample) appContext.getBean("beanSample"); //next time use this to have a look at the beans in the context! System.out.println(Arrays.toString(appContext.getBeanDefinitionNames())); SomeBean bean = (SomeBean) appContext.getBean("someBean"); if (bean != null) System.out.println("OK"); } }
산출:
-
==============================
3.@Configuration 빈 구성 (이 컨텍스트 xml 파일을 사용하여 이전에 정의한 내용은 이제 @Configuration Java 코드를 사용하여 정의 됨)을 사용하여 테스트를 수행해야합니다.
@Configuration 빈 구성 (이 컨텍스트 xml 파일을 사용하여 이전에 정의한 내용은 이제 @Configuration Java 코드를 사용하여 정의 됨)을 사용하여 테스트를 수행해야합니다.
Bean 설정을 제공하는 BeanSample을 사용하여 응용 프로그램 컨텍스트를 만듭니다.
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(BeanSample.class);
자, @Configuration에서 :
@Bean public SomeBean someBean() throws Exception { return new SomeBean("somebean name1"); }
bean 이름은 메소드 이름입니다. 메소드 이름 위의 "someBean"인 경우, "getSomeBean"으로 bean 이름을 가졌습니다.
그래서 콩을 올려다보기 위해서 :
SomeBean bean = appContext.getBean("someBean", SomeBean.class);
from https://stackoverflow.com/questions/12844137/spring-working-with-configuration-and-bean-annotations by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 봄에 빈 구성 무시 (0) | 2019.04.07 |
---|---|
[SPRING] MockRestServiceServer로 REST 호출 조롱 (0) | 2019.04.07 |
[SPRING] "이름이 '제품'인 지속성 단위가 없습니다. ' (0) | 2019.04.07 |
[SPRING] POST 및 SPRING-MVC를 통해 여러 객체를 보내는 문제 (0) | 2019.04.06 |
[SPRING] 스프링 보안의 최대 동시 사용자 (0) | 2019.04.06 |