Bean
Bean은 스프링 IOC 컨테이너가 관리하는 객체다.
빈을 등록하는 방법에는 2가지가 있다.
1. Component Scanning
2. XML 이나 자바 설정 파일에 직접 등록
Component Scanning
@SpringBootApplication안에는 @SpringBootConfiguration, @ComponetScan, @EnableAutoConfiguration이 있다.
여기서 @ComponetScan은 대부분 모든 클래스들과 모든 패키지에 @Component가 붙어있는 클래스들을 찾아서 Bean으로 등록을 해준다.
@Component
- @Repository
- @Service
- @Controller
주의할 점은 해당 최상위 패키지부터 스캔을 하기 때문에 다른 패키지를 스캔을 안한다.
직접 등록
@Bean
public String kimjye(){
return "kimjye";
}
@Bean을 붙인 Method를 정의한다. Method의 이름이 Bean의 이름이 된다.
단, @Bean은 @Configuration을 가지고있는 클래스안에서만 정의할 수 있다.
등록한 Bean을 어떻게 꺼내서 사용할까?
ApplicationContext에서 직접 꺼내서 쓰거나 @Autowired 또는 @Inject.
* Repository는 애노테이션이 없는데도 빈으로 등록되는 이유가 멀까?
Application Context에는 라이프사이클이라는 인터페이스가 있다. 이 인터페이스는 Application Context 작업 중간에 끼어들어서 다른 작업을 할 수 있다.
Spring Data JPA에서는 이 라이프 사이클을 이용하여 Spring Data JPA 타입의 클래스들을 빈으로 만들어주어서 Application Context에 빈으로 등록한다.
DI
DI는 Depedency Injection의 약자이다.
의존성 주입 방식은 크게 3가지다.
- 생성자
- 필드
- setter
생성자
@Autowired를 사용하지 않고도 어떤 빈에 생성자가 하나만 있고 그 생성자의 파라비터로 받는 빈이 존재할 때, 파라미터로 받는 빈을 주입해준다.
어떤 클래스에 반드시 필요한 객체라면 생성자를 통한 의존성 주입하는 것이 좋다.
// 생성자 주입 방식
Class OwnerController {
private OwnerRepository ownerRepository;
public OwnerController(OwnerRepository ownerRepository) {
this.ownerRepository = ownerRepository;
}
}
필드
Class OwnerController {
@Autowired
private OwnerRepository ownerRepository;
}
클래스가 Setter를 가지고 있다면 Setter에 붙이고 Setter가 없다면 필드에 @Autowired를 붙이는 것이 좋다.
'Spring' 카테고리의 다른 글
Spring Boot (0) | 2020.01.14 |
---|---|
AOP 와 PSA (0) | 2020.01.14 |
IOC (0) | 2020.01.14 |
@Setter (0) | 2019.04.18 |
토비의 스프링3.1 - 템플릿 메소드 패턴, 팩토리 메소드 패턴 (0) | 2019.03.03 |