我试图理解这个问题,假设我有 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在这里不起作用。
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());
}
}}