- 지금까지 스프링 빈을 등록할 때 구성파일에
@Bean
을 사용했는데, 이는 관리할 빈이 많아지면 관리하가기 힘들어 진다. @Component
와Component Scan
을 이용하면@Bean
을 안쓰고 빈 등록이 가능하고, 빈 설정파일을 만들지 않아도 된다.- 빈 설정 파일이 없는데 의존관계를 주입하는 방법?
→@Autowired
를 사용해 자동 의존관계 주입을 한다.
컴포넌트 스캔
@Component
를 가진 모든 대상을 가져와서 빈에 등록하기 위해 찾는 과정
→ 빈 설정파일 +@Bean
을 통해 빈을 하나하나 지정할 필요가 없음@Component
애노테이션이 붙은 클래스를 스캔해서 자동 스프링 빈으로 등록해준다.
@Component
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository; }
}
MemverServiceImpl
클래스에@Component
를 추가해서 자바 빈에 등록- 생성자에
@Autowired
를 지정해서 생성자를 주입(스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아서 주입해줌)
컴포넌트 스캔의 특징
Bean
이름의 기본 설정 : 가장 앞 문자를 소문자로 한 것이 Bean이름 이 된다.
ex)OrderServiceImpl
→orderServiceImpl
- Bean이름을 수동으로 설정 하는 방법 :
@Component(”지정할 이름”)
컴포넌트 스캔 대상
@Component
: 컴포넌트 스캔에서 사용@Controller
: 스프링 MVC 컨트롤러에서 사용, 스프링 MVC 컨트롤러로 인식@Service
: 스프링 비즈니스 로직에서 사용@Repository
: 스프링 데이터 접근 계층에서 사용, 데이터 계층의 예외를 스프링 예외로 등록해줌@Configuration
: 스프링 설정 정보에서 사용, 스프링 빈이 싱글톤을 유지하도록 추가 처리해줌
컴포넌트 스캔 범위
@ComponentScan
: 어노테이션이 있는 파일의 패키지 아래를 스캔한다.basePackages
/basePackageClasses
로 지정도 가능- 권장 방법 : 구성파일에 등록시 프로젝트 최상단에 두는것을 권장함
→ SpringBoot는 @SpringBootApplication
에 포함되어 있어서 자동으로 최상단으로 유지된다.
필터 : 컴포넌트 스캔대상 추가 or 제외
includeFilters
: 컴포넌트 스캔 대상을 추가로 지정한다.excludeFilters
: 컴포넌트 스캔에서 제외할 대상을 지정
package hello.core.scan.filter;
@MyIncludeComponent
public class BeanA { }
- BeanA :
@MyIncludeComponent
적용
package hello.core.scan.filter;
@MyExcludeComponent
public class BeanB { }
- BeanB :
@MyExcludeComponent
적용
includeFilters
에는MyIncludeComponent.class
가 등록되어 컴포넌트 스캔에 추가된다.excludeFilters
에는MyExcludeComponent.class
가 등록되어 컴포넌트 스캔에서 제외 된다.
FilterType 옵션
- ANNOTATION : 기본값, 어노테이션을 인식해서 동작
- ASSIGNABLE_TYPE : 지정한 타입과 자식 타입을 인식해서 동장
- ASPECTJ : AspectJ패턴 사용
- REGEX : 정규표현식
- CUSTOM :
TypeFilter
라는 인터페이스를 구현해서 처리
반응형