为什么当我给@ComponentScan时spring无法获取bean?

问题描述 投票:0回答:1

我试图理解这个问题,假设我有 spring 而没有 spring boot,我正在创建一个新的上下文,但没有传递如下所示的配置类

@ComponentScan("com.main.config")
public class Application {
public static void main(String[] args) {
    try(var context = new AnnotationConfigApplicationContext()){
        MyBean mybean = context.getBean(MyBean.class);
        System.out.println(mybean.getMessage());
    }

}} 

既然我已经给出了 @ComponentScan 和我的配置类所在的包以及 @Configuration 为什么它无法找到配置类?为什么我需要在构造函数中传递我的配置类才能找到这样的类

  try(var context = new AnnotationConfigApplicationContext(ProjectConfig.class))

在构造函数中添加配置类作为参数后,它工作正常,但是当我不这样做时,即使我有@ComponentScan,它也不起作用并抛出错误 线程“main”中的异常java.lang.IllegalStateException:org.springframework.context.annotation.AnnotationConfigApplicationContext@4c70fda8尚未刷新

为什么上下文需要刷新?为什么@ComponentScan在这里不起作用。

java spring spring-annotations spring-context
1个回答
0
投票

AnnotationConfigApplicationContext 就是这样设计的。如果没有提供组件类,我们必须手动注册它们,然后刷新上下文。请参阅

new AnnotationConfigApplicationContext()
构造函数的 javadoc

创建一个新的AnnotationConfigApplicationContext,需要通过注册调用填充,然后手动刷新。

@ComponentScan("com.main.config")
public class Application {
public static void main(String[] args) {
    try(var context = new AnnotationConfigApplicationContext()){
        context.register(Application.class);
        context.refresh();
        MyBean mybean = context.getBean(MyBean.class);
        System.out.println(mybean.getMessage());
    }
}}

或者使用您的应用程序类作为配置文件

@ComponentScan("com.main.config")
public class Application {
public static void main(String[] args) {
    try(var context = new AnnotationConfigApplicationContext(Application.class)){
        MyBean mybean = context.getBean(MyBean.class);
        System.out.println(mybean.getMessage());
    }
}}
© www.soinside.com 2019 - 2024. All rights reserved.