A anotação @PropertySource do Spring é usada para fornecer arquivos de propriedades ao Ambiente Spring. Esta anotação é usada com classes @Configuration
. A anotação Spring PropertySource é repetível, o que significa que você pode ter várias PropertySource em uma classe de configuração. Este recurso está disponível se estiver utilizando Java 8 ou uma versão superior.
Exemplo de PropertySource do Spring
Vamos rapidamente passar por uma aplicação spring simples onde iremos ler detalhes de configuração do banco de dados a partir do arquivo de propriedades e criar a conexão com o banco de dados. Vamos imprimir algumas informações de metadados do banco de dados no console. Crie um projeto maven simples e adicione as dependências do Spring e MySQL. Você também pode usar qualquer outro banco de dados para o exemplo, basta alterar as configurações conforme necessário.
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.6.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
A imagem abaixo mostra a estrutura final do nosso projeto, vamos passar por todos os componentes importantes um por um. Aqui está nossa classe para criar a Conexão com o Banco de Dados.
package com.journaldev.spring;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBConnection {
private String driverClass;
private String dbURL;
private String userName;
private char[] password;
private Connection con;
public DBConnection(String driverClass, String dbURL, String userName, char[] password) {
this.driverClass = driverClass;
this.dbURL = dbURL;
this.userName = userName;
this.password = password;
}
public Connection getConnection() {
if (this.con != null)
return con;
Connection con = null;
try {
System.out.println("Creating DB Connection");
Class.forName(driverClass);
con = DriverManager.getConnection(dbURL, userName, String.valueOf(password));
System.out.println("Successfully Created DB Connection");
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
this.con = con;
return con;
}
public void close() {
System.out.println("DBConnection close called");
if (this.con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
NOTA: Se estiver a criar uma aplicação do mundo real, pode utilizar o Spring ORM. Desta forma, o Spring irá cuidar da gestão da ligação à base de dados e você pode concentrar-se em escrever a lógica de negócio. Agora vamos criar a classe de Configuração do Spring onde iremos utilizar a anotação PropertySource
.
package com.journaldev.spring;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
@Configuration
@PropertySource("classpath:db.properties")
@PropertySource("classpath:root.properties")
public class DBConfiguration {
@Autowired
Environment env;
@Bean
public DBConnection getDBConnection() {
System.out.println("Getting DBConnection Bean for App: "+env.getProperty("APP_NAME"));
DBConnection dbConnection = new DBConnection(env.getProperty("DB_DRIVER_CLASS"), env.getProperty("DB_URL"), env.getProperty("DB_USERNAME"), env.getProperty("DB_PASSWORD").toCharArray());
return dbConnection;
}
}
Note que estou a carregar vários ficheiros de propriedades para o ambiente Spring. Vamos olhar para o conteúdo destes ficheiros de propriedades. db.properties
#Configurações de Base de Dados MYSQL
DB_DRIVER_CLASS=com.mysql.jdbc.Driver
DB_URL=jdbc:mysql://localhost:3306/Test
DB_USERNAME=journaldev
DB_PASSWORD=journaldev
root.properties
APP_NAME=PropertySource Example
Vamos criar a classe principal e obter os detalhes da base de dados.
package com.journaldev.spring;
import java.sql.Connection;
import java.sql.SQLException;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class SpringMainClass {
public static void main(String[] args) throws SQLException {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.scan("com.journaldev.spring");
context.refresh();
DBConnection dbConnection = context.getBean(DBConnection.class);
Connection con = dbConnection.getConnection();
System.out.println(con.getMetaData().getDatabaseProductName());
System.out.println(con.getMetaData().getDatabaseProductVersion());
// fechar o contexto Spring
context.close();
}
}
Basta executar a classe acima como aplicação Java, irá produzir a seguinte saída.
Getting DBConnection Bean for App: PropertySource Example
Creating DB Connection
Successfully Created DB Connection
MySQL
5.7.18
DBConnection close called
Para melhor legibilidade, removi as mensagens de depuração produzidas pelo registo de primavera na consola.
Primavera @PropertySource Múltiplos Ficheiros – @PropertySources
Existe outra forma de carregar múltiplos ficheiros de propriedades para uma classe de configuração.
@PropertySources({
@PropertySource("classpath:db.properties"),
@PropertySource("classpath:root.properties")})
public class DBConfiguration {
}
A partir do Java 8 em diante, a anotação PropertySource tornou-se repetível. Para versões anteriores do Java, @PropertySources
era a maneira de fornecer vários arquivos de propriedades para a classe de configuração.
Substituição de Valores de Propriedades da Spring PropertySource
Podemos carregar vários arquivos de propriedades para o ambiente do Spring. Se existirem chaves iguais em vários arquivos, então o último arquivo de propriedades carregado irá substituir os valores anteriores. Portanto, se estiver obtendo valores indesejados para sua propriedade, verifique se a mesma chave está presente em qualquer outro arquivo de propriedades e qual é a ordem de carregamento desses arquivos de propriedades.
Arquivo Externo da Spring PropertySource
Às vezes, nossos arquivos de configuração estão localizados em um local específico e não fazem parte do classpath do projeto. Podemos configurar o PropertySource para carregar arquivos de propriedades do sistema de arquivos também.
@PropertySource("file:/Users/pankaj/db.properties")
Variável de Ambiente da Spring PropertySource
Observe que a configuração acima para ler o arquivo de propriedades de uma localização externa funcionará para o meu sistema local, mas não para outra pessoa ou no servidor. Também podemos ler variáveis do sistema em PropertySource, então a configuração abaixo funcionará para todos.
@PropertySource("file:${HOME}/db.properties")
Spring PropertySource ignora FileNotFoundException
Se o arquivo de propriedades não for encontrado, então teremos uma FileNotFoundException
. Às vezes, não queremos lançar uma exceção porque nossa aplicação pode funcionar com valores padrão também. Podemos usar ignoreResourceNotFound
em PropertySource, definindo true
, para informar ao framework Spring que não deve lançar exceção se o arquivo não for encontrado.
@PropertySource(value = "classpath:root.properties", ignoreResourceNotFound=true)
Isso conclui o exemplo de Spring PropertySource. Você pode conferir o código-fonte e o projeto Maven em nosso Repositório GitHub.
Source:
https://www.digitalocean.com/community/tutorials/spring-propertysource