Как работает аннотация Spring @Autowired?

Я наткнулся на пример @Autowired:

public class EmpManager {
   @Autowired
   private EmpDao empDao;
}

Мне было любопытно, как empDao получает наборы, так как нет методов установки, и он является закрытым.

Ответ 1

Java позволяет отключить контроль доступа к полю или методу (да, сначала нужно пройти проверку безопасности) с помощью метода AccessibleObject.setAccessible(), который является частью структуры отражения (как Field, так и Method наследуется от AccessibleObject). После того, как поле может быть обнаружено и записано, сделать это довольно просто; просто простой вопрос программирования.

Ответ 2

Java позволяет вам взаимодействовать с частными членами класса посредством отражения.

Проверьте ReflectionTestUtils, что очень удобно для написания модульных тестов.

Ответ 3

Нет необходимости в установщике, вам просто нужно объявить класс EmpDao с аннотацией @component, чтобы Spring идентифицировал его как часть компонентов, содержащихся в ApplicationContext...

У вас есть 2 решения:

  • Чтобы вручную объявить ваши bean-компоненты в XML файле applicationContext:
<bean class="package.EmpDao" />
  • Чтобы использовать автоматическое обнаружение, указав эти строки в файле контекста:
<context:component-scan base-package="package" />
<context:annotation-config />

И чтобы использовать аннотацию Spring для объявления классов, которыми ваш контейнер Spring будет управлять как компоненты:

@Component
class EmpDao {...}

И аннотировать свою ссылку @Autowired:

@Component (or @Controller, or @Service...)
class myClass {

// tells the application context to inject an instance of EmpDao here
@Autowired
EmpDao empDao;


public void useMyDao()
{
    empDao.method();
}
...
}

Автопроводка происходит путем помещения экземпляра одного компонента в нужное поле в экземпляре другого компонента. Оба класса должны быть компонентами, т.е. они должны быть определены для использования в контексте приложения.

Spring знает о существовании bean-компонентов EmpDao и MyClass и автоматически создает экземпляр экземпляра EmpDao в MyClass.