-
Bean
스프링 IoC 컨테이너가 관리하는 객체
OwnerController ownerController = new OwnerController();
=> 이건 빈이 아니다. 일반적인 객체이다.
OwnerController bean = applicationContext.getBean(OwnerController.class);
=> 이건 빈이다.
왜? 아래는 어플리케이션 컨텍스트(Ioc 컨테이너의 일종)이 관리하는 객체를 꺼내온 거니까.
위에는 직접 만들어준거고
빈들만 의존성 주입이 되는 것, 자동적으로
어떻게 특정한 인스턴스를 가지고 빈으로 만들어주느냐?
1. Component Scanning
@Controller 는 사실상 컴포넌트라는 메타 애노테이션을 사용하는 애노테이션이다. 그래서 이것도 사실상 컴포넌트 애노테이션이라고 볼 수 있다.
애노테이션 프로세서 중에 스프링 Ioc 컨테이너가 사용하는 (ioc 컨테이너를 만들고 그 안에 빈을 등록할 때 사용하는) 여러 가지 인터페이스들이 있는데 그런 인터페이스들을 라이프사이클 콜백이라고 부르는데, 그 라이프사이클 콜백 중에는 이런 컴포넌트라는 애노테이션을 찾아서 모든 클래스의 인스턴스를 만들어서 빈으로 등록하는 일을 하는 애노테이션 처리기가 등록되어 있다. (현재 우리는 예제로 스프링부트 프로젝트를 사용하고 있기 때문에 @SpringBootApplication 이 안에 컴포넌트 스캔이라는 애노테이션이 있는데, 이 컴포넌트 스캔 에노테이션은 어디부터 컴포넌트를 찾아보라고 알려주는 것)
@Component
-
@Repository
-
@Service
-
Controller
-
Configuration
이 외에 더 있음
위의 애노테이션들을 찾아서 빈으로 등록해주는게 컴포넌트 스캔의 기능
그래서 우리가 직접 빈으로 등록하지 않아도 스프링이 알아서 찾아서 Ioc컨테이너가 만들어질 때, 빈으로 등록해준다.
@Repository는 조금 특이한 형태로 빈으로 등록이 된다. 얘는 스프링 데이터 JPA가 제공해주는 기능에 의해서 빈으로 등록된다. 이 경우에는 특정한 애노테이션이 없더라도 특정한 인터페이스를 상속받은 경우에 이 인터페이스를 상속받고 있는 클래스를 찾아서 그 클래스의 사실상 인터페이스인 것의 구현체를 안에서 내부적으로 만든다. 만들고 빈으로 등록해준다.
2. 직접 빈으로 등록하는 방법
빈 설정파일이 뭐냐에 따라 그것을 설정해줘야 함
xml, 자바 설정파일이냐에 따라 달라짐, 최근은 자바 설정파일이 추세임
= >Java 설정파일 예제
SampleConfig.java
@Configuration
public class SampleConfig{
@Bean
public class SmapleConfig{
@Bean // 빈 직접 정의
public SampleController sampleController(){
return new SampleController();
// 이 메소드에서 리턴하는 객체 자체가 빈으로 등록이 된다. ioc 컨테이너 안에
// 그러므로 @Controller 라는 애노테이션을 떼도 무방하다.
}
}
}
꺼내서 쓰는 방법?
전에까지는 애플리케이션 컨텍스트에서 직접 꺼내서 쓰는 방법만을 봄
사실상 @AutoWired라는 애노테이션을 사용해서도 꺼내쓸 수 있다.
생성자를 통해 직접 주입하는 방법이 아니라 오토 와이어드의 애노테이션을 사용하면 ioc 컨테이너 안에 있는 빈을 주입받아 사용할 수 있다.
생성자를 통해서 Repository를 직접 주입받은 객체를 사용하는 것인데, 오토 와이어드는 Repository를 선언만 해도 자동으로 빈을 주입받을 수 있다.
애플리케이션 컨텍스트로 직접 꺼내는 방법보다는 스프링 ioc 컨테이너가 제공하는 디펜던시 인젝션 방법(디펜던시를 주입하는 방법 = @AutoWired)가 더 많을 것이다.
'Blog > Spring' 카테고리의 다른 글
스프링 프레임워크 입문 - AOP(Aspect Oriented Programming) (0) | 2020.04.19 |
---|---|
스프링 프레임워크 입문 - 의존성 주입(Dependency Injection) (0) | 2020.04.19 |
스프링 프레임워크 입문 - Inversion of Control (0) | 2020.04.19 |
스프링 프레임워크 입문 - 프로젝트 살펴보기 (0) | 2020.04.19 |
스프링 게시판 만들기 - 라이브러리 (0) | 2020.04.09 |