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

@ComponentScan注释适用于非@Configuration类

谭骏
2023-03-14

Spring参考文档说明如下:

/**
 * Java-based configuration class which defines root package to start scanning from.
 */
@ComponentScan
public class ComponentScanPackageMarker {
}

/**
 * Class annotated with <b>stereotype</b> annotation is a candidate for automatic detection and registering as
 * {@link BeanDefinition} instance.
 */
@Component
public class Pen {

    private Ink ink;

    @Autowired
    public Pen(Ink ink) {
        this.ink = ink;
    }
}

/**
 * Auto-detected class which will be used as auto-wiring candidate for another auto-detected component.
 */
@Component
public class Ink {
}

ComponentScanPackageMarker类故意省略了@Configuration注释。我已经测试了组件扫描和自动连接功能。令我吃惊的是,一切都很顺利:

@Test
public void shouldAutoDetectAndRegisterBeans() {
    try (AnnotationConfigApplicationContext context =
                 new AnnotationConfigApplicationContext(ComponentScanPackageMarker.class)) {
        Pen pen = context.getBean(Pen.class);
        Assert.assertNotNull(pen);
        Ink ink = context.getBean(Ink.class);
        Assert.assertNotNull(ink);
    }
}

组件扫描的这种行为是故意的吗?为什么即使没有@Configuration注释也能工作?

共有1个答案

胡星汉
2023-03-14

是的。我认为@ComponentScan的工作是扫描给定的包,并注册用原型注释(@Component、@Configuration、@Service和@Repository)注释的bean,如果找到的话,而@Configuration的工作是将方法的(用@bean注释的)返回值注册为容器中的bean。

如果我错了就纠正我。

 类似资料:
  • 我是Spring的新手,我很困惑@CreatedDate注释在实体中是如何工作的。 我做了一次谷歌搜索,有很多解决方案,但除了一个,没有一个适合我。我很困惑为什么? 这是我先试的 它不起作用。我为列中的值获取了NULL。 然后我做了这个。 这实际上将时间戳存储在db中。我的问题是,我遵循的大多数教程都建议我不需要来获取当前时间戳。看起来我确实需要它。我缺少什么吗?

  • 从Spring 2.5开始,可以使用annotations配置依赖注入。 因此,不是使用XML来描述bean连接,而是可以通过在相关的类,方法或字段声明上使用注释将bean配置移动到组件类本身。 在注入XML之前执行注释注入。 因此,对于通过两种方法连接的属性,后一种配置将覆盖前者。 默认情况下,Spring容器中未打开注释接线。 因此,在我们使用基于注释的布线之前,我们需要在Spring配置文件

  • 我试图让RunWith(PowerMockRunner.class)处理我现有的包注释。 版本: Powermock 1.4.12 mockito 1.9.0 jUnit 4.8.2 package-info.java//这是包注释 测试说明。java//这是包“com.smin.dummy”的元数据注释类 A、 爪哇 莫卡。Java语言 在unitest MockA中。如果我不使用RunWith

  • 环境:科特林 1.5.30, 春靴 2.5.4(Spring 5.3.9) 我试图创建一个组合注释来简化类似的模板注释代码。注释类如下: 预期用法: application.yaml: 但在应用程序启动后,TheBean 未按预期注册。 > 首先,我在github spring存储库中搜索,发现了这个:回归:自定义组合@Profile注释,组件扫描不再支持没有运行时保留。所以我试图但没有效果。 尝

  • > 我不能使基本包属性是动态的,即我不能传递,但需要在配置中预先定义包。 我查看了,但无法使其工作。 当我忽略基本包时,扫描从注释的定义包开始,而不是从注释类的包开始。在上面的示例中,它只扫描并创建中类的bean,而不扫描并创建中的bean。 如果将放在类上,则一切都可以工作,但当将其移动到的元注释时,将停止工作。如何告诉Spring Framework将视为使用某些默认值指定的另一种方式。我尝试