Как весенняя загрузка внедряет экземпляр ApplicationContext и JdbcTemplate, используя @Autowired без аннотации @Component и конфигурации xml? - PullRequest
2 голосов
/ 27 апреля 2020

Я нахожусь в тестовом контроллере сборки приложений с весенней загрузкой. Я обнаружил, что в исходном коде ApplicationContext и JdbcTemplate эти 2 класса не имеют никакой аннотации. Но они могут быть корректно вставлены в конструктор. Я не использую какой-либо файл конфигурации, такой как 'applicationContext. xml'. Когда эти 2 класса сканируются контейнером spring io c?

обновление: я разделил @SpringBootApplication на @ Configuration,@EnableAutoConfiguration,@ComponentScan.And, затем удалил @ EnableAutoConfiguration, инъекция все еще работает, почему?

@SpringBootApplication
@RestController
@CrossOrigin
@Validated
@RequestMapping(value = "/demo")
public class DemoController {
private ApplicationContext applicationContext;
private JdbcTemplate jdbcTemplate;
@Autowired
public DemoController(ApplicationContext applicationContext, JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
        this.applicationContext = applicationContext;
}}

Ответы [ 2 ]

2 голосов
/ 27 апреля 2020

Вот основные цели загрузки Spring

  • Избегайте сложной XML конфигурации в Spring
  • Разрабатывайте готовые к использованию приложения Spring проще,
  • сокращайте разработку время и запуск приложения независимо
  • Предложите более простой способ начать работу с приложением

Пружинная загрузка через концепцию начальных зависимостей работает в configuration by exception.

Он автоматически настраивает приложение Spring на основе зависимостей JAR, добавленных в проект.

Например, с starter-jdbc вы можете автоматически вводить JdbcTemplate без какой-либо конфигурации xml.

с starter-test, который вы автоматически получили в своем классе, эти библиотеки Spring Test, JUnit, Hamcrest, and Mockito

с starter-mail у вас есть готовый боб JavaMail, который вы можете впрысните в свои услуги ...

И так далее ...

Все эти волхвы c поставляются с этой аннотацией @EnableAutoConfiguration

Эта аннотация запускает автоматическая настройка контекста приложения Spring, попытка угадать и настроить bean-компоненты, которые вам, вероятно, понадобятся. Классы автоконфигурации обычно применяются в зависимости от вашего пути к классам.

При использовании @SpringBootApplication автоматическая конфигурация контекста включается автоматически, и поэтому добавление этой аннотации не имеет дополнительного эффекта.

2 голосов
/ 27 апреля 2020

Spring Boot выполняет много автоматической настройки.

Я предполагаю, что вы используете spring-data-jdb c или spring-data-jpa и там для JdbcTemplate автоматически настраивается.

ApplicationContext будет в любом случае, потому что это класс фабрики компонентов для программного доступа к компонентам.

Вы можете получить исходный код здесь: https://github.com/spring-projects/spring-boot

Самый интересный проект: spring-boot-autoconfigure, где происходит все маги c.

И там вы найдете JdbcTemplateConfiguration. java

@Configuration(proxyBeanMethods = false)
@ConditionalOnMissingBean(JdbcOperations.class)
class JdbcTemplateConfiguration {

    @Bean
    @Primary
    JdbcTemplate jdbcTemplate(DataSource dataSource, JdbcProperties properties) {
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
        JdbcProperties.Template template = properties.getTemplate();
        jdbcTemplate.setFetchSize(template.getFetchSize());
        jdbcTemplate.setMaxRows(template.getMaxRows());
        if (template.getQueryTimeout() != null) {
            jdbcTemplate.setQueryTimeout((int) template.getQueryTimeout().getSeconds());
        }
        return jdbcTemplate;
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...