Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > JSF 2.0 Resource injection for @ApplicationScoped


Автор: vogdb 5.8.2010, 18:14
   Привет всем. Натолкнулся на странную штуку. Если иметь два бина с ApplicationScoped и один знает о другом через проперти, то получается так, что на самом деле не знает. Server в конструкторе имеет config == null. Никто не сталкивался? Есть ли решение?
Код

@ManagedBean(name = "config", eager=true)
@ApplicationScoped
public class Config {
...
}

@ManagedBean(name = "server")
@ApplicationScoped
public class Server {
   @ManagedProperty(value = "#{config}")
   private Config config;

   public Config getConfig() {
      return config;
   }

   public void setConfig(Config config) {
      this.config = config;
   }

   public ServerNavCntrl() {
      log.info("Initiated success. Config instance is " + config);
   }
...
}


Происходит это на jsf2.0.2 и glassfish3

Автор: powerOn 6.8.2010, 09:36
Цитата(vogdb @  5.8.2010,  19:14 Найти цитируемый пост)
Server в конструкторе имеет config == null. 


Вообще говоря, сначала происходит конструирование объекта, а только потом инъектирование зависимостей. Куда их инъектировать если объект еще не создан? А при создании объекта вызывается его конструктор. Короче говоря, если нужно сделать инициализацию, то смотрите аннотация @PostConstruct.

Автор: vogdb 6.8.2010, 10:44
Спасибо, в очередной раз помогаете =)

Автор: Старовъръ 6.8.2010, 21:11
Цитата
Вообще говоря, сначала происходит конструирование объекта, а только потом инъектирование зависимостей. Куда их инъектировать если объект еще не создан?
Совсем что-то не пойму. Если IoC видет инъекцию, то он инициализирует инъектируемый объект, а потом создает тот, куда сеттиться свойство, а потом только инъектит его. В JSF это происходит иначе?

Автор: powerOn 7.8.2010, 10:38
Цитата(Старовъръ @  6.8.2010,  22:11 Найти цитируемый пост)
Если IoC видет инъекцию, то он инициализирует инъектируемый объект, а потом создает тот, куда сеттиться свойство, а потом только инъектит его.


Я затрудняюсь сказать, чей конструктор вызывается первым: зависимости или объекта которому нужна эта зависимость (хотя это не сложно проверить).  Могу лишь утверждать, что не создав объект в него зависимость не внедрить. Вызов конструктор, как часть процесса создания объекты происходит раньше, чем ему будут просечены зависимости. Что вполне естественно. Инъекции через параметры конструктора, насколько мне известно в JSF нет.

Автор: Старовъръ 7.8.2010, 11:30
Если посмотреть на тот же Spring, он будет инициализировать все объекты, которые инжектятся, потом только те, в которые инжектятся и никак иначе. Любой IoC должен уметь разруливать зависимости. Мне кажется нужно все-таки искать ошибку где-то в другом месте.

Автор: powerOn 7.8.2010, 11:49
Цитата(Старовъръ @  7.8.2010,  12:30 Найти цитируемый пост)
Если посмотреть на тот же Spring, он будет инициализировать все объекты, которые инжектятся, потом только те, в которые инжектятся и никак иначе. Любой IoC должен уметь разруливать зависимости. Мне кажется нужно все-таки искать ошибку где-то в другом месте.



Старовъръ, автор топика не может получить ссылку на зависимость внутри конструктора. Вы и в Spring её не получите внутри конструктора, если конечно не будет использовано construncor injection.

Автор: Старовъръ 7.8.2010, 11:53
Оу, я прошу прощение, не заметил, что речь идет о конструкторе..

Автор: powerOn 7.8.2010, 11:55
Цитата(Старовъръ @  7.8.2010,  12:53 Найти цитируемый пост)
Оу, я прошу прощение, не заметил, что речь идет о конструкторе.. 

Ничего страшного, главное что ситуация прояснилась. smile

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