【问题标题】:About AnnotationConfigApplicationContext in Spring framework关于 Spring 框架中的 AnnotationConfigApplicationContext
【发布时间】:2019-06-01 19:06:55
【问题描述】:

我写了以下简单的独立spring app:

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 会自动连接(以及到哪个 bean?)

我观察到自动连接的ctx 获得了在 main() 中初始化的上下文。

基本上无法理解这些是如何自行自动装配的(以及它们的设置是什么?)

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

【问题讨论】:

    标签: java spring spring-ioc


    【解决方案1】:

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

    并且在创建MainDirver bean 之后,如果该字段带有@Autowird 注释,Spring 将随后将其他bean 注入其字段。所以在这种情况下,EnvironmentApplicationContextConfigurableEnvironment 都注入了​​这个 MainDirver bean。

    附言您可以认为 EnvironmentApplicationContextConfigurableEnvironment 是一种必须创建的 Spring 基础结构 bean,即使您没有使用 @Configuration@Service@Bean 等定义它们。 em>

    【讨论】:

    • 感谢您的回答。但是我仍然有这个疑问 ApplicationContext 自动连接到的类型是什么?这部分我还是看不懂。
    • @CuriousMind , ApplicationContext 的类型在这种情况下是AnnotationConfigApplicationContext,因为您使用这种类型创建它。如果你在接口上注解@Autowired,它将注入所有实现相同接口的bean。所以你甚至可以通过注解@Autowired来注入一个List<SomeInterface>,然后所有实现SomeInterface的bean都会被注入到这个列表中
    猜你喜欢
    • 2013-09-05
    • 1970-01-01
    • 2012-05-20
    • 2012-01-04
    • 2013-05-03
    • 2014-01-27
    • 2012-06-08
    • 1970-01-01
    • 2014-01-01
    相关资源
    最近更新 更多