Acessar o arquivo de propriedades programaticamente com o Spring?
Usamos o código abaixo para injetar Spring beans com propriedades de um arquivo de propriedades.
Existe uma maneira de acessar as propriedades programaticamente? Estou tentando fazer algum código sem injeção de dependência. Então, eu gostaria de ter apenas um código como este:
— Marcus Leon
Um exemplo completo de acesso ao arquivo de propriedades na primavera está no seguinte link: bharatonjava.wordpress.com/2012/08/24/…
Que tal PropertiesLoaderUtils ?
aqui é uma pergunta, como isso é diferente do meu, e tem mais dois votos e publicado segundo ...
— Zoidberg
Bate-me, eu não consegui votar :) Eu não usaria um PropertyPlaceholderConfigurer, embora seja um exagero para a tarefa.
— 22410 skaffman
Eu estava tentando chegar o mais perto possível do que ele tinha; fui criticado tantas vezes por não fornecer detalhes suficientes. De qualquer forma, suas respostas merecem os votos, pois está correto, acho que estou com ciúmes por não ter conseguido 2 votos também, risos.
o que devemos dar no caminho se o arquivo for colocado no diretório externo, digamos pasta de configuração?
— prnjn
Se tudo o que você deseja fazer é acessar o valor do espaço reservado a partir do código, existe a @Valueanotação:
Para acessar espaços reservados no SPEL, use esta sintaxe:
Para expor a configuração a visualizações com o SPEL desativado, pode-se usar este truque:
E, em seguida, use o expositor para expor propriedades a uma exibição:
Em vista, use as propriedades expostas como esta:
Esta solução tem a vantagem de poder confiar na implementação padrão de espaço reservado injetada pelo contexto: tag de propriedade-espaço reservado.
Agora, como observação final, se você realmente precisar capturar todas as propriedades de espaço reservado e seus valores, precisará canalizá-las através de StringValueResolver para garantir que os espaços reservados funcionem dentro dos valores da propriedade conforme o esperado. O código a seguir fará isso.
— anttix
Thnx para esta resposta muito completa! existe uma maneira de fazer isso com os campos finais?
@WardC, você não pode injetar em um campo final. No entanto, você pode injetar um argumento do construtor e definir um valor final do campo dentro do construtor. Consulte stackoverflow.com/questions/2306078/… e stackoverflow.com/questions/4203302/…
CREDIT : acesso programático às propriedades no Spring sem reler o arquivo de propriedades
Eu encontrei uma boa implementação de acessar as propriedades programaticamente na primavera sem recarregar as mesmas propriedades que a primavera já carregou. [Além disso, não é necessário codificar o local do arquivo de propriedades na origem]
Com essas alterações, o código parece mais limpo e mais sustentável.
O conceito é muito simples. Apenas estenda o espaço reservado de propriedade padrão da primavera (PropertyPlaceholderConfigurer) e capture as propriedades que ele carrega na variável local
Mudanças na configuração do Spring
Espero que isso ajude a resolver os problemas que você tem
— Ashok Koyi
Esta não é uma implementação completa e não funcionará corretamente. O PropertyPlaceholderConfigurer usa um PropertyPlaceholderHelper para substituir TODAS as propriedades do espaço reservado, incluindo espaços reservados aninhados. Na implementação do Kalinga, se você tiver algo como myFile = $ {myFolder} /myFile.txt, o valor da propriedade literal que você obterá do mapa usando a chave "myFile" será $ {myFolder} /myFile.txt.
Esta é a solução correta. Para abordar a preocupação de Brian. O $ {myFolder} deve ser uma propriedade do sistema e não estar no arquivo de propriedades. Isso pode ser resolvido com a propriedade do sistema tomcat ou a propriedade run configurada no eclipse. Você pode até ter uma propriedade de construção. Esta solução supõe que um pouco e deve abordar isso, mas ao mesmo tempo essa resposta é muito mais parecida com a prática padrão de carregar propriedades de primavera e java em um local, em vez de separadamente. Outra opção é carregar um arquivo de propriedades gerais com o myFile no arquivo e usá-lo para obter o restante.
Tentei aplicar esta solução alternativa ao 'novo' PropertySourcesPlaceholderConfigurer do Spring 3.1+, mas descobri que o método processProperties (ConfigurableListableBeanFactory beanFactory, props Properties) agora está obsoleto e, portanto, agora não há acesso ao argumento 'props'. Examinar as fontes do PropertySourcesPlaceholderConfigurer não encontrou uma maneira limpa de expor as propriedades. Alguma idéia para fazer isso? Obrigado!
— Jorge Palacio
Eu fiz isso e funcionou.
Você também pode usar os utilitários de mola ou carregar propriedades por meio do PropertiesFactoryBean.
Em seguida, você pode buscá-los em seu aplicativo com:
e use adicionalmente estas propriedades em sua configuração:
Isso também está nos documentos: http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#xsd-config-body-schemas-util-properties
— enkor
Crie uma turma como abaixo
Onde quer que você queira acessar uma propriedade, use
- escreve getters e setters na classe acessadora
— user1419261
De longe, a melhor resposta, deve apenas autowire Environment.
— sbochins
Como você sabe que as versões mais recentes do Spring não usam o PropertyPlaceholderConfigurer e agora usam outra construção de pesadelo chamada PropertySourcesPlaceholderConfigurer. Se você está tentando obter propriedades resolvidas do código e deseja que a equipe do Spring nos tenha fornecido uma maneira de fazer isso há muito tempo, vote nesta postagem! ... Porque é assim que você faz da nova maneira:
PropertySourcesPlaceholderConfigurer da subclasse:
Para usá-lo, use sua subclasse no seu @Configuration e salve uma referência a ele para uso posterior.
— TheJeff
Aqui está outra amostra.
— Venky
Isso me ajuda a:
— Ruzal Yumaev
Que pacote é o ApplicationContextUtils dentro
Isso resolverá quaisquer propriedades aninhadas.
— Sohan
Você pode obter suas propriedades através da Environmentclasse. Como está a documentação:
As propriedades desempenham um papel importante em quase todos os aplicativos e podem se originar de uma variedade de fontes: arquivos de propriedades, propriedades do sistema JVM, variáveis ​​de ambiente do sistema, JNDI, parâmetros de contexto do servlet, objetos ad-hoc Properties, mapas e assim por diante. A função do objeto de ambiente em relação às propriedades é fornecer ao usuário uma interface de serviço conveniente para configurar fontes de propriedades e resolver propriedades a partir delas.
Tendo o ambiente como uma envvariável, basta chamar:
Você pode obter suas propriedades "brutas" através de:
Ele pesquisará todas as fontes de propriedades registradas pela primavera.
Você pode obter o Ambiente através de:
injete ApplicationContext implementando ApplicationContextAwaree depois chamegetEnvironment() contexto
implementar EnvironmentAware.
É obtido através da implementação de uma classe porque as propriedades são resolvidas no estágio inicial da inicialização do aplicativo, pois podem ser necessárias para a construção do bean.
Leia mais sobre a documentação: Spring Environment documentation
— Augustin Ghauratto
Esta publicação também explica como acessar as propriedades: http://maciej-miklas.blogspot.de/2013/07/spring-31-programmatic-access-to.html
Você pode acessar as propriedades carregadas pelo spring property-placeholder sobre esse spring bean:
— Maciej Miklas
em servlet-context.xml depois você pode usar seu arquivo diretamente em qualquer lugar
Use o código abaixo em seu arquivo de configuração do Spring para carregar o arquivo do caminho da classe do seu aplicativo