스프링 IoC 컨테이너가 관리하는 객체
OwnerController ownerController = new OwnerController();
이것은 빈이 아니라, 일반적인 객체
OwnerController bean = applicationContext.getBean(OwnerController.class);
applicationContext(컨테이너의 일종)에서 빈 꺼내오기
즉, 의존성이 자동적으로 주입되어 이용하기만 한다.
그렇다면 어떻게 특정한 인스턴스를 가지고 빈으로 만들어줄까??
전에 본 @Controller를 보면, 사실 얘는 Component라는 메타 애노테이션을 사용한다. 즉, 컴포넌트 애노테이션이라고도 볼 수 있다는 뜻!
LifeCycle Callback - 스프링 IoC 컨테이너가 빈을 등록할 때 사용하는 여러 인터페이스들을 의미(여기에는 애노테이션 처리기도 등록되어있다.)
애노테이션 처리기 - 컴포넌트라는 애노테이션을 찾아 모든 클래스의 인스턴스를 만들어서 빈으로 등록하는 역할
컴포넌트를 스캔하는 애노테이션
- SpringBootApplication(스프링부트일때)
컴포넌트 메타 애노테이션을 사용하는 애노테이션
즉, 컴포넌트 스캔하는 애가 여러 애노테이션을 보고, 아! 얘를 빈으로 등록해야 하는군,,, 한다. 그 후, IoC 컨테이너가 그거에 맞게 알아서 빈으로 등록해준다.
@Repository는 조금 특이한 형태로 빈 등록이 되는데,,
얘는 스프링 데이터 JPA가 제공해주는 기능에 의해 빈으로 등록된다.
이 경우, 특정한 애노테이션이 없더라도 특정 인터페이스를 상속받은 경우에 상속받는 클래스를 찾아서 그 클래스의 인터페이스 구현체를 내부적으로 만들고 빈으로 등록해준다.
빈 설정파일이 무엇인가에 따라 설정해줘야 한다.
xml인지 java 설정파일인지 따라 다르다. 최근엔 자바가 추세~
SampleConfig.java
@Configuration
public class SampleConfig{
@Bean
public class SmapleConfig{
@Bean // 빈 직접 정의
public SampleController sampleController(){
return new SampleController();
// 이 메소드에서 리턴하는 객체 자체가 빈으로 등록이 된다. ioc 컨테이너 안에
// 그러므로 @Controller 라는 애노테이션을 떼도 무방하다.
}
}
}
주석에 설명
전에는 applicationContext로 직접 꺼내 쓰는 방법만 봤다.
applicatioContext로 직접 꺼내는 방법보다는 스프링 IoC 컨테이너가 제공하는 dependency injection 방식(@AutoWired)가 더 편하고 많다.