В чем разница между установкой @Autowired на переменную и методом?

Class A {

   private B instanceB;

   @Autowired
   public setInstanceB(B instanceB) {
     this.instanceB = instanceB;
   }

}

Выше одного против этого.

Class A {

   @Autowired
   private B instanceB;

   public setInstanceB(B instanceB) {
     this.instanceB = instanceB;
   }

}

Будет ли поведение отличаться в зависимости от модификатора доступа?

Ответ 1

Разница заключается в том, что сеттер будет вызываться, если вы его поместите, что полезно, если оно делает другие полезные вещи, проверку и т.д. Обычно вы сравниваете:

public class A {
  private B instanceB;

  @Autowired
  public setInstanceB(B instanceB) {
    this.instanceB = instanceB;
  }
}

против

public class A {
  @Autowired
  private B instanceB;
}

(т.е. нет сеттера).

Во-первых, предпочтительнее в этой ситуации, поскольку отсутствие сеттера затрудняет издевательство/модульное тестирование. Даже если у вас есть сеттер, но autowire член данных, вы можете создать проблему, если сеттер сделает что-то другое. Это приведет к недействительности тестирования вашего устройства.