1. 소개
이 빠른 사용방법(예제)에서는 Spring Framework에서 @ComponentScan 과 @EnableAutoConfiguration 어노테이션 간의 차이점에 대해 알아봅니다 .
2. 스프링 어노테이션
어노테이션을 사용하면 Spring에서 의존성 주입을 더 쉽게 구성할 수 있습니다. XML 구성 파일을 사용하는 대신 클래스와 메소드에 Spring Bean 어노테이션을 사용하여 bean을 정의할 수 있습니다. 그 후 Spring IoC 컨테이너는 Bean을 구성하고 관리합니다.
이 기사에서 논의할 어노테이션의 개요는 다음과 같습니다.
- @ComponentScan 은 어노테이션이 달린 Spring 구성 요소를 스캔합니다.
- @EnableAutoConfiguration 은 자동 구성을 활성화하는 데 사용됩니다.
이제 이 두 어노테이션의 차이점을 살펴보겠습니다.
3. 차이점
이러한 어노테이션의 주요 차이점은 @ComponentScan 이 Spring 구성 요소를 스캔하는 반면 @EnableAutoConfiguration 은 Spring 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 의 차이점에 대해 배웠습니다 .