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 评论