복붙노트

[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. ==============================

    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. ==============================

    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. ==============================

    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);
    
  4. from https://stackoverflow.com/questions/12844137/spring-working-with-configuration-and-bean-annotations by cc-by-sa and MIT license