2015-10-25 4 views
1

я последовал следующий пример внедрения зависимостей: http://www.tutorialspoint.com/spring/spring_autowired_annotation.htmКак инъекция зависимости создает экземпляр класса без конструктора?

Например, класс TextEditor (по ссылке выше):

public class TextEditor { 
    private SpellChecker spellChecker; 

    @Autowired 
    public void setSpellChecker(SpellChecker spellChecker){ 
     this.spellChecker = spellChecker; 
    } 
    public SpellChecker getSpellChecker() { 
     return spellChecker; 
    } 
    public void spellCheck() { 
     spellChecker.checkSpelling(); 
    } 
} 

Как инстанциируемый этих зависимостей/классы, в то время как у них нет любой конструктор?

Является ли Java просто созданием объекта такого типа, который пуст? Как пустой конструктор параметров без какого-либо кода?

Спасибо, что сделали это более ясным!

+2

класс без конструктора всегда имеет конструктор по умолчанию TextEditor в() – user

+1

я смотрю на этот пример, и я плакать. Утилизация сеттера обескуражена с первого дня программирования OO. Руководители весны заняли около 11 лет, чтобы понять это, но теперь они разобрались в своем действии (см. [Sidebar Constructor-based или setter-based DI?] (Http://docs.spring.io/spring/docs/ 4.0.x/весна-каркасный ссылка/html/beans.html # бобы сеттер-инъекция) – Augusto

ответ

3

Если не указано иное, каждый класс Java имеет конструктор по умолчанию. Итак, у вас есть конструктор по умолчанию public TextEditor(), хотя вы его не закодировали. (Вы могли бы закодировать его, если вам нужно было изменить его видимость от публики, объявить исключение и т. Д.)

Итак, весна вызывает этот конструктор по умолчанию - затем вызывает метод setSpellChecker (как аннотированный, так и через отражение) заполнить его.

2

Если конструктор не определен, класс может быть создан с помощью конструктора по умолчанию без аргументов.

Итак, структура вызывает этот конструктор (предположительно, используя отражение), а затем использует метод set для установки одного поля только что созданного класса.

2

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

Таким образом, в файле контекста у вас есть следующие строки:

<!-- Definition for spellChecker bean --> 
<bean id="spellChecker" class="com.tutorialspoint.SpellChecker"> 
</bean> 

это определяет класс со ссылкой spellChecker, что MAPPS к классу com.tutorialspoint.SpellChecker и когда компилятор найти такое свойство в способе, который помечен как @Autowired на экземпляр объекта, который он вводит/устанавливает соответствующую версию требуемой зависимости.

В тех случаях, когда свойство не соответствует ссылочному тегу в файле applicationContext.xml, Spring пытается сопоставить тип, например. свойство с именем mySpecialSpellChecker, которое имеет тип com.tutorialspoint.SpellChecker, по-прежнему будет отображаться в bean с id="spellChecker", если существует более одного типа Spring не будет создавать экземпляр вашего объекта, и вы можете получить ошибку времени компиляции, поскольку Spring не может знать, какая версия два (или более) являются правильными, поэтому для этого требуется вкладка разработчика.

Это порядок исполнения:

  1. Instantiate textEditor, это имеет конструктор по умолчанию, который не виден в коде public TextEditor()
  2. новый экземпляр установлен в пул доступных объектов со ссылкой textEditor
  3. экземпляр spellChecker и добавить в пул доступного объекта с соответствующей ссылкой/этикеткой
  4. все @Autowired свойства/методы установлены/называются с соответствующими объектами в этом случае весной называет: setSpellChecker(spellChecker)
Смежные вопросы