Я написал следующее простое автономное весеннее приложение:
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().
В основном не в состоянии понять, как они автоматически подключаются сами по себе (и на что они настроены?)
Любая помощь в понимании этого будет очень полезна.




Любой класс, помеченный @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 и т. д.
@CuriousMind, тип ApplicationContext в данном случае AnnotationConfigApplicationContext, поскольку вы создаете его с этим типом. Если вы аннотируете @Autowired на интерфейсе, он внедрит все bean-компоненты, которые реализуют тот же интерфейс. Таким образом, вы даже можете внедрить List<SomeInterface> с помощью аннотации @Autowired, тогда все bean-компоненты, реализующие SomeInterface, будут добавлены в этот список.
Спасибо за Ваш ответ. Однако у меня все еще есть сомнения, что это за тип, к которому ApplicationContext автоматически подключается? Эту часть я до сих пор не могу понять.