java - 关于Spring框架中的AnnotationConfigApplicationContext

标签 java spring spring-ioc

我编写了以下简单的独立 Spring 应用程序:

package com.example;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.Environment;

@Configuration
@ComponentScan(basePackages = { "com.example" })
@PropertySource(ignoreResourceNotFound = true, value = "classpath:/application.props")
public class MainDriver {

@Autowired
private Environment env;
@Autowired
private ApplicationContext ctx;
@Autowired
private ConfigurableEnvironment cenv;

public static void main(String[] args) {

    ApplicationContext ctx = new AnnotationConfigApplicationContext(MainDriver.class);
    MainDriver l = ctx.getBean(MainDriver.class);
    System.out.println("In main() the ctx is " + ctx);
    l.test();

}

public void test() {
    System.out.println("hello");
    System.out.println("env is " + env);
    System.out.println("cenv is " + cenv);
    System.out.println("ctx is" + ctx);
}
}

我了解到,在 main() 中,我们正在创建一个新的应用程序上下文,然后创建 Bean 并最终调用 test() 方法。

我无法理解 EnvironmentApplicationContextConfigurableEnvironment 如何获得 Autowired(以及哪个 bean?)

我观察到 Autowiring 的ctx获取了在main()中初始化的上下文。

基本上无法理解这些如何自行自动连接(以及它们设置了什么?)

任何有助于理解这一点的帮助都会有很大帮助。

最佳答案

任何用@Configuration注释的类也是一个Spring bean。这意味着 MainDirver 也是一个 spring bean,将在创建 AnnotationConfigApplicationContext 期间创建。

创建 MainDirver bean 后,如果该字段用 @Autowird 注解,Spring 会将其他 bean 注入(inject)到其字段中。因此在这种情况下,EnvironmentApplicationContextConfigurableEnvironment 都被注入(inject)到这个 MainDirver bean 中。

P.S.您可以认为 EnvironmentApplicationContextConfigurableEnvironment 是一种必须创建的 Spring 基础设施 bean,即使您没有使用 定义它们code>@Configuration@Service@Bean

关于java - 关于Spring框架中的AnnotationConfigApplicationContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56409650/

相关文章:

java - 如何在 Spring Boot @Async 中使用 ForkJoinPool?

java - 遍历数组

java - 无法懒惰地初始化角色集合,..无法初始化代理 - 无 session - JPA + SPRING

java - Mockito 测试 java 8 lambda Consumer API

java - 无法在 eclipse kepler 上安装 spring tools 4 ( sts 4 ) - 缺少要求

java - 将 Spring 服务 bean 注入(inject) JSF ManagedBean 时出现 NullPointerException

java - 在 spring-boot 启动时调用服务的最佳方式是什么?

java - Spring DI 在运行时而不是编译时解决依赖的优点在基于 Java 的配置中丢失了吗?

java - Spring bean 范围 : session and globalSession

java - Spring Security 自定义过滤器