나는 아직 이해할 수있는 Spring Bean에 대한 높은 수준의 정의를 찾지 못했습니다. 필자는 Grails 문서와 책에서 자주 참조되는 것을 보았지만 그 내용을 이해하면 도움이 될 것이라고 생각합니다. 스프링 빈은 무엇입니까? 그들은 어떻게 사용될 수 있습니까? 의존성 주입과 관련이 있습니까?
나는 아직 이해할 수있는 Spring Bean에 대한 높은 수준의 정의를 찾지 못했습니다. 필자는 Grails 문서와 책에서 자주 참조되는 것을 보았지만 그 내용을 이해하면 도움이 될 것이라고 생각합니다. 스프링 빈은 무엇입니까? 그들은 어떻게 사용될 수 있습니까? 의존성 주입과 관련이 있습니까?
답변:
애플리케이션의 백본을 형성하고 Spring IoC * 컨테이너로 관리되는 객체를 Bean이라고합니다. Bean은 Spring IoC 컨테이너에 의해 인스턴스화, 조립 및 관리되는 객체입니다. 이 Bean은 컨테이너에 제공하는 구성 메타 데이터 (예 : XML
<bean/>
정의 형식)로 작성 됩니다.
SpringSource 에서 bean과 scope에 대해 더 배우기 :
Bean 정의를 작성할 때 실제로 작성하는 것은 해당 Bean 정의에 의해 정의 된 클래스의 실제 인스턴스를 작성하기위한 레시피입니다. 빈 정의가 레시피라는 아이디어는 중요합니다. 이는 클래스와 마찬가지로 단일 레시피에서 많은 객체 인스턴스를 생성 할 수 있다는 것을 의미하기 때문입니다.
특정 Bean 정의에서 작성된 오브젝트에 연결될 다양한 종속성 및 구성 값뿐만 아니라 특정 Bean 정의에서 작성된 오브젝트의 범위도 제어 할 수 있습니다. 이 접근 방식은 매우 강력하며 Java 클래스 수준에서 객체의 범위를 '구울'필요없이 구성을 통해 생성 한 객체의 범위를 유연하게 선택할 수 있습니다. Bean은 여러 범위 중 하나에 배치되도록 정의 할 수 있습니다.
* IoC : 제어 역전
@Autowired
? 아니면 단순히 내가 할 때 import
?
스프링 빈은 스프링 컨테이너에 의해 관리되는 인스턴스 객체 일뿐입니다. 즉, 프레임 워크에 의해 생성되고 연결되어 나중에 얻을 수있는 "오브젝트 백"(컨테이너)에 저장됩니다.
"배선"부분은 의존성 주입에 관한 것입니다. 즉, "이것이 필요할 것입니다"라고 말할 수 있으며 프레임 워크는 적절한 인스턴스를 얻기 위해 몇 가지 규칙을 따릅니다.
Spring에 익숙하지 않은 누군가를 위해 Wikipedia Spring의 기사에 좋은 설명이 있다고 생각합니다 .
Spring Framework의 핵심은 컨트롤 컨테이너의 반전으로, 리플렉션을 사용하여 Java 객체를 구성하고 관리하는 일관된 수단을 제공합니다. 컨테이너는 특정 객체의 객체 수명주기 관리를 담당합니다. 이러한 객체 생성, 초기화 방법 호출 및 이러한 객체를 함께 연결하여 구성.
컨테이너가 생성 한 객체를 관리 객체 또는 빈 이라고도 합니다 . 컨테이너는 XML 파일을로드하거나 구성 클래스에서 특정 Java 주석을 감지하여 구성 할 수 있습니다. 이 데이터 소스에는 Bean을 작성하는 데 필요한 정보를 제공하는 Bean 정의가 포함되어 있습니다.
종속성 조회 또는 종속성 주입 을 통해 개체를 얻을 수 있습니다 . 종속성 조회 는 호출자가 컨테이너 객체에 특정 이름이나 특정 유형의 객체를 요청하는 패턴입니다. 의존성 주입 은 컨테이너가 생성자, 속성 또는 팩토리 메소드를 통해 컨테이너가 이름별로 다른 오브젝트를 전달하는 패턴입니다.
먼저 Spring을 이해하자.
Spring은 가볍고 유연한 프레임 워크입니다.
Bean : 스프링 컨테이너에서 생성, 관리 및 파괴되는 객체입니다. 메타 데이터 (xml 또는 주석)를 통해 스프링 컨테이너에 객체를 주입 할 수 있는데,이를 제어 역전이라고합니다.
유추 : 농부가 씨앗 (또는 콩)으로 경작하는 농지를 가지고 있다고 가정 해 봅시다. 여기, 농부는 스프링 프레임 워크, 농지 토지는 스프링 컨테이너, 콩은 스프링 콩, 재배는 스프링 프로세서입니다.
빈 수명주기와 마찬가지로 스프링 빈도 자체 수명주기를 갖습니다.
다음은 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 메소드 선언이 있으면 지정된 초기화 메소드가 호출됩니다.
초기화 후 : – BeanPostProcessors
Bean과 연관된 것이 있으면 해당 postProcessAfterInitialization()
메소드가 호출됩니다.
사용 준비 : 이제 Bean은 응용 프로그램에서 사용할 준비가되었습니다.
파기 : Bean이 구현 DisposableBean
하면 destroy()
메소드 를 호출합니다.
글쎄, 당신은 그것을 부분적으로 이해했습니다. 필요에 따라 빈을 조정하고 의존성 주입 (DI) 이라고도 하는 Martin Fowler가 코인 한 IoC ( Inversion of Control ) 로 알려진 방법론을 사용하여 필요에 따라 빈을 관리하도록 Spring 컨테이너에 알려 주어야합니다 .
Bean을 어떤 방식으로 연결하여 Bean의 인스턴스화를 처리하거나 종속성을 평가할 필요가 없습니다. 이것은 할리우드 원칙 으로 널리 알려져 있습니다 .
Google은이 질문에 쇄도 할 수있는 링크 외에도 이에 대해 더 자세히 알아볼 수있는 최고의 도구입니다. :)
봄에는 콩 주머니를 운반하는 IoC 용기가 있습니다. 생성 유지 및 삭제는 Spring Container의 책임입니다. 우리는 배선과 자동 배선을 통해 콩을 스프링에 넣을 수 있습니다. 배선은 XML 파일에 수동으로 구성하는 것을 의미하며 "자동 배선"은 주석을 Java 파일에 넣은 다음 Spring이 자동으로 루트 구성을 스캔하여 Java 구성 파일이있는 곳에서 루트 구성을 스캔하고 스프링 백에 넣는 것을 의미합니다.
봄 콩은 수업입니다. 을 사용하여 클래스를 인스턴스화하는 대신 애플리케이션 컨텍스트에서 클래스를 캐스트로 new
인스턴스로 가져옵니다. bean
여기서 Bean은 애플리케이션 컨텍스트 구성에서 구성한 것입니다. 이런 식으로 전체 응용 프로그램은 응용 프로그램 전체에서 단일 범위 인스턴스를 유지 관리합니다. 모든 Bean은 애플리케이션 컨텍스트가 인스턴스화 된 직후 구성 순서에 따라 초기화됩니다. 애플리케이션에 Bean이없는 경우에도 애플리케이션 컨텍스트를 작성한 직후 모든 Bean 인스턴스가 작성됩니다.
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으로 등록합니다.
Spring에서는 애플리케이션의 백본을 형성하고 Spring IoC 컨테이너에 의해 관리되는 객체를 Bean이라고합니다. Bean은 단순히 Spring IoC 컨테이너에 의해 인스턴스화, 조립 및 관리되는 객체입니다.
Spring의 경우 모든 객체는 콩입니다! Spring Framework의 기본 단계는 객체를 Bean으로 정의하는 것입니다. 빈은 스프링 프레임 워크가 클래스 정의를보고 생성 할 객체 인스턴스 일뿐입니다. 이러한 정의는 기본적으로 구성 메타 데이터를 구성합니다. 그런 다음 프레임 워크는이 구성 메타 데이터를 기반으로 오브젝트를 인스턴스화하고, 종속성을 설정하고 주입해야하는 계획, 새로 작성된 인스턴스의 범위 등을 계획합니다.
메타 데이터는 첫 번째 장에서와 같이 간단한 XML 파일로 제공 될 수 있습니다. 또는 메타 데이터를 주석 또는 Java 구성으로 제공 할 수 있습니다.
책 : 저스트 스프링
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();
}
}