Об AnnotationConfigApplicationContext в среде Spring - PullRequest
0 голосов
/ 01 июня 2019

Я написал следующее простое автономное весеннее приложение:

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 ().

Что я не могу понять, почему Environment, ApplicationContext и ConfigurableEnvironment получают Autowired (и к какому бину?)

Я заметил, что autowired ctx получает контекст, который инициализируется в main ().

По сути, не в состоянии понять, как они автоматически подключаются (и для чего они установлены?)

Любая помощь в понимании этого была бы очень полезна.

1 Ответ

1 голос
/ 01 июня 2019

Любой класс, помеченный @Configuration, также является компонентом Spring. Это означает, что MainDirver также является пружинным компонентом, который будет создан во время создания AnnotationConfigApplicationContext.

И после создания компонента MainDirver Spring затем внедрит другие компоненты в свое поле, если это поле помечено @Autowird. Таким образом, в этом случае Environment, ApplicationContext и ConfigurableEnvironment все вводятся в этот компонент MainDirver.

P.S. Вы можете думать, что Environment, ApplicationContext и ConfigurableEnvironment являются разновидностями инфраструктурных компонентов Spring, которые необходимо создавать, даже если вы не определяете их с помощью @Configuration, @Service, @Bean и т. Д.

...