스프링: @Component vs @Bean
는 그것을 한다.@Component
주석은 클래스 경로 스캔을 사용하여 xml bean 정의를 제거하기 위해 스프링 2.5에서 도입되었습니다.
@Bean
3.되어 봄 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
.
- @component는 클래스 패스스캔을 사용하여 콩을 자동으로 검출 및 설정하는 반면 @Bean은 스프링에 의해 자동으로 콩을 선언하지 않고 단일 콩을 명시적으로 선언합니다.
- @Component는 클래스 정의에서 빈 선언을 분리하지 않습니다.@Bean은 클래스 정의에서 빈 선언을 분리합니다.
- @Component는 클래스 수준의 주석인 반면 @Bean은 메서드 수준의 주석으로 메서드의 이름이 빈 이름으로 사용됩니다.
- @Component는 @Configuration 주석과 함께 사용할 필요가 없습니다.@Configuration에서는 @Bean 주석을 클래스 내에서 사용해야 합니다.
- 클래스가 스프링 컨테이너 외부에 있는 경우 @Component를 사용하여 클래스의 빈을 만들 수 없습니다.반면 클래스가 스프링 컨테이너 외부에 있는 경우에도 @Bean을 사용하여 클래스의 빈을 만들 수 있습니다.
- @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
이 할 때 할 수 있습니다.@Bean
IOC가 개최하다따라서 해야 할 는 '콩'을 해야 합니다.@Bean
로직을 작성하여 원하는 객체를 반환할 수 있습니다.또 하나 언급할 필요가 있는 것은, 다음의 방법을 사용하는 경우입니다.@Bean
콩을 먹다
Bean과 컴포넌트의 차이:
- @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
이것으로 @Component를 사용하는 시기와 @Bean을 사용하는 시점이 명확해졌으면 합니다.조금 혼란스러울 수 있지만, 여러분이 더 많은 지원서를 쓰기 시작하면 그것은 매우 자연스럽게 될 것입니다.
언급URL : https://stackoverflow.com/questions/10604298/spring-component-versus-bean
'sourcecode' 카테고리의 다른 글
새 탭에서 부트스트랩 모달 열기 (0) | 2022.07.27 |
---|---|
여러 테이블 행을 반환하는 Vue 구성 요소 (0) | 2022.07.27 |
Linux 커널:시스템 콜 후킹 예시 (0) | 2022.07.27 |
Nuxt SSR에서 여권 js 리다이렉트를 처리하려면 어떻게 해야 합니까? (0) | 2022.07.27 |
실제로 포인트 캐스트가 올바른 경우는 언제입니까? (0) | 2022.07.27 |