지금까지는스프링 Bean을 등록할때 @Bean으로 직접 등록해주었다
하지만 이게 10개가 아닌 100000개라면?
개발자라면 반복은 피하자!
그래서 스프링이 설정정보를 직접 안적어도 스프링 빈으로 등록을 해주는 Component Scan기능을 제공한다
의존관계 주입은 Autowired로!!
@Configuration
public Class AppConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
이렇게 AppConfig라는 클래스 안에 수동으로 스프링 빈 등록과 함께
의존관계도 주입해주었다!!
@Configuration
@ComponentScan(
excludeFilters = @ComponentScan.Filter(type= FilterType.ANNOTATION, classes = Configuration.class)
)
public class AutoAppConfig {}
이러면 AutoAppConfig에서 작성할 부분은 끝났다!
위에 보이는 @ComponentScan이 @Component 붙은 클래스 찾아서 전부 빈으로 등록!
이러면 이 클래스는 memberServiceImpl라는 이름으로 스프링 빈 등록이 되고
객체는 MemberServiceImpl을 가지게 된다!
의존성 주입이 필요한 객체에 대해서 생성자 위에 @Autowired를 작성하면
스프링이 자동으로 빈 객체들을 뒤져서 의존성을 주입해준다!!
차고로 @ComponentScan을 사용하면 따로 설정에서 코드를 안적으니까
의존주입도 수동으로 못함! -> Autowired 반강제
@ComponentScan (
basePackages = {"hello.core.member","hello.core.order"}
basePackageClasses = AutoAppConfig.class // 이러면 내 위치부터 찾음!
)
만약에 위치를 지정 안하게 된다면 모든 경로를 다 뒤질 수도 있다!!
com.hello
com.hello.service
com.hello.repository 가 있다고 할때 com.hello에 AppConfig를 둠!
그러면 따로 저런거 안적어도 여기부터 아래로 차례로 자동으로 뒤진다!
프로젝트 시작 루트 위치에 두자!
@Component 뿐 아니라
@Controller - spring mvc컨트롤러로 인식
@Service, - 데이터 접근 계층으로 인식
@Repository, - 특별 처리는 없지만 개발자들끼리 비지니스 로직 계층 파트라고 인지
@Configuration
다 @Component를 가지고 있다!
자동 빈 등록 vs 자동 빈 등록 ->spring이 오류를 발생!
수동 빈 등록 vs 자동 빈 등록
Overriding bean Definition -> 걍 수동이 우선권을 가짐!, 수동빈이 자동빈으로 오버라이딩!
이거 버그 잡기 엄청어려움!! -> 그래서 스프링부트가 두 개 부딪히면 에러나게 바뀜!!
!!!!어노테이션에는 상속관계가 없다!!!!
붙였다고 연동되는 것이 아니라 -> 자바가 인식하는게 아닌 스프링이 지원하는 기능!!