【问题标题】:Is ApplicationContext automatically instantiated in Spring?ApplicationContext 是否在 Spring 中自动实例化?
【发布时间】:2020-11-20 09:11:12
【问题描述】:

Spring会自动实例化ApplicationContext吗?

如果我的 bean 是这样定义的

@Component
public class Car{
   ...
}

然后我有我的配置类,它通过注解 @ComponentScan 告诉 Spring 容器在哪里寻找 bean

@Configuration
@ComponentScan
public class AppConfig {
   ...
}

Spring 是否会自动创建一个上下文来加载我所有的 bean?还是我必须以编程方式创建它?如果是这样,我该怎么做?

@Configuration
@ComponentScan
public class AppConfig {
   ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
   context.getBean(Car.class);
   ...
}

即使这样做,也可能会出现问题,因为每次我需要上下文时,我都必须调用 new AnnotationConfigApplicationContext... 实例化上下文并使他在整个项目中可用的推荐方法是什么,可能作为 Spring Boot 应用程序中的一个 bean,我可以在其中自动装配它。

Spring Boot 如何初始化它,加载所有 bean 并让上下文作为 bean 可用,准备好自动装配?

【问题讨论】:

    标签: spring spring-boot applicationcontext


    【解决方案1】:

    ,如果您有一个简单且基本的 Spring Core 应用程序,则应用程序上下文不会自动实例化。此外,如果您没有使用 @Configuration 类显式创建 Spring Container/Context,您的 @Configuration 类将不会扫描任何内容,也不会创建任何 bean。

    有几种创建应用程序上下文的方法,但最流行和最传统的方法是:

    • ApplicationContext context = new ClassPathXmlApplicationContext(applicationContext.xml) - 暗示您的容器配置在 applicationContext.xml 文件中;
    • ApplicationContext context = new AnnotationConfigApplicationContext(ConfigClass.class); - 暗示您的 ConfigClass@Configuration 类。

    然而,如果您的 Spring Boot 应用程序带有 @SpringBootApplication 注释,那么 Application Context 将自动为您实例化,因为:

    @SpringBootApplication注解consists的:

    • @EnableAutoConfiguration - 启用 Spring Boot 的自动配置机制;
    • @ComponentScan - 启用 @Component 扫描应用程序所在的包;
    • @Configuration - 允许在上下文中注册额外的 bean 或导入额外的配置类。

    这将为您创建上下文。

    您可以通过 main 方法中的工厂方法获取 Spring Boot 创建的 Spring Context 的引用:SpringApplication.run(MainClass.class, args);

    这将返回对应用程序上下文的引用,您可以将其分配给如下变量:

    ApplicationContext context = SpringApplication.run(MainClass.class, args)
    

    【讨论】:

    • 非常感谢您的回复。那正是我所想。但我仍然不知道如何为整个项目提供上下文。我的意思是在通过您建议的一种方式创建它之后,我怎样才能像 Spring Boot 一样将它作为 bean 提供?
    • 您可以简单地让您的类实现ApplicationContextAware,然后将上下文与@Autowire ApplicationContext context 自动关联为您类中的一个字段。您还可以将 run 方法返回的引用保存在 bean 中的某处或您希望的任何位置。有几种方法。此外,当您发现有帮助的答案时,请使用 upvote 并接受,而不是说“谢谢”文本。
    • 我没有运行...因为我使用的是 Spring 核心。所以我每次需要应用程序上下文时都必须实现ApplicationContextAware?这似乎是有线的...... Spring Boot 是如何做的?使用spring boot,我可以通过自动装配来访问ApplicationContext,而无需做任何特别的事情……Spring Boot在后台使用ApplicationContextAware吗?
    • 我无法仅通过对 Stackoverflow 的评论来解释整个 SpringBoot 架构,但我在回答中为您提供了所需的最低知识。为什么你认为实现 ApplicationContextAware 很奇怪?这是实现您想要的合法且流行的方式。如果您使用的是 Spring MVC 或 Spring Boot,则不需要,因为它们带有预配置的上下文。
    • 好的,我找到了我要找的东西...谢谢您的帮助! “在较新的版本中,使用注释可能会更好,而不是实现特定于 spring 的接口”在这里找到stackoverflow.com/a/21553322/6783371
    猜你喜欢
    • 2015-08-28
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    • 2016-06-08
    相关资源
    最近更新 更多