복붙노트

[SPRING] @Bean과 @Autowired의 차이점

SPRING

@Bean과 @Autowired의 차이점

이 경우 @Autowired를 사용할 수없는 이유는 무엇입니까?

@SpringBootApplication
public class Application {

    @Autowired
    BookingService bookingService;

    public static void main(String[] args) {
        bookingService.book("Alice", "Bob", "Carol");
    }
}

@Bean을 사용할 수 있습니다.

@SpringBootApplication
public class Application {

    @Bean
    BookingService bookingService() {
        return new BookingService();
    }

    public static void main(String[] args) {
        ApplicationContext ctx = SpringApplication.run(Application.class, args);
        BookingService bookingService = ctx.getBean(BookingService.class);
        bookingService.book("Alice", "Bob", "Carol");
    }
}

BookingService를 생성하는 두 가지 방법이 같은 것은 아닌가요?

해결법

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

    1.@Bean과 @Autowired는 아주 다른 두 가지 일을합니다. 여기에 나와있는 다른 답변은 좀 더 자세하게 설명되어 있지만 더 간단한 수준입니다.

    @Bean과 @Autowired는 아주 다른 두 가지 일을합니다. 여기에 나와있는 다른 답변은 좀 더 자세하게 설명되어 있지만 더 간단한 수준입니다.

    말이 돼? 첫 번째 예제에서는 Spring에게 BookingService의 인스턴스를 제공하도록 요청했지만 Spring을 만들지 않으므로 Spring은 아무 것도 제공하지 않습니다. 두 번째 예제에서, 당신은 BookingService의 새로운 인스턴스를 생성하고, Spring에 그것에 대해 알려주고, main () 메소드에서 다시 요청합니다.

    원하는 경우 두 번째 main () 메서드에서 두 줄을 제거하고 아래 두 예제를 결합 할 수 있습니다.

    @SpringBootApplication
    public class Application {
    
      @Autowired
      BookingService bookingService;
    
      @Bean
      BookingService bookingService() {
        return new BookingService();
      }
    
      public static void main(String[] args) {
        bookingService.book("Alice", "Bob", "Carol");
      }
    }
    

    이 경우 @Bean 주석은 Spring에게 BookingService를 제공하고 @Autowired는이를 사용합니다.

    이것은 같은 클래스에서 모든 것을 사용하기 때문에 약간의 의미가없는 예제이지만, 하나의 클래스에 @Bean이 정의되어 있고 @Autowired가 다른 클래스에 정의되어 있으면 유용합니다.

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

    2.

    @Bean
    BookingService bookingService() {
        return new BookingService();
    }
    

    Annotating @Bean은 스프링 애플리케이션 컨텍스트에서 bean (객체의 종류)으로 서비스를 등록한다. 간단히 말해서, 그것은 단지 등록이고 다른 것은 아무것도 아닙니다.

    @Autowired
    BookingService bookingService;
    

    @Autowired를 사용하여 변수에 주석을 추가하면 Spring Application Context에서 BookingService bean (즉, Object)이 삽입됩니다.

    (즉) @Bean 어노테이션이있는 등록 된 빈은 @Autowired로 주석 된 변수에 삽입됩니다.

    희망이 당신의 의심을 깨끗이!

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

    3.@DaveyDaveDave의 훌륭한 답 예제 대신

    @DaveyDaveDave의 훌륭한 답 예제 대신

    @Bean
      BookingService bookingService() {
        return new BookingService();
      }
    

    BookingService 클래스에서 @Service 주석을 사용할 수 있습니다.

  4. ==============================

    4.@Autowired 주석에 대한 좋은 기사가 있습니다. http://www.baeldung.com/spring-autowire

    @Autowired 주석에 대한 좋은 기사가 있습니다. http://www.baeldung.com/spring-autowire

    @Autowired 주석은 구성 클래스에 @ComponentScan ( "namespace.with.your.components.for.inject")을 정의하여 주사제를 인스턴스화 할 수 있습니다

    @Configuration
    @ComponentScan("com.baeldung.autowire.sample")
    public class AppConfig {}
    

    모든 구성 요소는 @Component 주석으로 표시되어야합니다. 그것은 @Bean 어노테이션을 대체합니다.

  5. from https://stackoverflow.com/questions/34172888/difference-between-bean-and-autowired by cc-by-sa and MIT license