sourcecode

스프링: @Component vs @Bean

copyscript 2022. 7. 27. 23:53
반응형

스프링: @Component vs @Bean

는 그것을 한다.@Component주석은 클래스 경로 스캔을 사용하여 xml bean 정의를 제거하기 위해 스프링 2.5에서 도입되었습니다.

@Bean3.되어 봄 3.0과 함께 할 수 .@Configuration.xml java config를 사용합니다.

할 수 요?@Component은 '주석'이 '주석'입니다.@Bean? 두 경우 있습니다.두 경우 모두 콩을 만드는 것이 최종 목표인 것으로 알고 있습니다.

@컴포넌트 스캔 및 자동 배선에 적합합니다.

언제 @Bean을 사용해야 합니까?

자동 설정이 선택사항이 아닌 경우가 있습니다.언제? 서드파티 라이브러리에서 컴포넌트를 배선한다고 가정합니다(소스 코드가 없기 때문에 @Component를 사용하여 클래스에 주석을 달 수 없습니다). 따라서 자동 구성은 불가능합니다.

@Bean 주석은 애플리케이션 컨텍스트에서 spring을 bean으로 등록해야 하는 개체를 반환합니다.메서드의 본문에는 인스턴스 작성을 담당하는 논리가 포함되어 있습니다.

@Component ★★★★★★★★★★★★★★★★★」@Bean이치노라고 합니다. 혼동하지 마세요.

@Component (그리고)@Service ★★★★★★★★★★★★★★★★★」@Repository는 클래스 및 하기 위해 는 클래스 패스스캔을 사용하여 콩을 자동 검출 및 자동 설정하기 위해 사용합니다.주석이 달린 클래스와 콩(클래스당 콩 1개) 사이에는 암묵적인 일대일 매핑이 있습니다.이 접근방식은 순전히 선언적인 것이기 때문에 배선의 제어가 상당히 제한됩니다.

@Bean위에서 설명한 것처럼 스프링이 자동으로 실행하도록 하는 것이 아니라 단일 콩을 명시적으로 선언하는 데 사용됩니다.클래스 정의에서 빈 선언을 분리하여 원하는 방식으로 빈을 만들고 구성할 수 있습니다.

질문에 답하려면...

할 수 요?@Component은 '주석'이 '주석'입니다.@Bean주??

네, 아마 그럴 겁니다. 하지만 그들은 그렇게 하지 않기로 했습니다. 왜냐하면 그 둘은 상당히 다르기 때문입니다.봄은 더 이상 물을 더럽히지 않아도 충분히 혼란스럽다.

동적 상태에 따라 특정 구현을 원한다고 가정해 보겠습니다. @Bean그런 경우엔 완벽해

@Bean
@Scope("prototype")
public SomeService someService() {
    switch (state) {
    case 1:
        return new Impl1();
    case 2:
        return new Impl2();
    case 3:
        return new Impl3();
    default:
        return new Impl();
    }
}

할 수 있는 방법은 없어요.@Component.

  1. @component는 클래스 패스스캔을 사용하여 콩을 자동으로 검출 및 설정하는 반면 @Bean은 스프링에 의해 자동으로 콩을 선언하지 않고 단일 콩을 명시적으로 선언합니다.
  2. @Component는 클래스 정의에서 빈 선언을 분리하지 않습니다.@Bean은 클래스 정의에서 빈 선언을 분리합니다.
  3. @Component는 클래스 수준의 주석인 반면 @Bean은 메서드 수준의 주석으로 메서드의 이름이 빈 이름으로 사용됩니다.
  4. @Component는 @Configuration 주석과 함께 사용할 필요가 없습니다.@Configuration에서는 @Bean 주석을 클래스 내에서 사용해야 합니다.
  5. 클래스가 스프링 컨테이너 외부에 있는 경우 @Component를 사용하여 클래스의 빈을 만들없습니다.반면 클래스가 스프링 컨테이너 외부에 있는 경우에도 @Bean을 사용하여 클래스의 빈을 만들 수 있습니다.
  6. @Component에는 @Controller, @Repository, @Service 등 다른 전문성이 있는데 반해 @Bean에는 전문성이 없습니다.

두 방법 모두 스프링 컨테이너에 대상 유형을 등록하는 것을 목표로 합니다.

점은 '하다'는 것입니다.@Bean메서드에 적용할 수 있지만,@Component는 유형에 적용할 수 있습니다.

, 「 」를 사용하는 는,@Bean주석: 메서드 본문에서 인스턴스 작성 로직을 제어합니다(위의 예 참조).와 함께@Component주석을 사용할 수 없습니다.

는 답을 볼 수 되는 거의 에 있다.@Component 및 ""을 위한 입니다.@Bean콩이 다르게 사용됨을 정확히 선언하는 입니다.어떻게 다른지 보여줄게.

  • @빈

먼저 메서드 수준의 주석입니다.코드로 설정을 하지 않는 ), "Java" "bean" (xml " " " ) " " " 를 합니다.ApplicationContext.getBean§:

@Configuration
class MyConfiguration{
    @Bean
    public User getUser() {
        return new User();
    }
}

class User{
}    
        
// Getting Bean 
User user = applicationContext.getBean("getUser");
  • @컴포넌트

이것은 전문 콩이 아닌 콩에 주석을 다는 일반적인 방법입니다.이것은 클래스 레벨의 주석이며 Java 또는 xml 구성을 통해 이러한 모든 구성 요소를 피하기 위해 사용됩니다.

이런 일이 생기죠

@Component
class User {
}

// to get Bean
@Autowired
User user;

바로 그겁니다.이것은, 그 콩을 인스턴스화해 사용하기 위한 모든 설정 순서를 회피하기 위해서 도입된 것입니다.

하시면 됩니다.@Bean기존 서드파티 클래스를 스프링 프레임워크 응용 프로그램 컨텍스트에서 사용할 수 있도록 설정합니다.

@Bean
public ViewResolver viewResolver() {

    InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();

    viewResolver.setPrefix("/WEB-INF/view/");
    viewResolver.setSuffix(".jsp");

    return viewResolver;
}

「 」를 해 주세요.@Bean클래스로 수 (주석은로 랩할 수 ).@Component봄)을 봄콩으로 사용하지 않을 수도 있습니다. 리리 using using using using using로 @Bean싱글톤 오브젝트로 Spring 프레임워크어플리케이션 컨텍스트에서 사용할 수 있습니다. 및 사용법을 하여 이 할 수 .@Autowired

'아주머니'를 생각해 보세요.@Bean주석은 서드파티 클래스용 래퍼 또는 래퍼입니다.Spring 프레임워크 응용 프로그램 컨텍스트에서 타사 클래스를 사용할 수 있도록 설정하려고 합니다.

「」를 사용해 .@Bean으로 하나의 그 를 만들고입니다. 왜냐하면 메서드 안에서 나는 명시적으로 오브젝트를 만들고 있기 때문입니다.new키워드를 지정합니다.또한 지정된 클래스의 세터 메서드를 수동으로 호출합니다.따라서 프리픽스 필드의 값을 변경할 수 있습니다.이 수동 작업을 명시적 생성이라고 합니다.「 」를 하고 @Component같은 클래스의 경우 Spring 컨테이너에 등록된 빈은 prefix 필드의 기본값을 가집니다.

을 붙일 , 반에 주석을 붙일 때, 반에 주석을 붙이면,@Component으로 사용할 new키워드를 지정합니다.이치노

「 」를하는 @Component방식(「」(「」)을 사용하는 Object」)을 것과 .@Bean예를 들어 다음 방법1과 2에서도 같은 결과가 나옵니다.

방법 1

@Component
public class SomeClass {

    private int number;

    public SomeClass(Integer theNumber){
        this.number = theNumber.intValue();
    }

    public int getNumber(){
        return this.number;
    }
}

'The Number'에 콩을 붙입니다.

@Bean
Integer theNumber(){
    return new Integer(3456);
}

방법 2

//Note: no @Component tag
public class SomeClass {

    private int number;

    public SomeClass(Integer theNumber){
        this.number = theNumber.intValue();
    }

    public int getNumber(){
        return this.number;
    }
}

콩과 함께:

@Bean
Integer theNumber(){
    return new Integer(3456);
}

@Bean
SomeClass someClass(Integer theNumber){
    return new SomeClass(theNumber);
}

방법 2는 콩 선언을 함께 보관할 수 있고, 조금 더 유연합니다.다음과 같이 Vanilla가 아닌 다른 SomeClass bean을 추가할 수도 있습니다.

@Bean
SomeClass strawberryClass(){
    return new SomeClass(new Integer(1));
}

콩을 생성하는 방법은 두 가지가 있습니다.는 '반을, '반은 '반'에 주석을 붙이는 입니다.@Component@Bean.@Bean을 달아야 @Configuration하면 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★@ComponentScan.@Component이 클래스의 인스턴스를 IOC 컨테이너로 복원합니다. another른른 another another@ComponentScan 이 할 때 할 수 있습니다.@BeanIOC가 개최하다따라서 해야 할 는 '콩'을 해야 합니다.@Bean로직을 작성하여 원하는 객체를 반환할 수 있습니다.또 하나 언급할 필요가 있는 것은, 다음의 방법을 사용하는 경우입니다.@Bean콩을 먹다

Bean과 컴포넌트의 차이:

Difference between Bean and Component

  • @component 및 그 특화(@Controller, @service, @repository)에서는 클래스 패스스캔을 사용하여 자동검출을 할 수 있습니다.@Controller, @service, @repository 등의 컴포넌트 클래스가 표시되는 경우 컴포넌트 스캔을 사용하여 스프링 프레임워크에 의해 자동으로 스캔됩니다.
  • @Bean은 컨피규레이션클래스에서1개의 빈을 명시적으로 선언하기 위해서만 사용할 수 있습니다.
  • @Bean은 하나의 콩을 봄으로 자동 선언하는 것이 아니라 명시적으로 선언하는 데 사용되었습니다.그것은 클래스 정의에서 콩의 9단계 선언을 만든다.
  • 즉, @Controller, @service, @repository는 자동검출용이고 @Bean은 클래스에서 분리빈을 만듭니다.
- @컨트롤러퍼블릭 클래스 Login Controller{ --code-- }
- @설정퍼블릭 클래스 AppConfig {@빈public Session Factory session Factory(){--code--}

@Bean은 컴파일 시 Spring과 비즈니스 규칙이 결합되지 않도록 작성되었습니다.즉, PlayFramework 또는 JEE와 같은 다른 프레임워크에서 비즈니스 규칙을 재사용할 수 있습니다.

또한 콩을 만드는 방법을 완전히 제어할 수 있습니다. 기본 스프링 인스턴스로는 충분하지 않습니다.

그 얘기를 하면서 글을 썼어요.

https://coderstower.com/2019/04/23/factory-methods-decoupling-ioc-container-abstraction/

에 대해서 @Component @ @ @
@Component @Configuration > 。

둘 다 주석이 달린 클래스에 하나 이상의 콩을 등록해야 함을 나타냅니다.Spring-IOC-Container.

@Component에서 주석을 단 클래스입니다.Component of Spring여러 개의 콩이 들어 있는 콘셉트입니다.

Component class이 콩들을 등록하기 위해 스프링에 의해 자동 스캔될 필요가 있습니다.component class.

2. @Bean에 대해서
@Bean은 다음 메서드에 주석을 달기 위해 사용됩니다.component-class(상기와 같이).주석이 달린 메서드로 재시도된 인스턴스를 다음에 등록해야 함을 나타냅니다.Spring-IOC-Container.

3. 결론
그들 둘의 차이는 비교적 오비타스하다, 그들은 에 사용된다.different circumstances일반적인 사용법은 다음과 같습니다.

    // @Configuration is implemented by @Component
    @Configuration
    public ComponentClass {

      @Bean
      public FirstBean FirstBeanMethod() {
        return new FirstBean();
      }

      @Bean
      public SecondBean SecondBeanMethod() {
        return new SecondBean();
      }
    }

상기 답변의 추가 사항

예를 들어 여러 앱에서 공유되는 모듈이 있고 몇 가지 서비스가 포함되어 있다고 가정해 보겠습니다.각 앱에 모든 것이 필요한 것은 아닙니다.

이러한 서비스 클래스 및 응용 프로그램의 컴포넌트 스캔에서 @Component를 사용하는 경우,

우리는 결국 필요 이상으로 많은 콩을 검출하게 될 수도 있다

이 경우 컴포넌트 스캔의 필터링을 조정하거나 사용하지 않는 콩도 실행할 수 있는 구성을 제공해야 합니다.그렇지 않으면 응용 프로그램 컨텍스트가 시작되지 않습니다.

이 경우 @Bean 주석을 사용하여 이러한 콩만 인스턴스화하는 것이 좋습니다.

각 앱에 개별적으로 필요합니다.

따라서 기본적으로 컨텍스트에 서드파티 클래스를 추가하려면 @Bean을 사용합니다.또한 @Component가 단일 애플리케이션 내에 있는 경우.

스프링은 @Component, @Service, @Repository 등 여러 유형의 주석을 지원합니다.모든 내용은 org.springframework.streetype 패키지에 있습니다.

@Bean은 org.springframework.context.annotation 패키지에 있습니다.

응용 프로그램의 클래스에 상기 주석 중 하나가 주석을 달면 프로젝트 시작 시 스프링 스캔(@ComponentScan 사용) 동안 각 클래스가 주석을 달고 IOC 컨테이너에 클래스 인스턴스를 주입합니다.또한 @ComponentScan은 @Bean을 사용하여 메서드를 실행하여 반환 개체를 빈으로 IOC 컨테이너에 복원합니다.

@컴포넌트

클래스를 @Component 또는 다른 Styptype 주석 중 하나로 마크하면 클래스 경로 스캔을 사용하여 이러한 클래스가 자동으로 검출됩니다.이러한 클래스가 당사의 기본 패키지에 포함되어 있거나 Spring이 스캔할 다른 패키지를 인식하고 있는 한 이러한 클래스 각각에 대해 새로운 빈이 생성됩니다.

package com.beanvscomponent.controller;

import org.springframework.stereotype.Controller;

@Controller
public class HomeController {

    public String home(){
       return "Hello, World!";
   }

 }

주석이 달린 클래스와 콩(클래스당 콩 1개) 사이에는 암묵적인 일대일 매핑이 있습니다.이 접근법은 순전히 선언적인 것이기 때문에 배선의 제어는 상당히 제한적입니다.고정관념 주석은 클래스 수준의 주석이라는 점도 중요합니다.

@빈

@Bean은 단일 콩을 명시적으로 선언하기 위해 사용되며, @Controller에서처럼 스프링이 자동으로 선언하도록 하는 것이 아닙니다.클래스 정의에서 빈 선언을 분리하여 원하는 방식으로 빈을 만들고 구성할 수 있습니다.@Bean에서는 이 주석을 클래스 레벨에 배치하지 않습니다.이렇게 하면 잘못된 유형 오류가 발생합니다.@Bean 문서에서는 다음과 같이 정의하고 있습니다.

Indicates that a method produces a bean to be managed by the Spring container.

일반적으로 @Bean 메서드는 @Configuration 클래스 내에서 선언됩니다.인스턴스화 후 해당 인스턴스를 사용하여 빈을 작성하기 위해 필요한 사용자 클래스가 있습니다.콩이 어떻게 정의되는지를 조금 더 통제할 수 있다고 앞서 말씀드렸습니다.

package com.beanvscomponent;

public class User {

private String first;
private String last;

public User(String first, String last) {
    this.first = first;
    this.last = last;
   }
}

앞서 설명한 바와 같이 @Bean 메서드는 @Configuration 클래스 내에서 선언해야 합니다.

package com.beanvscomponent;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ApplicationConfig {

@Bean
public User superUser() {
    return new User("Partho","Bappy");
   }

}

이 방법의 이름은 실제로 우리 콩의 이름이 될 것입니다.액튜에이터에서 /beans 엔드포인트를 풀업하면 bean이 정의되어 있습니다.

{
"beans": "superUser",
"aliases": [],
"scope": "singleton",
"type": "com.beanvscomponent.User",
"resource": "class path resource 
    [com/beanvscomponent/ApplicationConfig.class]",
"dependencies": []
}

@컴포넌트와 @Bean

enter image description here

이것으로 @Component를 사용하는 시기와 @Bean을 사용하는 시점이 명확해졌으면 합니다.조금 혼란스러울 수 있지만, 여러분이 더 많은 지원서를 쓰기 시작하면 그것은 매우 자연스럽게 될 것입니다.

언급URL : https://stackoverflow.com/questions/10604298/spring-component-versus-bean

반응형