Configuração Spring

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

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}

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

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.

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?

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

E na classe que precisa recuperar as propriedades, faz assim:

[code]
private LoadProperties loadProperties;
//cria o get

Properties properties = getLoadProperties.getResourceAsProperties(“caminho/do/arquivo.properties”);
user = properties.getProperty(“user”);
senha = properties.getProperty(“senha”);[/code]

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?

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.