Configuração Spring

7 respostas
M

Pessoal, vou começar um projeto agora em que estareu utilizando o SPRING. BOm, conheço mais ou menos o spring e sei que existe a possibilidade de configurar a base de dados no arquivo XML dele. Porém, o cliente pediu que o IP, o usuário e a senha do bando ficassem fora da aplicação, pois essas informações podem ser alteradas futuramente. Alguém sabe me dizer se existe a possibilidade de utilizar o spring, e manter um arquivo de configuração contendo as informações do banco fora da aplicação?
aguardo resposta

7 Respostas

R

Vc pode utilizar um arquivo do tipo properties.

Dai usa esse bean para o spring localizar o arquivo

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>/br/arquivo.properties</value>
            </list>
        </property>
    </bean>

Dai onde for ler o conteúdo, use ${propriedade_a_ser_lida_no_arquivo}

M

Boa tarde pessoal,
bom ainda estou tentando fazer a configuração do spring através de um arquivo .properties, mas até agora sem sucesso.
segue o meu applicationContext:

<bean
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<value>/siabm.properties</value>
		</property>
	</bean>

	<bean id="dataSouceConfig" destroy-method="close"
		class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName" value="${jdbc.driverClassName}" />
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
	</bean>
	<!-- Hibernate SessionFactory -->
	
	<bean id="entityManagerFactory"
		class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<property name="dataSource" ref="dataSouceConfig" />
		<property name="persistenceUnitName" value="siabmPU" />
		<property name="jpaVendorAdapter">
			<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
				<property name="database" value="POSTGRESQL" />
				<property name="showSql" value="true" />
				<property name="databasePlatform" value="org.hibernate.dialect.PostgreSQLDialect" />
			</bean>
		</property>
	</bean>
	<!--########################## TRANSAÇÕES ##########################-->
	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
		<property name="entityManagerFactory" ref="entityManagerFactory"></property>
	</bean>
	<tx:annotation-driven transaction-manager="transactionManager" />
	<!--############################ BEANS #############################-->
	<bean id="clienteDao" name="clienteDao"
		class="br.gov.persistencia.impl.ClienteDaoImpl" />

Minha classe:

public void connect() {
		try {
                        File file = new File("C:/Users/dsenv01/Workspace/TesteSpring/src/main/resources/applicationContext.xml");
			XmlBeanFactory factory = new XmlBeanFactory(new FileSystemResource(
					file));
			PropertyPlaceholderConfigurer cfg = new PropertyPlaceholderConfigurer();
			File file1 = new File("c:/arquivo/siabm.properties");
			cfg.setLocation(new FileSystemResource(
					file1));

			// now actually do the replacement
			cfg.postProcessBeanFactory(factory);

estou tentando fazer com que as tabelas do banco sejam geradas automaticamente também. Alguém pode me dizer o porque eu não estou conseguindo gerar as tabelas?
Preciso fazer mais algum coisa?
aguardo resposta

R

Para gerar as tabelas, colocaria esse código no bean=“SessionFactory”, mas com JPA não sei como funciona:

&lt;property name="hibernateProperties"&gt;
    		&lt;props&gt;
    			&lt;prop key="hibernate.dialect"&gt;org.hibernate.dialect.MySQLInnoDBDialect&lt;/prop&gt;
    			&lt;prop key="hibernate.show_sql"&gt;true&lt;/prop&gt;  
    			&lt;prop key="hibernate.hbm2ddl.auto"&gt;update&lt;/prop&gt;
    		&lt;/props&gt;
&lt;/property&gt;

Acho que esse caminho: C:/Users/dsenv01/Workspace/TesteSpring/src/main/resources/applicationContext.xml
o Spring não vai aceitar, vc precisa ter os arquivos dentro do projeto e setar o caminho dentro do projeto.

Esse, também não: c:/arquivo/siabm.properties
O arquivo properties vai ter que estar dentro do projeto.

private ApplicationContext aCtx = new ClassPathXmlApplicationContext("/main/resources/applicationContext.xml");

private ClienteDaoImpl clienteDaoImpl;

public void setClienteDaoImpl(ClienteDaoImpl clienteDaoImpl ) {

this.clienteDaoImpl  = clienteDaoImpl;

}

no método que vai utilizar o ClienteDaoImpl, faz assim:
clienteDaoImpl = (ClienteDaoImpl) aCtx.getBean(“clienteDao”);

Vc pode criar um método para carregar todos os beans, e no método main, chama ele.

M

Mas a idéia é que eu consiga ler um arquivo externo a aplicação e carregar as informações dele e passar para o spring, para não deixar preso ao código.
Sabe de alguma outra forma que eu possa resolver isso?

R

Da uma tentada assim, não garanto que vai funcionar, já fiz para pegar configuração de arquivo dentro da pasta Web-Inf em aplicação web, mas não testei em desktop.

Cria essa classe, para a leitura do arquivo:
public class LoadProperties implements ApplicationContextAware {

    private ApplicationContext applicationContext;

    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    public Properties getResourceAsProperties(final String url) throws Exception {
            Resource res = applicationContext.getResource(url);
            if (!res.exists() /*|| !res.isReadable()*/) {
                throw new IOException("Invalid Resource: [" + url
                                      + " | exists: " + res.exists()/*
                                      + " | isReadable: " + res.isReadable() + "]."*/);
             }
            Properties properties = new Properties();
            properties.load(res.getInputStream());
            return properties;
        }
   
}
Depois no arquivo applicationContext.xml
&lt;bean name="loadProperties" class="LoadProperties"/&gt;
E na classe que precisa recuperar as propriedades, faz assim:
private LoadProperties loadProperties;
//cria o get

Properties properties = getLoadProperties.getResourceAsProperties("caminho/do/arquivo.properties");
user = properties.getProperty("user");
senha = properties.getProperty("senha");
M

romarcio,

não funcionou não. O que estou tentando agora, é ler o arquivo properties e passar as informações para o spring. A parte ler o arquivo é tranquila, mas passar as informações para o spring, ai é que está o problema. Você sabe como um classe passa as informações de um arquivo properties para um arquivo XML?

R

Dai pelo que sei, só mesmo usando esse bean

&lt;bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"&gt;
        &lt;property name="locations"&gt;
            &lt;list&gt;
                &lt;value&gt;/br/arquivo.properties&lt;/value&gt;
            &lt;/list&gt;
        &lt;/property&gt;
    &lt;/bean&gt;

Mas dai, ele só funciona se o arquivo estiver dentro do projeto, fora não.

Criado 1 de outubro de 2010
Ultima resposta 5 de out. de 2010
Respostas 7
Participantes 2