티스토리 뷰
Component Scan은 @Component 가 붙은 모든 클래스를 스프링 빈으로 등록해준다.
스프링 빈의 기본 이름은 클래스명을 사용하되 맨 앞글자만 소문자로 사용한다.
* 빈 이름을 @Component("myComponent") 이런식으로 직접 지정할수가 있다.
내 프로젝트 구조는 다음과 같다.
- com.my
- com.my.service
- com.my.repository
컴포넌트 스캔 사용하기
1. 빈으로 등록할 클래스 설정
MemberServiceImpl 파일은 com.my.service 패키지에 위치한다.
@Component
public class MemberServiceImpl implements MemberService {
}
2. 컴포넌트 스캔 클래스 설정
AppConfig 파일은 com.my 패키지에 위치한다.
@Configuration
@ComponentScan(
excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)
public class AppConfig {
}
3. MemberServiceImpl이 빈으로 등록되었는지 확인
@Test
void scan() {
ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class);
MemberService memberService = ac.getBean(MemberService.class);
assertThat(memberService).isInstanceOf(MemberService.class);
}
//log
00:04:18.985 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'memberServiceImpl'
그럼 수동으로 컴포넌트 스캔을 구성하지 않을 때 스프링부트는 어떻게 내가 만든 클래스를 빈으로 등록해주는 걸까?
스프링 부트 프로젝트를 생성할 때 프로젝트 최상단에 아래와 같이 파일이 생성된 걸 볼 수 있다.
* 프로젝트명에 따라 클래스명 접두사가 달라질 수 있다. 내 프로젝트 명은 my로 설정하였기 때문에 MyApplication.java 이다.
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
해당 클래스에 @SpringBootApplication 이 설정되어 있다.
@SpringBootApplication 파일을 열어보게 되면 아래와 같이 설정되어 있음을 확인할 수 있다.
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
}
@ComponetScan 이 설정되어 있으며, 이는 @Component 가 설정되어 있는 클래스를 찾아 전부 빈으로 등록해준다.
* MyApplication은 프로젝트의 최상단에 위치한다. 따라서 해당 위치로부터 시작되는 하위 클래스를 전부 탐색한다.
컴포넌트 스캔 기본 대상
- @Component : 컴포넌트 스캔에서 사용
- @Controller : 스프링 MVC 컨트롤러에서 사용
- @Service : 스프링 비즈니스 로직에서 사용
- @Repository : 스프링 데이터 접근 계층에서 사용
- @Configuration : 스프링 설정 정보에서 사용
//controller 어노테이션
@Component
public @interface Controller {
}
//sevice 어노테이션
@Component
public @interface Service {
}
//repository 어노테이션
@Component
public @interface Repository {
}
//configuration 어노테이션
@Component
public @interface Configuration {
}
참고
'Framework > Spring' 카테고리의 다른 글
[Spring] HTTP 통신 도구 (0) | 2022.10.19 |
---|---|
[Spring] 데이터 유효성 검증 (0) | 2022.10.04 |
[Spring] Singleton Container (0) | 2022.08.22 |
[Spring] Container (0) | 2022.08.17 |
[JPA] 영속성 (0) | 2022.08.09 |
- Total
- Today
- Yesterday
- 인스턴스변수
- fail-fast
- 정적변수
- spring boot
- 추상클래스
- 자동구성
- 다중화
- Load Balancer
- 인터페이스
- Hash
- Spring
- HashSet
- 로드 밸런서
- object
- 티스토리챌린지
- nosql
- JPA
- nginx
- Security
- HashMap
- 고정 세션
- @conditional
- Sticky Session
- Red-Black Tree
- AutoConfiguration
- Caching
- fail-safe
- syncronized
- 오블완
- java
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |