Alterar a ordem de pós-processamento dos beans sem configuração explícita
-
11-12-2019 - |
Pergunta
Estou ciente do fato de que a ordem de carregamento do bean é implicitamente determinada por dependências e dependências transitivas.
Imagine que você tem um conjunto de beans anotados que fornecem algum tipo de metadados que você deseja aplicar a outro conjunto de AwareBeans.Assim, somente depois de reunir todos os metadados dos N beans, somente depois disso você poderá pós-processar o AwareBeans.Você normalmente usa org.springframework.beans.factory.config.BeanPostProcessor
para esse tipo de coisa.Como lidar com o pedido?Eu acho que mesmo configurando depends-on
explicitamente não tem precedência sobre as dependências quanto à ordem de carregamento, certo?
Existe uma interface org.springframework.core.Ordered
isso apenas determina a ordem dos beanPostProcessors que estão sendo aplicados, mas não a ordem dos beans.
eu poderia usar org.springframework.beans.factory.config.BeanFactoryPostProcessor
mas a definição do bean não possui informações suficientes antes da instanciação do bean.Por exemplo beanDef.getBeanClass()
retorna o nome da classe do bean etc.
Existe alguma outra maneira de você pensar em como fazer o que eu quero?
Solução 2
Eu resolvi isso usando org.springframework.beans.factory.config.BeanFactoryPostProcessor
e carregar classes pelo classloader para que eu possa usar o Reflection para obter as anotações.Eu acho que não deveria quebrar nada porque depois, quando o spring vai carregar a classe, o carregador de classe das classes de bean verifica se a classe já está carregada e, se estiver, não a carrega.Caso contrário, ele carrega.
Outras dicas
Você pode:
a) Injete todos os seus beans de metadados em seu BeanPostProcessor
.
b) Faça com que seu pós-processador busque ativamente todos os beans de metadados do contexto do aplicativo na inicialização.
Cada forma tem prós e contras, mas o efeito é o mesmo:depois BeanPostProcessor
pós-construção, cada bean de metadados também já será pós-construído.