1. 소개

이 빠른 사용방법(예제)에서는 Spring Framework에서 @ComponentScan@EnableAutoConfiguration 어노테이션 간의 차이점에 대해 알아봅니다 .

2. 스프링 어노테이션

어노테이션을 사용하면 Spring에서 의존성 주입을 더 쉽게 구성할 수 있습니다. XML 구성 파일을 사용하는 대신 클래스와 메소드에 Spring Bean 어노테이션을 사용하여 bean을 정의할 수 있습니다. 그 후 Spring IoC 컨테이너는 Bean을 구성하고 관리합니다.

이 기사에서 논의할 어노테이션의 개요는 다음과 같습니다.

  • @ComponentScan 은 어노테이션이 달린 Spring 구성 요소를 스캔합니다.
  • @EnableAutoConfiguration 은 자동 구성을 활성화하는 데 사용됩니다.

이제 이 두 어노테이션의 차이점을 살펴보겠습니다.

3. 차이점

이러한 어노테이션의 주요 차이점은 @ComponentScan 이 Spring 구성 요소를 스캔하는 반면 @EnableAutoConfigurationSpring Boot 애플리케이션 의 클래스 경로에 있는 자동 구성 빈에 사용 된다는 것 입니다 .

이제 더 자세히 살펴보겠습니다.

3.1. @컴포넌트스캔

애플리케이션을 개발하는 동안 Spring 프레임워크에 Spring 관리 구성 요소를 찾도록 지시해야 합니다. @ComponentScan을 사용하면 Spring이 구성, 컨트롤러, 서비스 및 우리가 정의한 기타 구성 요소를 스캔할 수 있습니다 .

특히 @ComponentScan  어노테이션은 @Configuration 어노테이션 과 함께 사용되어 Spring이 구성 요소를 스캔할 패키지를 지정합니다.

@Configuration
@ComponentScan
public class EmployeeApplication {
    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(EmployeeApplication.class, args);
        // ...
    }
}

또는 Spring은 basePackageClasses() 또는 basePackages()를 사용하여 정의할 수 있는 지정된 패키지에서 스캔을 시작할 수도 있습니다 . 패키지가 지정되지 않으면 @ComponentScan 어노테이션을 선언하는 클래스의 패키지를 시작 패키지로 간주합니다 .

package com.baeldung.annotations.componentscanautoconfigure;

// ...

@Configuration
@ComponentScan(basePackages = {"com.baeldung.annotations.componentscanautoconfigure.healthcare",
  "com.baeldung.annotations.componentscanautoconfigure.employee"},
  basePackageClasses = Teacher.class)
public class EmployeeApplication {
    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(EmployeeApplication.class, args);
        // ...
    }
}

예제에서 Spring은 의료직원  패키지와 Teacher 클래스에서 구성 요소를 스캔합니다 .

Spring은 @Configuration 어노테이션이 달린 클래스에 대해 모든 하위 패키지와 함께 지정된 패키지를 검색합니다 . 또한 , 구성 클래스를 포함 할 수 있습니다 @Bean 스프링 애플리케이션 컨텍스트 Bean과 같은 방법을 등록 어노테이션을, . 그 후 @ ComponentScan  어노테이션은 다음과 같은 빈을 자동으로 감지할 수 있습니다.

@Configuration
public class Hospital {
    @Bean
    public Doctor getDoctor() {
        return new Doctor();
    }
}

또한, @ ComponentScan  어노테이션도 스캔, 어노테이션 클래스 Bean 감지하고 등록 할 수 있습니다 @Component, @Controller, @Service , 그리고  @Repository를 .

예를 들어 @ ComponentScan  어노테이션 으로 스캔할 수 있는 구성 요소로 Employee 클래스를 만들 수 있습니다 .

@Component("employee")
public class Employee {
    // ...
}

3.2. @EnableAutoConfiguration

@EnableAutoConfiguration의 어노테이션 자동 구성 응용 프로그램 컨텍스트에 Spring 부팅 할 수 있습니다 . 따라서 클래스 경로에 포함된 jar 파일과 우리가 정의한 빈을 기반으로 빈을 자동으로 생성하고 등록합니다.

예를 들어 클래스 경로에 spring-boot-starter-web 의존성을 정의하면 Spring 부트는 Tomcat  과 Spring MVC를 자동으로 구성합니다 . 그러나 이 자동 구성은 자체 구성을 정의하는 경우 우선 순위가 낮습니다.

@EnableAutoConfiguration 어노테이션을 선언한 클래스의 패키지가 기본값으로 간주됩니다 . 따라서 모든 하위 패키지와 클래스를 검사할 수 있도록 항상 루트 패키지에 @EnableAutoConfiguration 어노테이션을 적용해야 합니다  .

@Configuration
@EnableAutoConfiguration
public class EmployeeApplication {
    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(EmployeeApplication.class, args);
        // ...
    }
}

또한 @EnableAutoConfiguration 어노테이션은 매개변수를 수동으로 제외하는 두 개의 매개변수를 제공합니다.

자동 구성을 원하지 않는 클래스 List을 비활성화하기 위해 exclude사용할 수 있습니다 .

@Configuration
@EnableAutoConfiguration(exclude={JdbcTemplateAutoConfiguration.class})
public class EmployeeApplication {
    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(EmployeeApplication.class, args);
        // ...
    }
}

excludeName 을 사용하여 자동 구성에서 제외하려는 완전한 클래스 이름 List을 정의 할 수 있습니다 .

@Configuration
@EnableAutoConfiguration(excludeName = {"org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration"})
public class EmployeeApplication {
    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(EmployeeApplication.class, args);
        // ...
    }
}

Spring Boot 1.2.0부터 @Configuration, @EnableAutoConfiguration@ComponentScan 어노테이션을 기본 속성과 함께 조합@SpringBootApplication  어노테이션을 사용할 수 있습니다 .

@SpringBootApplication
public class EmployeeApplication {
    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(EmployeeApplication.class, args);
        // ...
    }
}

4. 결론

이 기사에서는 Spring Boot에서 @ComponentScan@EnableAutoConfiguration 의 차이점에 대해 배웠습니다 .

항상 그렇듯이 이 예제의 코드는 GitHub 에서 사용할 수  있습니다 .

Generic footer banner