Как работает @autowired аннотация для частного поля?

Как работает аннотация @Autowired для частного поля без геттера и сеттера? Как spring может получить доступ к частному полю?

Ответ 1

Работает с отражением. Здесь вы можете найти пример того, как установить открытые поля. Но установка личных полей не имеет большого значения для difference

Единственная разница с закрытым полем состоит в том, что вам нужно установить setAccessible, прежде чем вы сможете читать/писать в поле. Кроме того, этот метод может вызвать исключение SecurityException. Java Docs

Ответ 2

@Component
public class A(){}

@Component
public class B(){
@Autowired
private A a;
}

Spring создайте beans, упомянутый как @Component. здесь bean A будет создан первым, а так как B зависит от A, то выполняется инъекция A в B. нет необходимости в каких-либо сеттерах. просто @Component требуется. Spring использует CGLib для создания beans с использованием отражения.

Ответ 3

Три типа инъекций зависимостей

Существует не менее трех способов, с помощью которых объект может получить ссылку на внешний модуль:

вставка конструктора: зависимости предоставляются через конструктор классов.

инъекция сеттера: клиент предоставляет метод setter, который инжектор использует для инъекции зависимости.

инъекция интерфейса:. Зависимость предоставляет метод инжектора, который будет вводить зависимость в любой переданный ей клиент. Клиенты должны реализовать интерфейс, предоставляющий метод setter, который принимает зависимость.