1.10.3 자동으로 클래스 검색 및 Bean 정의 등록

Spring은 스테레오 타입 클래스를 자동으로 감지하여 해당 BeanDefinition인스턴스를 ApplicationContext에 등록 할 수 있다. 예를 들어, 다음 두 클래스는 자동 감지에 해당합니다.

@Service
public class SimpleMovieLister {

    private MovieFinder movieFinder;

    @Autowired
    public SimpleMovieLister(MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }
}
@Repository
public class JpaMovieFinder implements MovieFinder {
    // 명확성을 위해 구현이 생략되었다.
}

이러한 클래스를 자동 검색하고 해당 빈을 등록하려면 @Configuration클래스에 @ComponentScan속성을 추가 해야합니다 . 여기서 basePackages속성은 두 클래스의 공통 상위 패키지입니다. (또는 각 클래스의 상위 패키지를 포함하는 쉼표 또는 세미콜론 또는 공백으로 구분 된 목록을 지정할 수 있습니다.)

@Configuration
@ComponentScan(basePackages = "org.example")
public class AppConfig  {
    ...
}

간단히하기 위해, 앞의 예제는 annotation의 value속성을 사용할 수 있습니다 (즉, @ComponentScan("org.example")).

다음 대안은 XML을 사용합니다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="org.example"/>

</beans>

<context:component-scan>을 사용하면 암시 적으로는<context:annotation-config>의 기능을 사용할 수 있습니다 .일반적으로<context:component-scan> 을 사용할 때<context:annotation-config>요소를 사용할 필요가 없습니다 .

<context:annotation-config> : XML에서 정의 되었든 컴포넌트 스캔을 통해 정의되었는지에 관계없이 빈에서 많은 다른 주석을 활성화합니다.

<context:component-scan> : XML을 사용하지 않고 bean을 정의하기위한 것입니다.

<context:annotation-config> : spring 설정 XML에서 이미 등록 된 빈에 대한 주석을 검색하고 활성화합니다.

<context:component-scan> : 빈 등록 + <context:annotation-config>

@Autowired와 @Required대상 속성 레벨 이므로 bean은 Spring IOC에서 이러한 주석을 사용하기 전에 등록해야합니다. 이 주석을 활성화하려면 각 bean을 등록하거나 <context:annotation-config /> 포함시켜야합니다. 즉, <context:annotation-config /> 는 등록 된 bean에서만 작동합니다.

@RequiredRequiredAnnotationBeanPostProcessor 처리 도구를 활성화합니다. @AutowiredAutowiredAnnotationBeanPostProcessor 처리 도구를 활성화합니다.

참고 : 주석 자체는 아무 것도 아니며 핵심 프로세스를 담당하는 클래스 인 처리 도구 가 필요합니다.

@Repository, @Service 및 @Controller는 @Component 이며 클래스 수준대상으로합니다 .

<context:component-scan> 은 패키지를 검색하고 빈을 찾아 등록하며 <context:annotation-config /> 의해 수행 된 작업을 포함합니다.

클래스 경로 패키지를 검색하려면 클래스 경로에 해당 디렉토리 항목이 있어야합니다. Ant로 JAR을 빌드 할 때, JAR 태스크의 파일 전용 스위치를 활성화하지 않았는지 확인하십시오. 또한 클래스 경로 디렉토리는 일부 환경의 보안 정책에 따라 노출되지 않을 수 있습니다 (예 : JDK 1.7.0_45 이상 버전의 독립 실행 형 응용 프로그램) (매니페스트에 '신뢰할 수있는 라이브러리'설정 필요 - http://stackoverflow.com/ 참조) . 질문 / 19394570 / java-jre-7u45-breaks-classloader-getresources ).

JDK 9의 모듈 경로 (Jigsaw)에서 Spring의 classpath 스캐닝은 일반적으로 예상대로 작동한다. 그러나 구성 요소 클래스가 module-info 설명 로 내보내 졌는지 확인하십시오 . Spring이 비공개 클래스 멤버를 호출 할 것으로 기대하는 경우, 클래스가 공개되어 있는지 (즉, 모듈 정보 설명자의 내보내기 선언 대신 열기 선언을 사용합니다.)

또한 AutowiredAnnotationBeanPostProcessorand CommonAnnotationBeanPostProcessor는 component-scan 요소를 사용할 때 암시 적으로 포함됩니다. 즉, 두 구성 요소가 자동으로 감지되고 함께 연결됩니다. XML의 모든 빈 구성 메타 데이터가 제공되지 않습니다.

당신의AutowiredAnnotationBeanPostProcessorCommonAnnotationBeanPostProcessor의 등록 해제 할 수 있습니다. false값을 주석-설정 속성을 포함시킴으로써 .

<context:annotation-config /> 태그를 사용하면 내부적으로 다음의 클래스를 빈 객체로 등록한다.

  • AutowiredAnnotationBeanPostProcessor : @Autowired에 대한 의존 주입 처리를 한다.

  • RequiredAnnotationBeanPostProcessor : @Required에 대한 의존 주입 처리를 한다.

  • ConfigurationClassPostProcessor : @Configuration에 대한 설정 처리를 한다.

  • CommonAnnotationBeanPostProcessor : JSR-250(@PostConstruct 등)에 대한 라이프사이클 처리를 한다.

Last updated