Да, кажется, невозможно автоматически связывать объекты в bean-объекты, которые наследуются от классов безопасности Spring.я не знаю, если это ошибка в весенней безопасности, или это сделано для безопасности или что.если у кого-то есть объяснение, мне было бы интересно его услышать.Однако вы можете решить свою проблему, вручную внедрив компоненты в конфигурацию xml (в отличие от использования аннотации @Autowired), и тогда они будут присутствовать.Одно слово предостережения, хотя ..
Я сделал это, и я заметил, что мой userDao, на котором были аннотации (в частности, @Transactional), больше не работал в транзакции.Мой userDao использовался в нескольких местах.Если я внедрил его в свой пользовательский AbstractUserDetailsAuthenticationProvider, он больше не работал в транзакции для любого другого класса, который его использовал.Удаление инъекции в пользовательский AbstractUserDetailsAuthenticationProvider восстановило функциональность транзакции для моего userDao при использовании другими объектами, которые ее получали (либо через @Autowired, либо вручную xml-инъекцию).
Итак, как я получил userDao в SpringКонтекст безопасности и до сих пор держать его @Transactional?Мне нужно было создать класс Factory:
public class UserDaoFactory {
private static UserDao userDao;
public static UserDao getUserDao() {
return UserDaoFactory.userDao;
}
public void setUserDao(UserDao userDao) {
UserDaoFactory.userDao = userDao;
}
}
Затем поместите этот и ваш dao два объекта в контейнер пружины:
<bean id="userDao" class="com.package.UserDaoImpl">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="userDaoFactory" class="com.package.UserDaoFactory">
<property name="userDao" ref="userDao" />
</bean>
Таким образом, userDao автоматически подключится к вашей userDaoFactory.Он будет иметь все свои возможности @Transactional (потому что весенняя безопасность не сняла его?).Затем в вашем весеннем объекте безопасности вы можете сделать:
userDao = UserDaoFactory.getUserDao();
Я реализовал ServletContextAware в моем собственном объекте AbstractUserDetailsAuthenticationProvider, чтобы выполнить вышеописанное один раз во время инициализации, и альт.
Итак, обратите внимание, что, хотя вы можете вручную внедрить ваш bean-компонент через конфигурацию xml в объект безопасности Spring для преодоления проблемы @Autowired, у вас будет новая проблема, если вы попытаетесь обернуть этот DAO в @Transactional..
теперь, может быть, кто-то знает, почему это может происходить.это может быть неправильная конфигурация с моей стороны (я признаю, что я не эксперт по пружинам), или это может быть особенностью весны.я хотел бы услышать, что кто-то должен сказать и как улучшить это все же.