Spring
@Component란?
자바지기
2022. 11. 13. 17:32
반응형
@Component
Component scan은 스프링이 직접 클래스를 검색해서 빈으로 등록하는 기능이다.
클래스에 @Component를 붙이면 스캔의 대상이된다.
@Component가 제공해주는 기능
다음의 코드들을 통해 학습을 진행해보자.
@Component("zzz")
public class MemberDao implements Dao {
}
MemberDao 상단에 @Component("zzz") 를 작성했다.
AppCtx에는 @Component 가 붙은 클래스를 스캔하는 역할의 @ComponentScan을 붙여주었다.
@Configuration
@ComponentScan(basePackages = {"com.example.springtest.spring5_chapter5"})
public class AppCtx {
}
위처럼 설정을 진행하고 main 코드를 실행해보았다.
public class Main {
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(AppCtx.class);
MemberDao memberDao = ctx.getBean("zzz", MemberDao.class);
System.out.println(memberDao);
}
}
MemberDao memberDao = ctx.getBean("zzz", MemberDao.class); 가 정상적으로 실행됨으로 2가지를 확인할 수 있었다.
- @Component가 붙은 클래스는 @ComponentScan의 대상이 되고, 빈 등록이 된다.
- @Component 애노테이션에 값을 주면 그 값을 Bean의 이름으로 사용한다.
추가적으로 @Component 애노테이션에 값을 주지않으면 클래스 이름의 첫 글자를 소문자로 바꾼 이름을 Bean 이름으로 사용한다.
실제 코드에서 “zzz” 라는 이름으로 Bean 등록된 것을 확인해보았다.
@ComponentScan이란?
- @Component 애노테이션이 붙은 클래스를 스캔해서 스프링 Bean으로 등록한다.
- basePackages 는 스캔 대상 패키지 목록을 지정한다.
- 스캔에서 제외할 대상을 지정할 수 있다.
AppCtx를 다음처럼 변경해보았다.
@Configuration
@ComponentScan(basePackages = {"com.example.springtest.spring5_chapter5"},
excludeFilters = @Filter(type = FilterType.ASSIGNABLE_TYPE, classes = MemberDao.class))
public class AppCtx {
}
excludeFilters = @Filter(type = FilterType.ASSIGNABLE_TYPE, classes = MemberDao.class))를 추가하여 MemberDao를 scan하지 않도록 변경하였다.
다시 Main을 실행하였고, 결과로 다음과 같은 Exception이 발생하였다.
Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'zzz' available
스캔에서 제외하기전에는 조회가 되었던 zzz 이름의 Bean이 조회되지 않았다.
excludeFilters 를 추가했기때문에 이런 결과를 얻을 수 있었다.
반응형