@Bean 을 통해 빈을 등록하는 방법도 있지만 등록해야 할 빈이 여러개라면 반복적인 작업을 해야 할 것이다. 그래서 스프링은 구성 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한다. 그리고 의존관계도 자동으로 주입하는 @Autowired라는 기능도 제공한다.
@Configuration @ComponentScan public class AutoAppConfig { /* 아무것도 없다*/ }
기존의 DI 컨테이너와는 다르게 @Bean으로 등록한 클래스가 하나도 없다.
컴포넌트 스캔은 이름처럼 @Component 어노테이션이 붙은 클래스를 스캔해서 스프링 빈으로 등록한다. 모든 클래스에 @Component 어노테이션을 붙인다.
@Bean으로 직접 설정 정보를 입력할 땐 의존관계도 직접 작성하였지만, 컴포넌트 스캔을 사용하면 이런 설정 정보가 없기 때문에 @Autowired를 통해 의존관계를 자동으로 주입해주어야 한다.
@ComponentScan
@ComponentScan은 @Component가 붙은 모든 클래스를 스프링 빈으로 등록한다. 이때 스프링 빈의 기본 이름은 클래스명에서 앞글자만 소문자로 변경한 것이다(ServiceImpl -> serviceImpl). 이름을 직접 지정하고 싶으면 @Component(이름) 으로 부여하면 된다.
의존관계 자동 주입
클래스의 생성자에 @Autowired를 지정하면 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아서 주입한다.
@ComponentScan{
basePackages = "hello.core",
}
의존관계 주입에는 크게 4가지 방법이 있지만 2가지만 사용한다.
@Component
public class Constructor {
private final Service num;
@Autowired
public Constructor(Service service){
this.num = service
}
}
@Component
public class Setter{
private final String a;
@Autowired
public void setA(String service){
this.a = service;
}
}
생성자 주입과 수정자 주입이 있지만 생성자 주입을 권장한다는데 그 이유는