Об AnnotationConfigApplicationContext в среде 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().

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

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

В основном не в состоянии понять, как они автоматически подключаются сами по себе (и на что они настроены?)

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
5 934
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

Спасибо за Ваш ответ. Однако у меня все еще есть сомнения, что это за тип, к которому ApplicationContext автоматически подключается? Эту часть я до сих пор не могу понять.

CuriousMind 02.06.2019 07:41

@CuriousMind, тип ApplicationContext в данном случае AnnotationConfigApplicationContext, поскольку вы создаете его с этим типом. Если вы аннотируете @Autowired на интерфейсе, он внедрит все bean-компоненты, которые реализуют тот же интерфейс. Таким образом, вы даже можете внедрить List<SomeInterface> с помощью аннотации @Autowired, тогда все bean-компоненты, реализующие SomeInterface, будут добавлены в этот список.

Ken Chan 02.06.2019 09:53

Другие вопросы по теме