当前位置: 首页 > 知识库问答 >
问题:

@componentscan必须与@configuration一起放置吗?(Spring芯)

叶鸿煊
2023-03-14

我在许多文章中读到,@ComponentScan应该与@Configuration一起放在类的顶部。这里有一些参考:

我们使用@componentscan注释和@configuration注释来指定要扫描的包(https://www.baeldung.com/spring-component-scanning)

@componentscan(basePackages=“com.zetcode”)@配置公共类应用html" target="_blank">程序{...}(http://zetcode.com/spring/componentscan)

@componentscan注释与@configuration注释一起使用,告诉Spring要扫描带注释的组件的包。(https://dzone.com/articles/spring-component-scan)

我很想试试如果没有@configuration,是否会引发异常。令人惊讶的是,即使没有@configuration也能正常工作。下面是代码

@ComponentScan
public class AppConfig {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        for (String beanDefinitionName : context.getBeanDefinitionNames()) {
            System.out.println(beanDefinitionName);
        }
    }
}

我只有一个打印出来的样本豆。

@Component
public class Car {

}

这是main方法的输出:

org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
appConfig
car

它为什么起作用?为什么他们告诉使用配置它?这是一个古老的要求吗?

更令人惊讶的是,appConfig变成了一个bean,即使它没有任何特定的注释,比如@configuration或@component。那么,这是否意味着任何作为新AnnotationConfigApplicationContext()参数的内容都将被转换为bean,不管它有没有什么注释?

我可能错过了一些可以证明这一点的核心spring行为。你知道吗?

共有1个答案

师腾
2023-03-14

您仍然在隐式地使用@configuration@componentscan。通过将appconfig.class作为param移到上下文中,它将其视为配置。这也可以解释为它创建的bean

 类似资料:
  • 如果让我们假设我用@component(首先忽略@repository、@service等更具体的注释)声明我的所有bean,并确保包被@componentscan注释扫描,那么我仍然用@configuration和@componentscan注释我的类的具体用例是什么? 我之所以问这个问题,是因为有时我会看到同时用@configuration和@componentscan注释的类。

  • 我正在用Spring Boot和MongoDB开发一个web应用程序。我想让服务与@transactional spring注释一起工作,但我不知道这是否真的有效。(我以前没有与mongoDB合作过)。 我添加了注释,看起来一切都正常运行(应用程序运行,我可以执行CRUD的所有操作),但是,我不知道Spring是否忽略了注释,它是否正常工作,或者是否真的在考虑事务性。 在另一篇文章中,我看到我应该

  • 我试图以最简单的形式理解异步等待。我想创建一个非常简单的方法,为了这个例子,添加两个数字,当然,这根本不需要处理时间,它只是在这里制定一个例子的问题。 如果我等待代码是同步运行还是异步运行?

  • 问题内容: 我的head标签中未包含以下代码行,但是我的收藏夹图标仍显示在浏览器中: 包含它的目的是什么? 问题答案: 如果您不调用favicon,则可以使用该标记来指定实际路径(如果您将其放在目录中)。默认情况下,浏览器/网页在根目录中查找。

  • Spring参考文档说明如下: ComponentScanPackageMarker类故意省略了@Configuration注释。我已经测试了组件扫描和自动连接功能。令我吃惊的是,一切都很顺利: 组件扫描的这种行为是故意的吗?为什么即使没有@Configuration注释也能工作?