Definir ordem de execução dos @ApplicationScoped

Boa tarde.

Eu pesquisei sobre esse assunto e não consegui encontrar nada parecido com o que eu preciso.

Eu tenho 3 classes @ApplicationScoped, mas eu precisava definir uma ordem de execução para elas. É possível fazer isso?

A alternativa que eu encontrei foi de criar um @ApplicationScoped que instancia as 3 classes na ordem correta. Mas está horrível isso.

Obrigado, desde já.

se uma classe depende da inicialização da outra tem alguma coisa de meio errado…

mas em todo caso vc consegue definir a ordem recebendo a outra classe no construtor: se eu quero que A rode antes de B, é só a B receber a A no construtor.

Hmmm… O que seria de errado? Esse acoplamento, você diz? Existe alguma saída para esse problema, de forma certa?

depende :wink:

se uma classe depende da execução da outra sem depender dela diretamente, existe um acoplamento escondido que pode gerar bugs estranhos… mas depende muito do caso.

A solução “certa” pra isso depende do problema. A solução gambiarra é forçar essa ordem pelos construtores, do jeito que eu falei na mensagem anterior…

se quiser explicar o porque dessa necessidade, posso ver se tem outra alternativa

Bom,

o primeiro @ApplicationScoped que tem que rodar é um que captura um arquivo .properties com algumas configurações do sistema.
até agora ele só serve para definir a formatação monetária (R$, separador de decimal, separador de milhar)

Ele tem que rodar antes do provider de Relatórios, que tem que rodar depois do provider de SessionFactory.

Os reports, quando inicializados (à partir de uma série de arquivos xml em uma pasta) já têm definido o tipo de formatação monetária quando o campo for CURRENCY. Ele também inspeciona o banco de dados para capturar algumas informações sobre a tabela (tamanho do campo, se é nullable ou não e mais outras coisas). Então ele depende de uma SessionFactory e desses parâmetros, caso nenhuma formatação seja definida.

A ordem fica assim:
ParametersProvider
SessionFactoryProvider
ReportProvider

Esta meio confusa a explicação… Deu para entender?

Cada um desses caras é um ComponentFactory, certo?

Não é só o ReportProvider receber no construtor os Parameters e a SessionFactory?

isso já garante essa ordem.

Não, só o SessionFactory.

Eu acho que não é uma boa prática, mas os Parametros e os Reports setam uma variável estática para que eu possa acessar sempre o mesmo valor. Mas eu preciso da inicialização por construtor por causa da minha dependência com o ServletContext para capturar a pasta onde se encontram esses arquivos de configurações…

Ele recebe só o SessionFactory, pois os parametros são acessados via métodos estáticos.

Você está dentro de um ambiente de injeção de dependências, não deveria acessar coisas estaticamente :wink:

mude isso pra receber essa variável estática pelo construtor.

Hmmm… Vou fazer isso!

Mas eu preciso injetar uma Lista ou um Set com vários Reports, como é feito isso?

Cria uma classe Parameters @ApplicationScoped que tem o getReports()

e getters pra tudo que vc tava acessando estaticamente.