Я наткнулся на пример @Autowired
:
public class EmpManager {
@Autowired
private EmpDao empDao;
}
Мне было любопытно, как empDao
получает наборы, так как нет методов установки, и он является закрытым.
Я наткнулся на пример @Autowired
:
public class EmpManager {
@Autowired
private EmpDao empDao;
}
Мне было любопытно, как empDao
получает наборы, так как нет методов установки, и он является закрытым.
Java позволяет отключить контроль доступа к полю или методу (да, сначала нужно пройти проверку безопасности) с помощью метода AccessibleObject.setAccessible()
, который является частью структуры отражения (как Field
, так и Method
наследуется от AccessibleObject
). После того, как поле может быть обнаружено и записано, сделать это довольно просто; просто простой вопрос программирования.
Java позволяет вам взаимодействовать с частными членами класса посредством отражения.
Проверьте ReflectionTestUtils, что очень удобно для написания модульных тестов.
Нет необходимости в установщике, вам просто нужно объявить класс EmpDao
с аннотацией @component
, чтобы Spring идентифицировал его как часть компонентов, содержащихся в ApplicationContext...
У вас есть 2 решения:
<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
.
Spring использует CGLib API для обеспечения автономной инъекции зависимостей.