1.简介
在本快速教程中,我们将了解Spring Framework中@ComponentScan和@EnableAutoConfiguration
2.Spring注解
注释使在Spring中配置依赖项注入更加容易。除了使用XML配置文件,我们还可以在类和方法上使用Spring Bean批注来定义bean 。之后,Spring IoC容器配置并管理Bean。
这是我们将在本文中讨论的注释的概述:
@ComponentScan扫描带注释的Spring组件@EnableAutoConfiguration用于启用自动配置
现在让我们研究这两个注释之间的区别。
3.他们如何不同
这些注释之间的主要区别在于, @ComponentScan ComponentScan扫描Spring组件,而@EnableAutoConfiguration用于自动配置Spring Boot应用程序的类路径中存在的bean 。
现在,让我们更详细地研究它们。
3.1 @ComponentScan
在开发应用程序时,我们需要告诉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.tutorial.annotations.componentscanautoconfigure.healthcare",
"com.tutorial.annotations.componentscanautoconfigure.employee"},
basePackageClasses = Teacher.class)
public class EmployeeApplication {
public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(EmployeeApplication.class, args);
// ...
}
}
在示例中,Spring将扫描healthcare和employee套餐以及Teacher类的组件。
Spring在指定的软件包及其所有子软件包中搜索@Configuration .另外, Configuration类可以包含@Bean批注,这些批注将方法注册为Spring应用程序上下文中的bean 。之后,@ ComponentScan批注可以自动检测此类bean:
@Configuration
public class Hospital {
@Bean
public Doctor getDoctor() {
return new Doctor();
}
}
**ComponentScan注释还可以扫描,检测和注册Bean,以使用@ @Component, @Controller, @Service和@Repository**注释的类。
例如,我们可以创建一个Employee类作为组件,可以通过@ ComponentScan批注进行扫描:
@Component("employee")
public class Employee {
// ...
}
3.2 @EnableAutoConfiguration
@EnableAutoConfiguration注释使Spring Boot能够自动配置应用程序上下文。因此,它会基于类路径中包含的jar文件和我们定义的bean自动创建和注册bean。
例如,当我们spring-boot-starter-web依赖项时,Spring boot会自动配置Tomcat和Spring MVC。但是,如果我们定义自己的配置,则此自动配置的优先级较低。
@EnableAutoConfiguration批注的类的包被视为默认包。因此,我们应该始终@EnableAutoConfiguration批注,以便可以检查每个子包和类:
@Configuration
@EnableAutoConfiguration
public class EmployeeApplication {
public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(EmployeeApplication.class, args);
// ...
}
}
此外, @EnableAutoConfiguration批注提供了两个参数以手动排除任何参数:
我们可以使用exclude禁用我们不想自动配置的类的列表:
@Configuration
@EnableAutoConfiguration(exclude={JdbcTemplateAutoConfiguration.class})
public class EmployeeApplication {
public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(EmployeeApplication.class, args);
// ...
}
}
我们可以使用excludeName定义要从自动配置中排除的类名的完全限定列表:
@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开始,我们可以使用**@SpringBootApplication批注,该批注是@Configuration, @EnableAutoConfiguration, @ComponentScan EnableAutoConfiguration和@ComponentScan这三个批注及其默认属性的组合**:
@SpringBootApplication
public class EmployeeApplication {
public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(EmployeeApplication.class, args);
// ...
}
}
4 结论
在本文中,我们了解了Spring Boot中@ComponentScan和@EnableAutoConfiguration
0 评论