일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- CI/CD
- BFS
- 컴퓨터 네트워크
- 알고리즘
- 그리드
- 스프링
- Spring
- 자바
- 분할정복
- 다이나믹프로그래밍
- 순열
- dfs
- 재귀
- 백준
- 브루트포스
- TCP
- github action
- 이분탐색
- 그래프
- SQL
- 트리
- 다이나믹 프로그래밍
- 분할 정복
- 도커
- 그리드 알고리즘
- GIT
- AWS
- 역방향 반복자
- 자료구조
- HTTP
- Today
- Total
코딩성장스토리
스프링 컨포넌트스캔 본문
스프링에 전에 배운 스프링 빈을 사용할 때 모든 클래스에 빈을 등록해야한다.
즉 빈을 반복적으로 추가하는 것은 비효율적이다.
그로므로 존재하는게 컨포넌트스캔(Conponentscan)이다.
@Conponentscan을 쓸려면 빈에 입력이될 객체 위해 @Component를 적어야한다.
주의점(Configuration이 들어간 모든 것을 빈에 넣기 때문에 주의해서 뺼건 빼줘야한다,
또한, 스프링빈에 입력이 될떄 클래스명 앞글자가 소문자로 변한다 ex)Member -> member)
밑에 코드를 보자
@Configuration
@ComponentScan(
excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION,classes=Configuration.class)//appconfig와 충돌 안시키게 뺴주기
)
public class AutoAppConfig {
}
@Component
public class RateDiscountPolicy implements DiscountPolicy{
@Component
public class MemoryMemberRepository implements MemberRepository{
@Component
public class MemberServiceImpl implements MemberService {
여기서 조심해야할 것은 의존성 주입이 된 클래스를 빈으로 어떻게 넣는 것이다.
빈에 넣을때는 주입이될 객체가 명시되어 있지만 @Component안에서 명시가 안되어 있다.
이럴때 필요한게 @Autowired 이고 의존성 주입이 될 위에 적으면 자동주입이 된다.
코드를 보자
@Component
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberServiceImpl(MemberRepository memberRepository){
this.memberRepository= memberRepository;
}
@Override
public void join(Member member) {
memberRepository.save(member);
}
@Override
public Member findMember(Long memberId) {
return memberRepository.findById(memberId);
}
}
컴포넌트 스캔의 용도 뿐만 아니라 다음 애노테이션이 있으면 스프링은 부가 기능을 수행한다.
@Controller : 스프링 MVC 컨트롤러로 인식
@Repository : 스프링 데이터 접근 계층으로 인식하고, 데이터 계층의 예외를 스프링 예외로 변환해준다.
@Configuration : 앞서 보았듯이 스프링 설정 정보로 인식하고, 스프링 빈이 싱글톤을 유지하도록 추가
처리를 한다.
@Service : 사실 @Service 는 특별한 처리를 하지 않는다. 대신 개발자들이 핵심 비즈니스 로직이 여기에
있겠구나 라고 비즈니스 계층을 인식하는데 도움이 된다.
필터
includeFilters : 컴포넌트 스캔 대상을 추가로 지정한다.
excludeFilters : 컴포넌트 스캔에서 제외할 대상을 지정한다.
@ComponentScan(
includeFilters = @Filter(type = FilterType.ANNOTATION, classes =
MyIncludeComponent.class),
excludeFilters = @Filter(type = FilterType.ANNOTATION, classes =
MyExcludeComponent.class)
)
'백 엔드 > spring' 카테고리의 다른 글
스프링 빈 스코프 (0) | 2022.02.20 |
---|---|
스프링 의존관계 자동 주입 (0) | 2022.02.17 |
스프링 싱글톤 (0) | 2022.02.15 |
스프링 IOC,DI,컨테이너 (0) | 2022.02.14 |
spring 도전기 (1) | 2021.12.08 |