복붙노트

[SPRING] Spring 주석의 차이점

SPRING

Spring 주석의 차이점

질문 :

1) @Component와 @Configuration의 차이점은 무엇입니까?

필자는 두 가지 모두 XML에 배선 코드의 필요성을 없애고 차이점을 얻지는 않는다는 것을 읽었습니다.

2) @Autowired, @Inject 및 @Resource의 차이점은 무엇입니까? - 언제 사용할 건데? - 각각의 장단점은 무엇입니까?

해결법

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

    1.@Component와 @Configuration은 사실 아주 다른 유형의 주석입니다.

    @Component와 @Configuration은 사실 아주 다른 유형의 주석입니다.

    @Component 및 유사한 주석 (@Service, @Repository 등) 및 해당 JSR-330 대응 @Named를 사용하면 등록한 또는 @ComponentScan으로 자동 스캔하여 가져올 bean을 선언 할 수 있습니다 클래스의 빈 정의이므로 XML의 태그를 사용하여 지정된 빈을 선언하는 것과 거의 같습니다. 이 bean 유형은 표준 프록시 작성 정책을 준수합니다.

    @Configuration 어노테이션은 XML 설정 파일의 대체물로 설계되었다. @Configuration 어노테이션이 적용된 bean을 생성하기 위해 Spring은 항상 @Configuration 어노테이션이 적용된 클래스를 서브 클래스 화하기 위해 CGLIB를 사용하여 @Bean 어노테이션이 적용된 메소드를 오버라이드하여 bean lookup 메소드로 대체하여 싱글 톤 빈을 한 번만 작성하도록합니다. (스프링은 CGLIB를 사용하여 일반적인 스프링 빈의 내부 메소드 호출을 가로 채기보다는 JDK 프록시처럼 별도의 프록시 인스턴스를 만든다. 현재 세션 빈을 가져 오지 만 클래스 상속만으로는 불가능합니다.) 그럼에도 불구하고 @Configuration 주석이있는 클래스는 컨테이너 (@Autowired, @Inject 등) 필드 및 속성을 사용하여 컨테이너에서 콩 (및 다른 @Configuration 주석 된 콩까지도)을 요청할 수 있습니다.

    문서의 4.12.5 절에있는 예제

    @Configuration
    public class AppConfig {
    
      @Bean
      public ClientService clientService1() {
        ClientServiceImpl clientService = new ClientServiceImpl();
        clientService.setClientDao(clientDao());
        return clientService;
      }
      @Bean
      public ClientService clientService2() {
        ClientServiceImpl clientService = new ClientServiceImpl();
        clientService.setClientDao(clientDao());
        return clientService;
      }
    
      @Bean
      public ClientDao clientDao() {
        return new ClientDaoImpl();
      }
    }
    

    위 예제에서 하나의 ClientDao 인스턴스 만 생성됩니다.

    @Autowired는 Spring 주석이며 @Inject는 JSR-330 주석입니다. @Inject는 @Autowired 또는 @Autowired (required = true)와 동일하지만 JSR-330 @ 주입 주석으로 @Autowired (required = false) 동작을 가져올 수 없습니다. 이 주석은 항상 by-type autowiring을 사용합니다.

    스프링은 JSR-250 @Resource 주석을 약간 특별한 방식으로 구현한다. @Resource는 원래 Java EE에서 JNDI 자원을 찾기 위해 설계되었지만 Spring은 컨테이너의 모든 bean에 연결할 수 있도록 응용 프로그램을 확장합니다 (JNDI 자원은 SimpleJndiBeanFactory의 도움으로 bean으로 사용 가능함). 해당 빈의 이름은 @Resource 주석의 name 속성으로 지정할 수 있습니다. 이름을 지정하지 않으면 주석 필드 또는 속성의 이름이 사용됩니다. 또 다른 이상한 특징은 속성 이름을 가진 bean이 발견되지 않으면 스프링이 by-type 배선으로 대체된다는 것입니다.

    예 컨테이너에 beanAlpha라는 이름의 AlphaClass 빈과 BeanClass 빈 beanBeta가 있다고 상상해보십시오.

    @Resource 
    BetaClass something;  // Wires to beanBeta - by-type
    
    @Resource 
    BetaClass beanAlpha;  // Will throw exception, because "beanAlpha" is not BetaClass -> it's a bad idea to use @Resource as a replacement of @Autowired
    
    @Resource 
    Object beanAlpha;  //Wires to beanAlpha - by-name
    

    따라서 @Resource 주석을 사용할 때 항상 자원 이름을 명시 적으로 지정하는 것이 좋습니다.

    선적 서류 비치

    봄 주석

    빈 표준 주석

    shevchik이 지적한대로 고정 JSR 참조를 업데이트합니다. DI 특정 주석은 Google (Guice Framework) 및 SpringSource (Spring Framework) 엔지니어가 개발 한 JSR-330에 의해 제공됩니다. @Resource는 JNDI 기반이며 JSR-250에서 제공합니다.

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

    2.@Component는 과 동일합니다. @Configuration은 와 같습니다.

    @Component는 과 동일합니다. @Configuration은 와 같습니다.

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

    3.위의 답변 대부분에서 사용자는 @Component 및 @ Configuration이 다른 용도로 사용된다고 말합니다. 하지만 현실에서는 그런 일이 일어나지 않습니다.

    위의 답변 대부분에서 사용자는 @Component 및 @ Configuration이 다른 용도로 사용된다고 말합니다. 하지만 현실에서는 그런 일이 일어나지 않습니다.

    하지만 간단한 스프링 MVC 애플리케이션이있다.

    @Configuration
        public class SpringConfiguration {
    
    @Bean
    public  InternalResourceViewResolver initViewResolver(){
        InternalResourceViewResolver x = new InternalResourceViewResolver();
        x.setPrefix("/WEB-INF/jsp/");
        x.setSuffix(".jsp");
        return x;
    }
    
    }
    

    이 주 클래스는 @Configuration 대신 @Component로 주석이 달라도 잘 동작합니다.

    마찬가지로 @Bean으로 주석 된 메소드가있는 경우 @Component로 주석 처리 된 클래스 내에서 컨텍스트가 loa 될 때 해당 bean이 작성됩니다.

    그래서 우리는 @Configuration과 @Component를 가진 다른 클래스들로 메인 설정 클래스를 표시해야한다는 것이 코드의 가독성을 위해서라고 생각합니다. 실제 실행은 현명한 차이가없는 것 같습니다.

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

    4.@Autowired, @Inject 및 @Resource의 차이점을 보시려면 여기를 클릭하십시오. 여기서 당신은 철저한 설명과 비교를 할 수 있습니다.

    @Autowired, @Inject 및 @Resource의 차이점을 보시려면 여기를 클릭하십시오. 여기서 당신은 철저한 설명과 비교를 할 수 있습니다.

    첫 번째 차이점은 무엇인가 : @Configuration은 XML 기반 구성의 대체품으로 사용됩니다. Java 기반 구성에 사용되는 클래스로 클래스를 표시합니다 (여기 참조). 차례로 @Component는 클래스를 Spring에 의해 인스턴스화 될 클래스로 표시하기 위해 실제로 사용되며 @Configuration은 @Component 주석에 의해 메타 주석이 추가됩니다.

    @Component와 @Configuration은 다른 용도로 사용되므로 비교하기가 쉽지 않습니다.

  5. ==============================

    5.1) XML 설정을 원하면 @Configuration을 무시하십시오. 이는 자바 기반 설정에만 유용합니다. XML 설정은 아마도 Spring에 익숙하지 않은 사람들에게 더 유용 할 것이다.

    1) XML 설정을 원하면 @Configuration을 무시하십시오. 이는 자바 기반 설정에만 유용합니다. XML 설정은 아마도 Spring에 익숙하지 않은 사람들에게 더 유용 할 것이다.

    @Component 주석이 달린 클래스는 구성 요소 검색 중에 선택됩니다. 그것들을 사용하여 Spring 빈으로 노출시키고 자하는 클래스에 레이블을 붙이십시오. 다시 말하지만, 모든 bean을 XML 설정으로 선언하고 @Component를 모두 무시할 수 있습니다.

    2) 응용 프로그램을 Spring에 묶어서 사용한다면 javax.iject 대신 @Autowire를 사용하십시오. 나는 Spring에 대한 의존성을 받아들이는 것이 가장 좋은 방법이라고 제안한다.

  6. from https://stackoverflow.com/questions/12229282/difference-between-spring-annotations by cc-by-sa and MIT license