Bean

박찬미·2021년 3월 4일
0

Spring

목록 보기
5/6

Bean

스프링 IoC 컨테이너가 관리하는 객체


  • 객체(인스턴스 생성)
OwnerController ownerController = new OwnerController();

이것은 빈이 아니라, 일반적인 객체


OwnerController bean = applicationContext.getBean(OwnerController.class);

applicationContext(컨테이너의 일종)에서 빈 꺼내오기
즉, 의존성이 자동적으로 주입되어 이용하기만 한다.

그렇다면 어떻게 특정한 인스턴스를 가지고 빈으로 만들어줄까??


1. Component Scanning

전에 본 @Controller를 보면, 사실 얘는 Component라는 메타 애노테이션을 사용한다. 즉, 컴포넌트 애노테이션이라고도 볼 수 있다는 뜻!

  • LifeCycle Callback - 스프링 IoC 컨테이너가 빈을 등록할 때 사용하는 여러 인터페이스들을 의미(여기에는 애노테이션 처리기도 등록되어있다.)

  • 애노테이션 처리기 - 컴포넌트라는 애노테이션을 찾아 모든 클래스의 인스턴스를 만들어서 빈으로 등록하는 역할


  • 컴포넌트를 스캔하는 애노테이션
    - SpringBootApplication(스프링부트일때)

  • 컴포넌트 메타 애노테이션을 사용하는 애노테이션

    • @Component
    • @Repository
    • @Service
    • @Controller
    • @Configuration
    • ...

즉, 컴포넌트 스캔하는 애가 여러 애노테이션을 보고, 아! 얘를 빈으로 등록해야 하는군,,, 한다. 그 후, IoC 컨테이너가 그거에 맞게 알아서 빈으로 등록해준다.

@Repository는 조금 특이한 형태로 빈 등록이 되는데,,
얘는 스프링 데이터 JPA가 제공해주는 기능에 의해 빈으로 등록된다.
이 경우, 특정한 애노테이션이 없더라도 특정 인터페이스를 상속받은 경우에 상속받는 클래스를 찾아서 그 클래스의 인터페이스 구현체를 내부적으로 만들고 빈으로 등록해준다.



2. 빈 등록하는 방법

빈 설정파일이 무엇인가에 따라 설정해줘야 한다.
xml인지 java 설정파일인지 따라 다르다. 최근엔 자바가 추세~

  • Java 설정파일 예제
SampleConfig.java

@Configuration

public class SampleConfig{

    @Bean
    public class SmapleConfig{

        @Bean // 빈 직접 정의 
        public SampleController sampleController(){

            return new SampleController();

            // 이 메소드에서 리턴하는 객체 자체가 빈으로 등록이 된다. ioc 컨테이너 안에
            // 그러므로 @Controller 라는 애노테이션을 떼도 무방하다. 

        }
    }
}

주석에 설명



3. 빈을 꺼내서 쓰는 방법

전에는 applicationContext로 직접 꺼내 쓰는 방법만 봤다.

  • @AutoWired
    생성자를 통해 직접 주입하지 않고 @AutoWired를 이용해 IoC 컨테이너 안에 있는 빈을 자동으로 주입받아 사용할 수 있다.(선언만으로도 자동 주입)

applicatioContext로 직접 꺼내는 방법보다는 스프링 IoC 컨테이너가 제공하는 dependency injection 방식(@AutoWired)가 더 편하고 많다.

0개의 댓글