Configuração do projeto com o Spring
Índice
1. A configuração deve ser específica do ambiente
A configuração deve ser específica do ambiente - isso é apenas um fato da vida. Se esse não fosse o caso, então não seria configuração e nós apenas codificaríamos os valores no código.
For a Spring application there are several solutions you can use - desde soluções simples até alternativas super flexíveis e altamente complexas.
Uma das soluções mais comuns e diretas é um uso flexível deproperties filesefirst class property support provided by Spring.
Como prova de conceito, para os fins deste artigo, vamos dar uma olhada em um tipo específico de propriedade - a configuração do banco de dados. Faz todo o sentido usar um tipo de configuração de banco de dados para produção, outro para teste e outro para um ambiente de desenvolvimento.
2. Os arquivos.properties para cada ambiente
Vamos começar nossa Prova de Conceito - definindo os ambientes que queremos atingir:
-
Dev
-
Estadiamento
-
Produção
A seguir - vamos criar 3 arquivos de propriedades - um para cada um desses ambientes:
-
persistence-dev.properties
-
persistence-staging.properties
-
persistence-production.properties
Em um aplicativo Maven típico, eles podem residir emsrc/main/resources, mas onde quer que estejam, precisarão seravailable on the classpath quando o aplicativo for implementado.
Uma nota importante -having all properties files under version control makes configuration much more transparente reproduzível. Isso é contrário a ter as configurações em disco em algum lugar e simplesmente apontar o Spring para elas.
3. A Configuração Spring
No Spring, incluiremos o arquivo correto com base no ambiente:
Obviamente, o mesmo pode ser feito com a configuração Java:
@PropertySource({ "classpath:persistence-${envTarget:dev}.properties" })
Essa abordagem permite a flexibilidade de ter vários arquivos*.properties paraspecific, focused purposes. Por exemplo - no nosso caso, a configuração de persistência do Spring importa as propriedades de persistência - o que faz todo o sentido. A configuração de segurança importaria propriedades relacionadas à segurança e assim por diante.
4. Definindo a propriedade em cada ambiente
O warwill contain all properties files final, implantável - para persistência, as três variantes depersistence-.properties. Como os arquivos são nomeados de maneira diferente, não há medo de incluir acidentalmente o errado. Iremos definir * a variávelenvTarget e, assim, selecionar a instância que queremos das múltiplas variantes existentes.
A variávelenvTarget pode ser definida no sistema operacional / ambiente ou como um parâmetro para a linha de comando da JVM:
-DenvTarget=dev
5. Teste e Maven
Para testes de integração que precisam de persistência ativada - vamos simplesmente definir a propriedadeenvTarget no pom.xml:
org.apache.maven.plugins
maven-surefire-plugin
h2_test
O arquivopersistence-h2_test.properties correspondente pode ser colocado emsrc/test/resources para que sejaonly be used for testing e não desnecessariamente incluído e implantado com o war em tempo de execução.
6. Indo além
Existem várias maneiras de criar flexibilidade adicional nessa solução, se necessário.
Uma delas é usarmore complex encoding for the names dos arquivos de propriedades, especificando não apenas o ambiente em que serão usados, mas também mais informações (como o provedor de persistência). Por exemplo, podemos usar os seguintes tipos de propriedades:persistence-h2.properties,persistence-mysql.properties ou, ainda mais específico:persistence-dev_h2.properties,persistence-staging_mysql.properties,persistence-production_amazonRDS.properties.
A vantagem de tal convenção de nomenclatura - e éjust a convention, pois nada muda na abordagem geral - é simplesmente transparência. Agora fica muito mais claro o que a configuração faz apenas observando os nomes:
-
persistence-dev_h2.properties: o provedor de persistência para o ambientedev é um banco de dados H2 leve e na memória
-
persistence-staging_mysql.properties: o provedor de persistência para o ambientestaging é uma instância MySQL
-
persistence-production_amazon_rds.propertie: o provedor de persistência para o ambienteproduction é Amazon RDS
7. Conclusão
Este artigo discute uma solução flexível para fazer configurações específicas do ambiente no Spring. Uma solução alternativa usando perfiscan be found here.
A implementação da solução pode ser encontrada emthe GitHub project - este é um projeto baseado em Maven, portanto, deve ser fácil de importar e executar como está.