세계에서 봄 콩은 무엇입니까?


397

나는 아직 이해할 수있는 Spring Bean에 대한 높은 수준의 정의를 찾지 못했습니다. 필자는 Grails 문서와 책에서 자주 참조되는 것을 보았지만 그 내용을 이해하면 도움이 될 것이라고 생각합니다. 스프링 빈은 무엇입니까? 그들은 어떻게 사용될 수 있습니까? 의존성 주입과 관련이 있습니까?


2
Grails는 Spring을 기반으로합니다. Spring에 익숙하지 않다면 적어도 사용중인 기술을 이해할 수 있도록 최소한의 자료를 읽는 것이 좋습니다.
Jeff Storey 2016 년

26
여기서 의견은 OP가 Grails 문서 및 서적의 참고 문헌에서 보는 것과 동일한 문제로 고통 받고 있다고 생각합니다. Wikipedia의 기사에서 초보자에게 훨씬 더 잘 설명되어 있습니다.
Elias Dorneles 2014 년

12
@MarcoForberg Spring의 고대 버전이 Google에서 가장 인기있는 이유 중 하나는 사람들이 SO와 같은 곳에서 계속 연결하기 때문입니다 ... static.springsource.org/spring/docs/3.2.x/… 더 좋을 것입니다 요즘 시작하는 곳.
Ian Roberts

5
@IanRoberts +1 여기에 현재의 것이 있습니다.
dmahapatro 2016 년

IoC를 DI라고도함으로써 IoC를 소개하는 것은 도움이되지 않습니다. 그들은 그렇습니다, 그러나 IoC는 훨씬 더 넓습니다.
Aluan Haddad

답변:


212

애플리케이션의 백본을 형성하고 Spring IoC * 컨테이너로 관리되는 객체를 Bean이라고합니다. Bean은 Spring IoC 컨테이너에 의해 인스턴스화, 조립 및 관리되는 객체입니다. 이 Bean은 컨테이너에 제공하는 구성 메타 데이터 (예 : XML <bean/>정의 형식)로 작성 됩니다.

SpringSource 에서 bean과 scope에 대해 더 배우기 :

Bean 정의를 작성할 때 실제로 작성하는 것은 해당 Bean 정의에 의해 정의 된 클래스의 실제 인스턴스를 작성하기위한 레시피입니다. 빈 정의가 레시피라는 아이디어는 중요합니다. 이는 클래스와 마찬가지로 단일 레시피에서 많은 객체 인스턴스를 생성 할 수 있다는 것을 의미하기 때문입니다.

특정 Bean 정의에서 작성된 오브젝트에 연결될 다양한 종속성 및 구성 값뿐만 아니라 특정 Bean 정의에서 작성된 오브젝트의 범위도 제어 할 수 있습니다. 이 접근 방식은 매우 강력하며 Java 클래스 수준에서 객체의 범위를 '구울'필요없이 구성을 통해 생성 한 객체의 범위를 유연하게 선택할 수 있습니다. Bean은 여러 범위 중 하나에 배치되도록 정의 할 수 있습니다.

* IoC : 제어 역전


10
따라서 이들은 컨테이너가 관리하는 객체이며 만질 필요는 없지만 Bean에 액세스하여 메소드를 호출하거나 속성을 검색하려는 경우 Bean에 대해 Spring을 "요청"할 수 있습니까?
grantmcconnaughey 2014 년

22
@grantmc 제어 객체의 반전은 "질문"과 반대되는 것으로 이해되는 것을 제외하고는 일종의 그런 것입니다. "물음"을 요구하는 대신, 필요하다고 "선언"합니다. 그런 다음 앱을 시작할 때 프레임 워크가 모든 선언을 확인하고 적절한 인스턴스를 설정합니다.
Elias Dorneles 2014 년

6
@elias 내가 필요하다고 어떻게 선언합니까? 내가 사용할 때인가 @Autowired? 아니면 단순히 내가 할 때 import?
Mikhail Batcer

16
Spring 신규 이민자에게 IoC의 의미를 정의하는 것이 도움이 될 것입니다.
Lucas

4
@lucas 동의합니다. IoC는 "제어의 반전"입니다. 우수한 Q & A : Spring Framework에서 종속성 주입 및 제어 반전이란 무엇입니까? 제어의 반전은 무엇인가? .
mhradek

135

스프링 빈은 스프링 컨테이너에 의해 관리되는 인스턴스 객체 일뿐입니다. 즉, 프레임 워크에 의해 생성되고 연결되어 나중에 얻을 수있는 "오브젝트 백"(컨테이너)에 저장됩니다.

"배선"부분은 의존성 주입에 관한 것입니다. 즉, "이것이 필요할 것입니다"라고 말할 수 있으며 프레임 워크는 적절한 인스턴스를 얻기 위해 몇 가지 규칙을 따릅니다.

Spring에 익숙하지 않은 누군가를 위해 Wikipedia Spring의 기사에 좋은 설명이 있다고 생각합니다 .

Spring Framework의 핵심은 컨트롤 컨테이너의 반전으로, 리플렉션을 사용하여 Java 객체를 구성하고 관리하는 일관된 수단을 제공합니다. 컨테이너는 특정 객체의 객체 수명주기 관리를 담당합니다. 이러한 객체 생성, 초기화 방법 호출 및 이러한 객체를 함께 연결하여 구성.

컨테이너가 생성 한 객체를 관리 객체 또는 이라고도 합니다 . 컨테이너는 XML 파일을로드하거나 구성 클래스에서 특정 Java 주석을 감지하여 구성 할 수 있습니다. 이 데이터 소스에는 Bean을 작성하는 데 필요한 정보를 제공하는 Bean 정의가 포함되어 있습니다.

종속성 조회 또는 종속성 주입 을 통해 개체를 얻을 수 있습니다 . 종속성 조회 는 호출자가 컨테이너 객체에 특정 이름이나 특정 유형의 객체를 요청하는 패턴입니다. 의존성 주입 은 컨테이너가 생성자, 속성 또는 팩토리 메소드를 통해 컨테이너가 이름별로 다른 오브젝트를 전달하는 패턴입니다.


인스턴스는 객체에 대한 다른 단어 일뿐입니다. "객체 인스턴스"를 사용할 때 객체 객체를 말하는 것이 아닙니까?
udun의 불꽃

흥미로운 질문입니다. Wikipedia에 따르면 대신 "인스턴스 객체"라고 말해야합니다. en.wikipedia.org/wiki/Instance_(computer_science)
Elias Dorneles

2
토끼 구멍이 더 깊어집니다.
udun의 불꽃

나는 오늘 클래스가 객체 인 언어에 익숙하기 때문에 "객체 객체"(따라서 객체 인스턴스)가 실제로 의미가 있다는 것을 깨달았다. ). 어쨌든 Wikipedia 기사에 따라 "인스턴스 객체"를 사용하도록 설명을 업데이트했습니다. ^^
Elias Dorneles

1
@Ruizhi는 일반 객체, 즉 클래스의 인스턴스입니다.이 토론은 객체를 참조하기 위해 올바른 표현을 사용하는 것에 대한 반추였습니다. :)
Elias Dorneles

50

먼저 Spring을 이해하자.

Spring은 가볍고 유연한 프레임 워크입니다.

유추:
여기에 이미지 설명을 입력하십시오

Bean : 스프링 컨테이너에서 생성, 관리 및 파괴되는 객체입니다. 메타 데이터 (xml 또는 주석)를 통해 스프링 컨테이너에 객체를 주입 할 수 있는데,이를 제어 역전이라고합니다.

유추 : 농부가 씨앗 (또는 콩)으로 경작하는 농지를 가지고 있다고 가정 해 봅시다. 여기, 농부는 스프링 프레임 워크, 농지 토지는 스프링 컨테이너, 콩은 스프링 콩, 재배는 스프링 프로세서입니다.

여기에 이미지 설명을 입력하십시오

빈 수명주기와 마찬가지로 스프링 빈도 자체 수명주기를 갖습니다.

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

img 소스

다음은 Spring에서 Bean 라이프 사이클의 순서입니다.

  • 인스턴스화 : 먼저 스프링 컨테이너는 XML 파일에서 Bean의 정의를 찾고 Bean을 인스턴스화합니다.

  • 속성 채우기 : 의존성 주입을 사용하여 스프링은 Bean 정의에 지정된대로 모든 속성을 채 웁니다.

  • Bean 이름 설정 : Bean이 BeanNameAware인터페이스를 구현하는 경우 spring은 Bean의 id를 setBeanName()메소드에 전달합니다 .

  • Bean 팩토리 설정 : Bean이 BeanFactoryAware인터페이스를 구현 하면 스프링은 beanfactory를 setBeanFactory()메소드에 전달합니다 .

  • 사전 초기화 : Bean의 사후 프로세스라고도합니다. Bean과 연관된 Bean BeanPostProcessors가 있으면 Spring은 postProcesserBeforeInitialization()메소드를 호출 합니다.

  • Bean 초기화 : Bean이를 구현 IntializingBean하면 해당 afterPropertySet()메소드가 호출됩니다. Bean에 init 메소드 선언이 있으면 지정된 초기화 메소드가 호출됩니다.

  • 초기화 후 : – BeanPostProcessorsBean과 연관된 것이 있으면 해당 postProcessAfterInitialization()메소드가 호출됩니다.

  • 사용 준비 : 이제 Bean은 응용 프로그램에서 사용할 준비가되었습니다.

  • 파기 : Bean이 구현 DisposableBean하면 destroy()메소드 를 호출합니다.


23

글쎄, 당신은 그것을 부분적으로 이해했습니다. 필요에 따라 빈을 조정하고 의존성 주입 (DI) 이라고도 하는 Martin Fowler가 코인 한 IoC ( Inversion of Control ) 로 알려진 방법론을 사용하여 필요에 따라 빈을 관리하도록 Spring 컨테이너에 알려 주어야합니다 .

Bean을 어떤 방식으로 연결하여 Bean의 인스턴스화를 처리하거나 종속성을 평가할 필요가 없습니다. 이것은 할리우드 원칙 으로 널리 알려져 있습니다 .

Google은이 질문에 쇄도 할 수있는 링크 외에도 이에 대해 더 자세히 알아볼 수있는 최고의 도구입니다. :)


2
IoC가 개념이고 DI가 IoC를 달성하는 데 사용될 수있는 기술 중 하나임을 지적 할 수 없으며, 대체 가능한 정의가 아닙니다.
kekko12

9

봄에는 콩 주머니를 운반하는 IoC 용기가 있습니다. 생성 유지 및 삭제는 Spring Container의 책임입니다. 우리는 배선과 자동 배선을 통해 콩을 스프링에 넣을 수 있습니다. 배선은 XML 파일에 수동으로 구성하는 것을 의미하며 "자동 배선"은 주석을 Java 파일에 넣은 다음 Spring이 자동으로 루트 구성을 스캔하여 Java 구성 파일이있는 곳에서 루트 구성을 스캔하고 스프링 백에 넣는 것을 의미합니다.

다음은 Beans에 대한 자세한 정보를 제공하는 세부 URI입니다.


8

봄 콩은 수업입니다. 을 사용하여 클래스를 인스턴스화하는 대신 애플리케이션 컨텍스트에서 클래스를 캐스트로 new인스턴스로 가져옵니다. bean여기서 Bean은 애플리케이션 컨텍스트 구성에서 구성한 것입니다. 이런 식으로 전체 응용 프로그램은 응용 프로그램 전체에서 단일 범위 인스턴스를 유지 관리합니다. 모든 Bean은 애플리케이션 컨텍스트가 인스턴스화 된 직후 구성 순서에 따라 초기화됩니다. 애플리케이션에 Bean이없는 경우에도 애플리케이션 컨텍스트를 작성한 직후 모든 Bean 인스턴스가 작성됩니다.


1
빈은 클래스 가 아니라 클래스의 인스턴스로서의 객체로 컨테이너 구현에 의해 관리됩니다.
Chatatata

7
  • 스프링 빈은 스프링 IOC 컨테이너에 의해 관리되는 객체 인스턴스 일뿐입니다.

  • Spring IOC 컨테이너는 Bag of Bean을 가지고 있습니다 .Bean 생성, 유지 및 삭제는 Spring 컨테이너의 책임입니다.

  • 우리는 배선과 자동 배선을 통해 콩을 스프링에 넣을 수 있습니다.

  • 배선은 수동으로 XML 파일로 구성한다는 의미입니다.

  • 자동 배선은 주석을 Java 파일에 넣은 다음 Spring이 Java 구성 파일이있는 루트 컨텍스트를 자동으로 스캔하여 스프링 백에 넣는 것을 의미합니다.


7

Bean은 POJO (Plain Old Java Object)이며 스프링 컨테이너에서 관리합니다.

스프링 컨테이너는 기본적으로 하나의 Bean 인스턴스 만 작성합니다. 이 Bean은 메모리에 캐시되므로 Bean에 대한 모든 요청은 동일한 Bean에 대한 공유 참조를 리턴합니다.

@Bean 주석은 스프링이 애플리케이션 컨텍스트에서 Bean으로 등록하는 객체를 리턴합니다. 메소드 내부의 논리는 인스턴스 작성을 담당합니다.

@Bean 어노테이션은 언제 사용합니까?

자동 구성이 옵션이 아닌 경우 예를 들어, 소스 코드를 사용할 수 없어서 @Component로 클래스에 주석을 달 수 없기 때문에 써드 파티 라이브러리에서 컴포넌트를 연결하려고 할 때.

실시간 시나리오는 누군가가 Amazon S3 버킷에 연결하기를 원할 수 있습니다. 소스를 사용할 수 없으므로 @bean을 작성해야합니다.

@Bean
public AmazonS3 awsS3Client() {
    BasicAWSCredentials awsCreds = new BasicAWSCredentials(awsKeyId, accessKey);
    return AmazonS3ClientBuilder.standard().withRegion(Regions.fromName(region))
            .withCredentials(new AWSStaticCredentialsProvider(awsCreds)).build();
}

위의 코드 소스-> https://www.devglan.com/spring-mvc/aws-s3-java

위에서 @Component Annotation을 언급했기 때문에.

@Component 주석이 달린 클래스가 "컴포넌트"임을 나타냅니다. 이러한 클래스는 주석 기반 구성 및 클래스 경로 검색을 사용할 때 자동 감지의 후보로 간주됩니다.

컴포넌트 어노테이션은 클래스를 단일 Bean으로 등록합니다.


2

Spring에서는 애플리케이션의 백본을 형성하고 Spring IoC 컨테이너에 의해 관리되는 객체를 Bean이라고합니다. Bean은 단순히 Spring IoC 컨테이너에 의해 인스턴스화, 조립 및 관리되는 객체입니다.


1

Spring의 경우 모든 객체는 콩입니다! Spring Framework의 기본 단계는 객체를 Bean으로 정의하는 것입니다. 빈은 스프링 프레임 워크가 클래스 정의를보고 생성 할 객체 인스턴스 일뿐입니다. 이러한 정의는 기본적으로 구성 메타 데이터를 구성합니다. 그런 다음 프레임 워크는이 구성 메타 데이터를 기반으로 오브젝트를 인스턴스화하고, 종속성을 설정하고 주입해야하는 계획, 새로 작성된 인스턴스의 범위 등을 계획합니다.

메타 데이터는 첫 번째 장에서와 같이 간단한 XML 파일로 제공 될 수 있습니다. 또는 메타 데이터를 주석 또는 Java 구성으로 제공 할 수 있습니다.

책 : 저스트 스프링


1

Spring의 XML 구성은 Bean으로 구성되며 Bean은 기본적으로 클래스입니다. 그것들은 우리가 ApplicationContext 내에서 사용하는 POJO입니다. Beans 정의는 new 키워드를 대체하는 것으로 생각할 수 있습니다. 따라서 응용 프로그램에서 new 키워드를 사용하는 곳마다 다음과 같습니다.

MyRepository myRepository =new MyRepository ();

새로운 키워드를 사용하는 곳에서는 해당 구성을 제거하고 XML 파일에 배치하는 것을 볼 수 있습니다. 그래서 우리는 다음과 같이 코딩 할 것입니다 :

<bean name="myRepository " 
      class="com.demo.repository.MyRepository " />

이제 Setter Injection / Constructor Injection을 사용할 수 있습니다. Setter Injection을 사용하고 있습니다.

public class MyServiceImpl implements MyService {
    private MyRepository myRepository;
    public void setMyRepository(MyRepository myRepository)
        {
    this.myRepository = myRepository ;
        }
public List<Customer> findAll() {
        return myRepository.findAll();
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.