지금까지 스프링빈을 등록할때는 @Bean
을 이용해 설정 정보에 직접 등록하였다.
여러개의 빈을 등록하기 귀찮기 때문에 스프링은 자동으로 등록해주는 컴포넌트 스캔이라는 기능을 제공한다.
@Autowired
자동으로 의존관계가 주입되는 기능도 있다.
새로운 AppConfig파일을 만들어준다.
@Configuration
@ComponentScan(
basePackages = "hello.core",
excludeFilters = @ComponentScan.Filter(
type= FilterType.ANNOTATION,
classes = Configuration.class
)
)
public class AutoAppConfig {}
(내용이 없어도 상관없다.)
컴포넌트 스캔을 사용하기 위해서 @ComponentScan
을 설정 정보 앞에 붙여주면 된다.
그럼 컴포넌트 스캔은 @Component
애노테이션이 붙은 클래스를 스캔해서 스프링 빈으로 등록해준다.
@Controller
, @Service
, @Repository
들도 코드를 열어보면 @Component
가 포함된다.ComponentScan을 사용하면 @Configuration 이 붙은 설정 정보도 자동으로 등록이 된다.
우리는 앞서 AppConfig파일을 만들었었기 때문에 이러한 정보들을 제외하기 위해서 excludeFilters로 제외시켰다.
@ComponentScan
은 @Component
가 붙은 모든 클래스를 스프링 빈으로 등록한다.
의존 관계 자동 주입
생성자에 @Autowired
를 지정하면, 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아서 주입한다.
생성자에 파라미터가 여러개 존재해도 자동으로 찾아서 주입한다.
@ComponentScan(
basePackages = "hello.core",
)
탐색할 위치를 지정할 수 있다. {"hello.core", "hello.service"} 형태로 여러개로도 지정할 수 있지만,
굳이 패키지 위치를 지정하기 않고 최상단에 두는 것이 일반적이다.
=> 하위는 모두 자동으로 컴포넌트 스캔의 대상이 되기 때문이다.
스프링 부트를 사용하면 @SpringBootApplication
가 생성되는데 이 설정안에 @ComponentScan
가 들어있다.
@Component : 컴포넌트 스캔에서 사용
@Controlller : 스프링 MVC 컨트롤러에서 사용
@Service : 스프링 비즈니스 로직에서 사용
- 사실 @Service는 특별한 처리는 없지만, 관례적으로 사용된다.
@Repository : 스프링 데이터 접근 계층에서 사용
@Configuration : 스프링 설정 정보에서 사용
컴포넌트 스캔 대상을 추가로 지정한다.
컴포넌트 스캔 대상에서 제외할 대상을 지정한다.
위의 내용을 실험하기 위해서 애노테이션을 만들어준다.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyExcludeComponent {
}
@Configuration
@ComponentScan(
includeFilters = @ComponentScan.Filter(
type = FilterType.ANNOTATION,
classes = MyIncludeComponent.class
),
excludeFilters = @ComponentScan.Filter(classes = MyExcludeComponent.class)
)
static class ComponentFilterAppConfig {}
includeFilters
를 이용해서 MyIncludeComponent
를 등록하고
excludeFilters
를 이용해 MyExcludeComponent
를 스프링 빈에 등록되지 않는다.
@Component 를 이용하면 includeFilters는 사용하는 일이 거의 없다.
excludeFilters 도 자주 사용되지는 않는다