【问题标题】:Why ClassPathBeanDefinitionScanner.scan() can't scan @Bean? [closed]为什么 ClassPathBeanDefinitionScanner.scan() 不能扫描@Bean? [关闭]
【发布时间】:2020-11-17 03:17:09
【问题描述】:

我有四个这样的javaclass;

我使用弹簧 5.3.1 ; openjdk 11 ;这是我的代码;

Main.java

public class Main {
public static void main(String[] args) {

    var registry = new SimpleBeanDefinitionRegistry();

    var scanner = new ClassPathBeanDefinitionScanner(registry);

    scanner.setIncludeAnnotationConfig(false);

    scanner.scan("org.scx.*");

    for (var name : registry.getBeanDefinitionNames()) {
        System.err.println(name);
    }
}

ClassOne.java

@Component
public class ClassOne {

}

ClassTwo.java

@Component
public class ClassTwo {

    @Bean
    public ClassThree classThree() {
        return new ClassThree();
    }
}

ClassThree.java

public class ClassThree {

}

现在我运行它;只需打印这些;

classOne
classTwo

我找不到 ClassThree 为什么? 请问我该怎么办。

我完成了;使用 SpringApplicationRunListener ;非常感谢大家

【问题讨论】:

  • 你试过没有setIncludeAnnotationConfig(false)吗?使用false,它不会注册annotation config 后处理器,而@Bean 是用于配置bean 的注解。
  • 因为它只是一台扫描仪。它将检测ClassTwo,但不会处理类上的注释。这是ApplicationContext而不是扫描仪的任务。

标签: java spring spring-boot


【解决方案1】:

文档,即ClassPathBeanDefinitionScanner 的javadoc 说:

一个 bean 定义扫描器,用于检测类路径上的 bean 候选,将相应的 bean 定义注册到给定的注册表(BeanFactory 或 ApplicationContext)。

通过可配置的类型过滤器检测候选类。默认过滤器包括使用 Spring 的 @Component、@Repository、@Service 或 @Controller 构造型注释的类。

基本上,这是用于扫描类路径以查找带有@Component 或派生@Component 注释的类的内部主力,即本身带有@Component 注释的注释。

就是这样。它只扫描@Component 带注释的类。此类不处理@Bean 注释方法的处理。这通常由ConfigurableApplicationContext 的refresh() 方法完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-19
    • 1970-01-01
    • 2016-09-23
    • 2017-12-23
    • 2021-11-11
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    相关资源
    最近更新 更多