복붙노트

[SPRING] Spring 3에서 @Component와 @Configuration의 차이점

SPRING

Spring 3에서 @Component와 @Configuration의 차이점

Spring 3 (@Component 및 @Configuration)에서 제공하는 두 가지 주석을 발견했습니다. 나는 이것들 사이에 약간 혼란 스럽다. 다음은 @Component에 대한 내용입니다.

그래서 @Configuration의 사용법이 궁금하다. @Controller가 스프링 구성 xml 파일에서 선언 할 필요없이 내 빈을 등록한다면

해결법

  1. ==============================

    1.@Configuration은 Spring 3에서 소개 된 Java 기반 구성 메커니즘의 핵심입니다. 이는 XML 기반 구성의 대안을 제공합니다.

    @Configuration은 Spring 3에서 소개 된 Java 기반 구성 메커니즘의 핵심입니다. 이는 XML 기반 구성의 대안을 제공합니다.

    따라서 다음 2 개의 스 니펫은 동일합니다.

    <beans ...>
        <context:component-scan base-package="my.base.package"/>
        ... other configuration ...
    </beans>
    

    과:

    @Configuration
    @ComponentScan(basePackages = "my.base.package")
    public class RootConfig {
        ... other configuration ...
    }
    

    두 경우 모두 Spring은 @Component로 주석 된 클래스 나 @Service와 같이 @Component로 메타 주석이 첨부 된 다른 주석 중 하나를 my.base.package 이하에서 검색합니다.

  2. ==============================

    2.도서 프로 봄 통합에서

    도서 프로 봄 통합에서

    @Configuration 클래스는 @Bean으로 주석 된 메소드가 팩토리 빈에 사용된다는 점을 제외하면 일반 @Components 클래스와 같습니다. @Bean 주석이 달린 메소드를 사용하는 @Component는 스코프가 존중되지 않고 @Bean 메소드가 다시 호출되므로 (재생중인 캐싱이 없음), CGLIB가 필요하지만 @Configuration이 선호된다는 점을 제외하고는 동일한 방식으로 작동합니다

  3. ==============================

    3.전체 예제와의 차이점은 다음과 같습니다.

    전체 예제와의 차이점은 다음과 같습니다.

    //@Configuration or @Component
    public static class Config {
        @Bean
        public A a() {
            return new A();
        }
        //**please see a() method called inside b() method**
        @Bean
        public B b() {
            return new B(a());
        }
    }
    

    1) 여기서 a () 메소드와 b () 메소드보다 @configuration으로 주석이 붙은 Config 클래스는 두 번 호출됩니다.

    2) 여기서 @component로 주석 된 Config 클래스는 a () 메소드보다 한 번 호출되지만 b () 메소드는 두 번 호출됩니다.

    (2)의 문제점 : @compenent 주석에 문제가 있음을 알았 기 때문에. 이 두 번째 구성 (2)은 스프링이 A의 싱글 톤 빈을 생성하지만 B가 스프링 컨텍스트 제어 밖에있는 A의 다른 인스턴스를 가져 오기 때문에 완전히 잘못된 것입니다.

    해결책 : - @automired 어노테이션과 @component 어노테이션을 Config 클래스 내에서 사용할 수 있습니다.

    @Component
    public static class Config {
        @Autowired
        A a;
    
        @Bean
        public A a() {
            return new A();
        }
    
        @Bean
        public B b() {
            return new B(a);
        }
    }
    
  4. ==============================

    4.이것은 오래되었지만 예를 들어 JavaBoy와 Vijay의 답변에 대해 자세히 설명하고 있지만 다음과 같습니다.

    이것은 오래되었지만 예를 들어 JavaBoy와 Vijay의 답변에 대해 자세히 설명하고 있지만 다음과 같습니다.

    @Configuration
    public class JavaConfig {
        @Bean
        public A getA() {
            return new A();
        }
    }
    
    @Component
    @ComponentScan(basePackages="spring.example")
    public class Main() {
        @Bean
        public B getB() {
            return new B();
        }
        @Autowired
        JavaConfig config;
    
        public static void main(String[]a) {
            Main m = new AnnotationConfigApplicationContext(Main.class)
                .getBean(Main.class);
            /* Different bean returned everytime on calling Main.getB() */
            System.out.println(m.getB());
            System.out.println(m.getB());
            /* Same bean returned everytime on calling JavaConfig.getA() */
            System.out.println(m.config.getA());
            System.out.println(m.config.getA());
        }
    }
    
  5. from https://stackoverflow.com/questions/11903053/difference-between-component-and-configuration-in-spring-3 by cc-by-sa and MIT license