【问题标题】:What is the difference between @ComponentScan and @EnableAutoConfiguration in Spring Boot?Spring Boot 中的 @ComponentScan 和 @EnableAutoConfiguration 有什么区别?
【发布时间】:2016-05-02 12:05:14
【问题描述】:

Spring Boot 中的@ComponentScan@EnableAutoConfiguration 注解有什么区别?有必要添加这些吗?没有这些注释,我的应用程序运行良好。我只是想了解为什么我们必须添加它们。

【问题讨论】:

  • 你有@SpringBootApplication吗?那是你提到的两个的替代品
  • 是的,我在我的主课中使用它们
  • @ComponentScan 用于扫描带注释的 Spring 组件,@EnableAutoConfiguration 它启用 Spring Boot 提供的免费好东西(配置、激活的组件等)。 @SprintBootApplication 允许您使用单个注释而不是常用的几个注释,例如您提到的两个。看看我链接到的javadoc

标签: java spring spring-mvc spring-boot


【解决方案1】:

@ComponentScan 和 Spring Boot 中的 @EnableAutoConfiguration 注解?

@EnableAutoConfiguration 注释告诉 Spring Boot 根据您添加的 jar 依赖项“猜测”您将如何配置 Spring。例如,如果 HSQLDB 在您的类路径中,并且您没有手动配置任何数据库连接 bean,那么 Spring 将自动配置内存数据库。

@ComponentScan 告诉 Spring 在指定的包中查找其他组件、配置和服务。 Spring 能够从预定义的项目包中自动扫描、检测和注册您的 bean 或组件。如果未指定包,则将当前类包作为根包。

这些有必要加吗?

如果你需要 Spring boot 来自动为你配置所有东西 @EnableAutoConfiguration 是必需的。你不需要手动添加,spring会根据你提供的注解在内部为你添加。

实际上@SpringBootApplication注解相当于使用@Configuration@EnableAutoConfiguration@ComponentScan及其默认属性。

另请参阅:

【讨论】:

  • 那么@ComponentScan@ComponentScans之间呢??
【解决方案2】:

Spring Boot 的主要优点之一是它的注解驱动与传统的基于 xml 的配置相比,@EnableAutoConfiguration 根据其包含的 jar 文件自动配置 Spring 应用程序,它根据以下内容设置默认值或帮助程序pom.xml 中的依赖项。 自动配置通常基于类路径和定义的 bean 应用。因此,我们不需要定义任何 DataSource、EntityManagerFactory、TransactionManager 等,并且神奇地基于类路径,Spring Boot 会自动创建适当的 bean 并为我们注册它们。例如,当您的类路径中有一个 tomcat-embedded.jar 时,您可能需要一个 TomcatEmbeddedServletContainerFactory(除非您已经定义了自己的 EmbeddedServletContainerFactory bean)。 @EnableAutoConfiguration 有一个 exclude 属性来显式禁用自动配置,否则我们可以简单地将其从 pom.xml 中排除,例如,如果我们不希望 Spring 配置 tomcat,则从 spring-boot-starter- 中排除 spring-bootstarter-tomcat网络。

@ComponentScan 为 Spring 组件扫描提供范围,它只是通过 提供的基础包 并获取 @Bean 或 @Autowired 等所需的依赖项,在典型的Spring 应用程序,@ComponentScan 用于配置类中,使用@Configuration 注释的类。配置类包含使用@Bean 注释的方法。这些 @Bean 注解的方法生成由 Spring 容器管理的 bean。这些 bean 将由 @ComponentScan 注释自动检测。有一些注解使 bean 可以自动检测,例如 @Repository、@Service、@Controller、@Configuration、@Component。 在下面的代码中,Spring 从包含 BeanA 类的包开始扫描。

@Configuration
@ComponentScan(basePackageClasses = BeanA.class)
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})
public class Config {

  @Bean
  public BeanA beanA(){
    return new BeanA();
  }

  @Bean
  public BeanB beanB{
    return new BeanB();
  }

}

【讨论】:

    【解决方案3】:

    @EnableAutoConfiguration 在 spring boot 中会根据您在类路径中添加的 jar 告诉您如何配置 spring。 例如,如果您在类路径中添加 spring-boot-starter-web 依赖项,它会自动配置 Tomcat 和 Spring MVC。

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    

    您可以将@EnableAutoConfiguration 注释与@Configuration 注释一起使用。 它有两个可选元素,

    • exclude :如果您想排除某个类的自动配置。
    • excludeName : 如果您想使用类的完全限定名排除类的自动配置。

    例子:

    @Configuration
    @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
      public class MyConfiguration {
    }
    
    
    @EnableAutoConfiguration(excludeName = {"org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration"})
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }
    

    @SpringBootApplication 是 Spring Boot 1.2 中引入的 @EnableAutoConfiguration 的更新版本。

    @SpringBootApplication是三个注解的组合,

    • @Configuration - 用于基于 java 的配置类。

    • @ComponentScan - 启用组件扫描,所有包和 将自动扫描根包下的子包 应用了哪个@SpringBootApplication。

    • @EnableAutoConfiguration - 启用自动配置
      类基于类路径中添加的 jar。

    @ComponentScan 启用组件扫描,以便您创建的 Web 控制器类和其他组件将自动 在 Spring 的应用程序上下文中发现并注册为 bean。 您可以指定将被扫描以自动发现和注册 bean 的基本包。

    其中一个可选元素是,

    • basePackages - 可用于指定要扫描的特定包。

    例子,

    @ComponentScan(basePackages = {"com.example.test"})
    @Configuration
    public class SpringConfiguration { }
    

    【讨论】:

      猜你喜欢
      • 2014-11-17
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      • 2020-07-21
      • 1970-01-01
      • 2015-03-28
      • 2020-01-01
      • 2016-12-18
      相关资源
      最近更新 更多