Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring, как сделать чтобы проперти были проинициализ. до момента использования бина. / 9 сообщений из 9, страница 1 из 1
10.01.2013, 10:20:43
    #38104458
Usik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring, как сделать чтобы проперти были проинициализ. до момента использования бина.
Есть контекст в котором описаны бины, работающие с сущностями.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
 <!-- CityEntity -->
    <bean id="cityDaoImpl" class="CityDaoImpl">
        <property name="sessionFactory" ref="mySessionFactory"/>
    </bean>

    <bean id="cityService" class="CityServiceImpl">
        <property name="cityDao" ref="cityDaoImpl"/>
    </bean>

    <!-- CountryEntity -->
    <bean id="countryDaoImpl" class="CountryDaoImpl">
        <property name="sessionFactory" ref="mySessionFactory"/>
    </bean>

    <bean id="countryService" class="CountryServiceImpl">
        <property name="countryDao" ref="countryDaoImpl"/>
    </bean>

    <!-- ServiceDirector -->
    <bean id="serviceDirector" class="ServiceDirector">
        <property name="cityService" ref="cityService"/>
        <property name="countryService" ref="countryService"/>
    </bean>



Класс ServiceDirector включает в себя все сервисы по работе с сущностями. ServiceDirector инжектится в другие бины и контроллеры.

Например какой-то класс EntityInitor использует этот ServiceDirector. Проблема в том что сервисы, в данном примере cityService и countryService не успевают проинициализироваться до момента использования экземпляра ServiceDirector. А вот в контроллерах ServiceDirector все подтянул и там все ок. Вопрос, как сделать так чтобы до момента первого использования ServiceDirector все проперти в нем были уже проинициализированы?
...
Рейтинг: 0 / 0
10.01.2013, 10:34:20
    #38104471
am_sasa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring, как сделать чтобы проперти были проинициализ. до момента использования бина.
UsikПроблема в том что сервисы, в данном примере cityService и countryService не успевают проинициализироваться до момента использования экземпляра ServiceDirector. ... момента первого использования ServiceDirector все проперти в нем были уже проинициализированы?
ничего не понял, что за первое использование и чем оно отличается от использование в контроллерах?
...
Рейтинг: 0 / 0
10.01.2013, 11:28:58
    #38104563
pavel_nv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring, как сделать чтобы проперти были проинициализ. до момента использования бина.
Каким образом создается экземпляр EntityInitor? и как в него инжектится ServiceDirector?
Надеюсь не оператором new ?)
...
Рейтинг: 0 / 0
10.01.2013, 11:34:39
    #38104573
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring, как сделать чтобы проперти были проинициализ. до момента использования бина.
UsikНапример какой-то класс EntityInitor использует этот ServiceDirector. Проблема в том что сервисы, в данном примере cityService и countryService не успевают проинициализироваться до момента использования экземпляра ServiceDirector.

У вас многопоточный сервер? В одном потоке создаётся контекст, а в другом вы его уже используете ещё до того как контекст инициализировался?
Странная немного ситуация, но всё же. Вот тут пример как ловить событие окончания инициализации контекста.
http://stackoverflow.com/questions/8686507/how-to-add-a-hook-to-the-application-context-initialization-event
Вообще если Spring котекст привязать к ServletContext, то инициализация будет происходить во время деплоймента, и сервер не будет напрвлять запросы в приложение до окончания деплоймента.



UsikА вот в контроллерах ServiceDirector все подтянул и там все ок. Вопрос, как сделать так чтобы до момента первого использования ServiceDirector все проперти в нем были уже проинициализированы?
Покажите как именно "класс EntityInitor использует этот ServiceDirector".
...
Рейтинг: 0 / 0
10.01.2013, 11:34:49
    #38104574
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring, как сделать чтобы проперти были проинициализ. до момента использования бина.
pavel_nvКаким образом создается экземпляр EntityInitor? и как в него инжектится ServiceDirector?
Надеюсь не оператором new ?)
+1
...
Рейтинг: 0 / 0
10.01.2013, 12:49:12
    #38104692
Usik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring, как сделать чтобы проперти были проинициализ. до момента использования бина.
EntityInitor это простой класс не бин. В конструкторе которого передается экземпляр ServiceDirector. Вот так сделано. Я думал что в методе public void afterPropertiesSet() ServiceDirector будет проинициализирован, так и есть он не null, я думал что и все его проперти будут не null, но они null. Если же я в ServiceDirector буду юзать анотации @Autowired, а не xml, то часть сервисов не null, а при использовании xml подхода они все null. Вот...

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
@Component
public class InitFactory  implements InitializingBean{
 @Autowired
 private ServiceDirector serviceDirector;

  @Override
    public void afterPropertiesSet() throws Exception {
      EntityInitor initor=new EntityInitor(serviceDirector);
      initor.init();
    }
}
...
Рейтинг: 0 / 0
10.01.2013, 13:33:00
    #38104765
pavel_nv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring, как сделать чтобы проперти были проинициализ. до момента использования бина.
А если этот код,который, я так понимаю и проверяет на null, в обычном методе компонента InitFactory вызвать?
Код: java
1.
2.
EntityInitor initor=new EntityInitor(serviceDirector);
initor.init();



Ведь, на сколько я понимаю,
Код: java
1.
2.
@Override
public void afterPropertiesSet() throws Exception


вызывается в момент создания текущего бина, и не факт что вся иерархия зависимых бинов полностью инициализирована, ему достаточно что "первые" предки созданы (ведь их свойства можно установить и позже)?
...
Рейтинг: 0 / 0
10.01.2013, 13:37:11
    #38104773
pavel_nv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring, как сделать чтобы проперти были проинициализ. до момента использования бина.
Да и в xml определении его вроде как надо прямо указывать
Код: xml
1.
2.
<bean id="exampleBean" 
         class="examples.ExampleBean" init-method="init"/>
...
Рейтинг: 0 / 0
10.01.2013, 13:40:28
    #38104777
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring, как сделать чтобы проперти были проинициализ. до момента использования бина.
Можно ещё @PostConstruct попробовать. Но я что-то не могу найти документального подтверждения что кто-то из них вызывается после окончательной инициализации зависимостей. Везде пишут что они взаимозаменяемы.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring, как сделать чтобы проперти были проинициализ. до момента использования бина. / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]