Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Spring&Wicket: использование Autowired вне Bean'ов


Автор: AJetman 16.8.2009, 18:13
Являюсь новичком в Java и J2EE, раньше имел дело с только PHP. 

Создаю сайт на базе Apache Wicket и решил разобраться с Spring и IoC. В Wicket уже имеется интеграция с Spring, поэтому с этим вопросов нет. Интересует следующее:

1. У меня есть сервис UserDao, реализующий работу с базой данных (через JpaDaoSupport Spring'a). Он объявлен как Bean в файле настроек applicationContext.xml.
2. Для вывода списка пользователей на экран в Wicket предусмотрен компонент DataView. Для DataView необходимо объявить класс, реализующий интерфейс IDataProvider (т.е. DataView генерирует список на основе данных от IDataProvider). Это тоже имеется - назвал UserDataProvider, который обращается к UserDao за необходимой информацией.
Код

public class UserDataProvider implements IDataProvider {
    @Autowired
    private IUserDao userDao;
...

В Wicket'e используется так:
Код

public class BackendUserListPage extends BasicPageTemplate {
    ...
    public BackendUserListPage(final PageParameters parameters) {
        DataView<UserEntity> view = new DataView<UserEntity>("UsersList", new UserDataProvider(), 50) {
            @Override
            protected void populateItem(Item<UserEntity> item) {
...

3. В файле настроек applicationContext.xml добавил след. строки, чтобы Spring анализировал мой код на аннотации:
Код

    <context:annotation-config />
    <context:component-scan base-package="МоеНазваниеPackage" />


При создании нового экземляра UserDataProvider поле userDao не инициализируется Spring'ом. 

Пока нашел решение, что в Wicket можно в конструкторе UserDataProvider написать так:
Код

    public UserDataProvider() {
        InjectorHolder.getInjector().inject(this);
    }


Но это, как понимаю, не совсем верное решение...

Вопросы:
1. Аннотации Spring работают только для его Bean'ов?
2. Что мне делать с UserDataProvider, чтобы использовать IUserDao без этого инъектора? 

Возможно, я просто не до конца понял принцип IoC и Spring - поясните, пожалуйста.

Автор: AJetman 28.8.2009, 01:03
Видимо это больше вопрос для Springвцев, т.к. как я понял Autowired нельзя применять для свойств обычных классов, а только для Bean'ов, так?

Автор: MisterCleric 28.8.2009, 10:19
Цитата

нельзя применять для свойств обычных классов, а только для Bean'ов


Можно, если ты его пометишь как @Configurable и объявишь в конфиге как:
Код

<bean id="beanId" class="BeanClass" abstract="true">


и добавишь

Код

<aop:spring-configured />


Смысл типа заключается в чем: Spring создает динамический прокси для твоего класса и каждый раз при вызове конструктора твоего класса возвращается тебе проинджекшеный прокси.
Почитай, попробуй...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)