• Home
  • About
    • Junseok photo

      Junseok

      개발자 블로그

    • Learn More
    • Facebook
    • Instagram
    • Github
  • Posts
    • All Posts
    • All Tags
  • Java
    • java-basic
    • java-solid
    • java-pattern
    • java-logging
  • Javascript
  • Angular
  • spring
    • spring-framework
    • spring-boot
    • spring-test
  • server
    • jeus
    • webtob
    • tomcat
  • test
    • junit
    • assertj
    • hamcrest
    • dbunit
    • spring
  • docker
  • unix
  • maven
  • db
  • network
  • eclipse
  • intellij
  • microservices
  • etc

Autowired, ComponentScan 애너테이션

11 Mar 2018

Reading time ~1 minute

자동으로 클래스 검색 및 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  {
    ...
}

간결성을 위해 위의 코드는 어노테이션의 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> 요소를 포함시킬 필요가 없습니다.


classpath packages 를 검색하려면 classpath에 해당 디렉토리 항목이 있어야 합니다.
Ant로 JAR을 빌드 할 때, JAR 태스크의 파일 전용 스위치를 활성화하지 않았는지 확인하십시오.
또한 classpath 디렉토리는 일부 환경에서 보안 정책에 따라 노출되지 않을 수도 있습니다.

예: JDK 1.7.0_45 이상 버전의 독립 실행 형 앱 (매니페스트에 ‘신뢰할 수있는 라이브러리’설정 필요,
스택오버플로우 참조).

JDK 9의 모듈 경로 (Jigsaw)에서 Spring의 classpath 스캐닝은 일반적으로 예상대로 작동한다.
그러나 컴포넌트 클래스가 모듈 정보 디스크립터로 내보내 졌는지 확인하십시오.
Spring이 비공개(non-public) 클래스 멤버를 호출 할 것으로 기대하는 경우
클래스가 공개되어 있는지 확인하십시오.

(예 : 모듈 정보 설명자(module-info descriptor)의
내보내기(exports) 선언(declaration) 대신 열기(opens) 선언(declaration) 사용)


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


autowiredAnnotationBeanPostProcessor 및 CommonAnnotationBeanPostProcessor의 등록을 비활성화 하려면
값이 false 인 annotation-config 속성을 포함시킵니다.




springframeworkcomponentscan Share Tweet +1