자바코드의 @Bean
이나 XML의 <bean>
을 통해서 의존관계를 주입할때 객체가 수십, 수백개라면? -> 일일이 Bean등록 하기 귀찮고 시간이 걸림. 실수로 Bean 등록을 안할 수도 있음.
이때 @ComponentScan이 있다. @Bean이 빌요없고, @Component를 상속받고 있기때문에 @Configuration을 붙인 클래스도 자동적으로 등록해준다.
(excludeFilter ="java.package")
=> 스캔의 대상 제외.
@Component를 붙이면 의존관계를 어떻게 주입할것인가?
@ComponentScan은 @Component가 붙은 모든 클래스를 빈으로 등록한다.
'빈이름 기본전략' => 클래스의 이름명을 첫글자만 소문자로해서 등록시켜준다. 빈 이름을 바꾸고싶다면 따로 이름을 적어주면 된다.
@Bean(name ="바꾸고 싶은 이름")
@Autowired를 지정하면 스프링컨테이너가 자동으로 해당 스프링 빈을 찾아서 주입한다. 기본 전략은 타입이 같은 빈을 조회해서 주입해준다. ex)getBean(MemeberRepository.class)
@ComponentScan의 탐색할 패키지의 시작위치 지정도 가능. 모든 자바클래스를 다 컴포넌트 스캔하면 시간이 오래걸림. basePackage를 사용하면 된다. 지정된 패키지의 하위패키지를 다 뒤진다.
=> 요즘에는 basePackage를 사용하지 않아도 된다. @ComponentScan이 붙은 설정 정보 클래스가 시작위치가 된다 스프링부트도 이 방법을 기본으로 제공한다.
@SpringBootApplication => 스프링 부트를 쓰면 ComponentScan도 쓸 필요가 없다. 저 스프링부트 어플리케이션이 컴포넌트 스캔을 대상으로 받고있기때문에. 알아서 다 해줌.
@Controller @Service @Repository @Configuration => 역할에 따라 이름을 붙인 Component라고 보면 된다. 각자 명칭에따라 조금더 도움이 되는 부가 기능이 지원되긴 한다.
참고!! -> 애노테이션에는 상속관계라는것이 없다. 애노테이션이 특정 애노테이션을 들고 있는것을 인식 할 수 있는것은 자바가 지원하는것이 아니라 스프링이 지원하는 기능.
Filter => Excludefilter 와 Include 필터.
FilterType => Annotation (기본) , 1 Assignable type - 지정한 타입과 자식타입만 인식. 2 ASPECTJ -Asepctj 패턴 사용. REGEX -정규 표현식, CUSTOM - >TypeFilter라는 인터페이스 구현.
** 스프링의 가장 큰 기본 명제. 항상 자동보다는 수동, 큰 개념보다는 명확한 개념을 우선순위로 둔다!!
참고 : 본 글은 김영한님의 스프링 강의를 정리한 것이다.