컴포넌트 스캔

2022. 8. 14. 18:09프로그래밍/JAVA\Spring

@ComponentScan

@Component가 붙은 클래스를 컴포넌트 스캔의 대상이되 지정된 것들을 빈으로 등록해줌

 

@ComponentScan(excloudeFilter = @Filter(type  = FilterType.AMMOTATION, classes = 클래스 이름.class))

해당 클래스를 제외하고 컴포넌트 등록됨

 

자동 의존관계주입

@Autowired

 

public class AutoAppConfigTest {

	@Test
    void basicScan(){
    	AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class);
        
        Memver Service memberService = ac.getBean(MemberService.class);
        Assertions.assertThat() .....
	}
}

@Autowired

기본 타입을 기준으로 자동으로 주입을 해줌ㅏ가

 

basePackages = "hello.coer.xxx"

해당 패키지에서 컴포넌트 스캔을 시작할수있음

basePackageClasses = AutoAppConfig.class

해당 클래스를 기준으로 스캔

 

지정하지 않으면 @ComponentScan이 붙은 클래스를 기준으로 하위의 모든 클래스를 스캔

설정정보 클래스의 위치ㅣ를 프로젝트 최상단에 두는 것

 

@SpringBootApplication

SpringBoot를 사용하며 이 최상위에 자동으로 생성되며 내부에 @ComponentScan

 

@Component

@Controller : 스프링 MVC 컨트롤러로 인식

@Service : 핵심 비지니스 로직이 있다는 인식 정도. 특별한 기능x

@Repositoriy : 스프링 데이터 접근 계층으로 인식하고 데이터 계층의  예외를 스프링 예외로 변환해준다.

@Configuration

이 사용된 클래스는 대상에 포함됨

 

애노테이션은 상속관계라는 것이 없다. 그래서 트정애노테이션이 특정 애노테이션을 들고있는것을 인식할 수 이쓴ㄴ 것은 자바 언어가 지원하는 기능이 아니고 스프링이 지원하는 기능이다.

 

필터

 

Annotation

class 생성

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyIncludeConponent{

}

test


@Test
void filterScan(){
	ApplicationContext ac = new AnnotationcConfigApplicationContext(ComponentFilterAppConfig.class);
    BeanA beanA = ac.getBean("beanA", BeanA.class);
    assertThat(beanA).isNotNull();
    
    assertThrows(
    	MoSuchBeanDefinitionExcepption.class,
        () -> ac.getBean("beanB", BeanB.class);
    )
    
}

@Configuration
@ComponentScan(
    IncludeFilters = @Filter(classes = MyIncludeComponent.class),//해당 어노테이션은 스캔
    excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = MyExcludeComponent.class)//스캔 제외
)
static class ComponentFilterAppConfig{
}

 

중복등록과 충돌

 

자동 빈 등록 vs 자동 빈 등록 - 오류발생

수동 빈 등록 vs 자동 빈 등록 - 수동빈이 우선권이 생김. 수동빈이 자동빈을 오버라이딩 해버린다.

최근에 springBoot에서 수동빈과 자동빈의 충돌이 발생할경우 오류가 나버림

 

협업에서 다양한 사람이 개발을 하기때문에 오류가 발생할경우 애매한 코드를 만들면 안됨!!!

명확한 개발을 해야한다!!!!