Как работает Spring @Autowired? - PullRequest
       25

Как работает Spring @Autowired?

47 голосов
/ 21 августа 2010

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

public class EmpManager {
   @Autowired
   private EmpDao empDao;
}

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

Ответы [ 4 ]

41 голосов
/ 21 августа 2010

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

7 голосов
/ 21 августа 2010

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

Check ReflectionTestUtils , что очень удобно для написания юнит-тестов.

4 голосов
/ 28 января 2013

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

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

  • Чтобы вручную объявить ваши bean-компоненты в XML-файле applicationContext:

  • Чтобы использовать автоматическое обнаружение, указав следующие строки в файле контекста:

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

например:

@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();
}
...
}

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

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

1 голос
/ 21 августа 2010

Spring использует API CGLib для автоматического внедрения зависимостей.


Ссылки

Дальнейшее чтение

...