AppConfig
) 자동으로 스프링 빈을 등록하는 기능@ComponentScan
@Component
가 붙은 모든 클래스를 자동으로 스캔하여 스프링 빈으로 등록@Configuration
@ComponentScan
public class AutoAppConfig {
}
@Component
추가@Component
public class MemoryMemberRepository implements MemberRepository {}
@Component
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository;
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
AppConfig
를 통해 의존관계를 직접 명시했다.@Autowired
: 의존관계를 자동으로 주입해준다. (자세한 내용은 다음 글 참고)1. @ComponentScan
@ComponentScan
은 @Component
가 붙은 모든 클래스를 스프링 빈으로 등록한다.2. @Autowired
의존관계 자동 주입
@Autowired
를 지정하면, 스프링 컨테이너가 자동으로 해당 빈을 찾아서 주입한다.getBean(MemberRepository.class)
와 비슷하다.@ComponentScan
이 붙은 설정 정보 클래스의 패키지가 시작 위치@ComponentScan(
basePackages = "hello.core",
}
basePackages
: 스캔할 패키지의 시작 위치 지정, "hello.core"패키지부터 하위 패키지 모두 스캔basePackagesClasses
: 지정한 클래스의 패키지를 스캔 시작 위치로 지정@Component
: 컴포넌트 스캔에서 사용@Controller
: 스프링 MVC 컨트롤러에서 사용@Service
: 스프링 비즈니스 로직에서 사용@Repository
: 스프링 데이터 접근 계층에서 사용@Configuration
: 스프링 설정 정보에서 사용includeFilters
: 컴포넌트 스캔 대상을 추가로 지정excludeFilters
: 컴포넌트 스캔에서 제외할 대상을 지정//MyIncludeComponent.java
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyIncludeComponent {
}
//MyExcludeComponent.java
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyExcludeComponent {
}
//BeanA.java
@MyIncludeComponent
public class BeanA {
}
//BeanB.java
@MyIncludeComponent
public class BeanB {
}
@ComponentScan(
includeFilters = @Filter(type = FilterType.ANNOTATION, classes = MyIncludeComponent.class),
excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = MyExcludeComponent.class)
)
includeFilters
에 MyIncludeComponent
애노테이션을 추가해서 BeanA가 스프링 빈에 등록 OexcludeFilters
에 MyExcludeComponent
애노테이션을 추가해서 BeanB가 스프링 빈에 등록 XTypeFilter
라는 인터페이스 구현해서 처리ConflictingBeanDefinitionException
예외 발생 Overriding bean definition for bean 'memoryMemberRepository'
with a differentdefinition: replacing
Consider renaming one of the beans or enabling overriding by setting
spring.main.allow-bean-definition-overriding=true