Как работает внедрение зависимостей в Spring в этом утверждении? - PullRequest
1 голос
/ 14 октября 2019

Я узнаю о внедрении зависимостей в Spring, и у меня есть этот код:

    @Autowired
    private CamelContext context;

    @Autowired
    private Environment environment;

    @Autowired
    protected CamelContext createCamelContext(){

        return context;
    }

    ...
}

Я понимаю, что компонент контекста и среды внедряется в этот класс, но я не понимаю, что именновводится с помощью этого кода:

@Autowired
protected CamelContext createCamelContext(){

    return context;
}

Я не понимаю этот вид инъекции. Что именно здесь происходит? В чем разница между этим методом инъекции и этим простым методом без инъекции:

protected CamelContext createCamelContext(){

    return context;
}

Любая обратная связь будет оценена! Спасибо!

Ответы [ 2 ]

0 голосов
/ 14 октября 2019

Методы, отмеченные @Autowired, являются либо методами установки, либо методами конфигурации. Они вызываются после создания компонента и могут использоваться для инициализации. Все аргументы этих методов будут автоматически вставлены Spring. Из Spring javadoc :

Методы с автопроводкой

Методы Config могут иметь произвольное имя и любое количество аргументов;каждый из этих аргументов будет автоматически связан с соответствующим компонентом в контейнере Spring. Методы установки свойств бина фактически являются частным случаем такого общего метода конфигурации. Такие методы конфигурации не обязательно должны быть публичными.

Но в вашем случае createCamelContext() не имеет аргументов и не инициализируется. Поэтому я не вижу смысла объявлять этот метод.

0 голосов
/ 14 октября 2019

В этом сценарии @Autowired в значительной степени эквивалентно @Bean на createCamelContext и @Inject на context. Автоматическая установка bean-компонентов происходит по типу , если вы не дадите @Qualifier, поэтому ваш код в основном возьмет @Autowired/@Inject CamelContext context и будет искать CamelContext для заполнения пропущенного значения, которое будетнайти в соответствии с @Autowired/@Bean createCamelContext.

Разница между аннотированным createCamelContext и неаннотированным в том, что Spring не будет иметь этот метод в своих компонентах, и поэтому он не найдет метод, когдаищите от @Bean до @Inject.

. В вашем конкретном случае значение context будет искать CamelContext и находит его в виде createCamelContext. На этом этапе createCamelContext ищет значение context, которое составляет null. Возвращает это значение, которое вводится в context. Поэтому в любой момент времени ссылка на context или createCamelContext всегда должна давать null.

...