
- 지금까지 스프링 빈(Bean)을 등록할 때 구성파일에
@Bean을 사용했다
--> 관리할 빈이 많아지면 관리하기 번거로워 진다- 굳이 빈 설정파일을 만들지 않거나,
@Bean을 안쓰고 빈 등록을 할 수 있다
-->@Component과Component Scan를 사용하면!
- 설정파일이 없다면 의존관계는 어떻게 주입할까?
-->@Autowired를 사용해 자동 의존관계 주입을 한다
[ 정의 ]
:
@Component를 가진 모든 대상을 가져와서 빈에 등록하기 위해 찾는 과정
( 빈 설정파일 +@Bean을 통해 빈을 하나하나 지정할 필요가 없음)
[ 특징 ]
- 빈 이름 기본 전략 : 가장 앞 문자를 소문자로 바꾼 것이
빈 이름이 된다
ex)MemberServiceImpl-->memberServiceImpl- 빈 이름을 수동으로 지정 :
@Component("지정할 이름")
- 기본적인 컴포넌트 스캔 대상
@Component: 컴포넌트 스캔에서 사용@Controller: 스프링 MVC 컨트롤러에서 사용@Service: 스프링 비즈니스 로직에서 사용@Repository: 스프링 데이터 접근 계층에서 사용@Configuration: 스프링 설정 정보에서 사용
- 컴포넌트 스캔 범위
@ComponentScan어노테이션이 있는 파일의 패키지 아래를 찾는다.basePackages/basePackageClasses로 지정도 가능- 권장 방법 : 구성파일에 등록시 프로젝트 최상단에 두기
(SpringBoot 사용시라면@SpringBootApplication에 포함되어있어서 자동으로 최상단으로 유지된다)
[ 주의할 점 ]
DiscountPolicy라는 인터페이스를 상속받는RateDiscountpolicy와FixDiscountpolicy가 있을 때 둘 중 내가 사용할 것만 빈에 등록해야 하기 때문에 한 곳에만@Component를 붙여야함!
--> 아니면@Qulifier이나,@Primary를 사용해야 한다!
- 수동 빈 등록 vs 자동 빈 등록
: 자동으로 빈을 등록 한 상태에서 수동 등록 파일과 이름이 겹칠 경우에는
수동 빈 파일이 우선권을 가진다. 하지만, 최근 SpringBoot는 오류를 낸다!
[ 옵션 ]
- 특정 어노테이션을 포함 / 제외 시킬 수 있음
- includeFilters : 컴포넌트 스캔 대상으로 추가
- excludeFilters : 컴포넌트 스캔 대상에서 제외
- FilterType 옵션
ANNOTATION: 기본값, 어노테이션을 인식해 동작ASSIGNABLE_TYPE: 지정한 타입과 자식 타입을 인식해 동작ASPECTJ: AspectJ 패턴 사용REGEX: 정규 표현식CUSTOM: TypeFilter이라는 인터페이스를 구현해서 처리
[ 정리 ]
- 사실 어노테이션을 건드릴 일은 많지 않음 (존재하는 어노테이션이 충분해서)
- 가끔 특정 어노테이션을 제외하게 할 수 있음
- 기본 설정에 최대한 맞추어 사용하는 것이 관례
[ 정의 ]
의존관계 주입을 스프링 컨테이너에 등록된 빈(Bean)에서 찾아서 설정하는 방법
[ 설명 ]
- 스프링 빈 설정 파일이 없어진다면 해당 파일에서 해주던 의존관계 주입을 해주는 것이 필요함
-->@Autowired를 사용하면 된다.
- 의존성 주입이 필요한 파일의 생성자에서 어노테이션 사용
- 더욱 더 자세한 내용은 다음 글에서 계속!
[ 원리 ]
1) 스프링 컨테이너가
@Component를 찾아 모두 스프링 빈으로 등록!
2) 의존성이 필요한 부분에서@Autowired태그가 있다면 등록된 스프링 빈에서 찾아서 의존관계 주입 설정!