não receba parâmetros como valor, basta não incluir mais a tag<constructor-arg>, como pode ser visto no exemplo abaixo:
<bean id="fonteDadosArquivo" factory-bean="factory"
factory-method="criar">
<property name="arquivo" value="/caminho/para/arquivo"/> </bean>
É importante observar que a instanciação por métodos instanciadores não nos impede de injetar valores nos atributos de nossos beans, como pode ser visto no nosso último exemplo.
3.5
Mapeando atributos complexos
O formato XML nos permite definir integralmente o estado inicial de nossos beans. Isto implica que a tag<property>é bem mais que o que mostramos até este mo- mento. Esta, além de possibilitar definirmos o valor de atributos primitivos e strings também possibilita o mapeamento de atributos complexos como listas, mapas, ins- tâncias de java.util.Properties e arrays. E estas são apenas algumas das possibilidades que iremos expor nesta seção.
Listas
Imagine uma implementação da interface FonteDados tal como a abaixo: class FonteDadosArquivos implements FonteDados {
private List<String> arquivos;
public List<String> getArquivos() {return arquivos;}
public void setArquivos(List<String> lista) {arquivos = lista;} // restante da classe ignorado para aumentar a clareza
}
Para mapear uma lista de strings, a tag<property>aceita em seu interior a tag
<list>, que podemos ser usada no código abaixo:
<bean class="br.com.casadocodigo.FonteDadosArquivos"> <property name="arquivos">
<list>
<value>/caminho/para/arquivo2.csv</value> <value>/caminho/para/arquivo3.csv</value> </list>
</property> </bean>
A tag<value>é usada para representar um valor primitivo ou String. Podería- mos também ter usado a tag<array>ao invés de<list>e obteríamos o mesmo resultado. Ambas injetariam um objeto do tipo java.util.ArrayList no atributo arqui- vos do bean.
Imagine agora que tenhamos alterado nossa implementação da classe FonteDa- dosArquivos para que seu atributo arquivos não receba uma lista de strings, mas sim uma lista de instâncias do tipo java.io.File tal como no snippet abaixo:
class FonteDadosArquivos implements FonteDados {
private List<java.io.File> arquivos;
//restante da classe ocultado para facilitar a leitura }
A tag<list>também aceita em seu interior a tag<bean>. Sendo assim, é possível declarar beans anônimos tal como no exemplo abaixo sem problema algum. <bean class="br.com.casadocodigo.FonteDadosArquivos">
<property name="arquivos"> <list>
<bean class="java.io.File">
<constructor-arg value="/caminho/para/arquivo1"/> </bean>
<bean class="java.io.File">
<constructor-arg value="/caminho/para/arquivo2"/> </bean>
<bean class="java.io.File">
<constructor-arg value="/caminho/para/arquivo3"/> </bean>
</list> </property> </bean>
Caso os beans não fossem anônimos, outra tag útil é a tag<ref>, que aponta para a referência de um bean externo, tal como no exemplo abaixo:
3.5. Mapeando atributos complexos Casa do Código <list>
<ref bean="beanArquivo1"/> <ref bean="beanArquivo2"/> </list>
Mapas
Uma outra implementação da interface FonteDados poderia ter suas fontes de da- dos mapeadas por tipo em uma estrutura do tipo java.util Map tal como no exemplo abaixo:
public class FonteDadosMapaArquivos implements FonteDados{
private Map<String, Object> mapa;
public Map<String, Object> getMapa() {return mapa;}
public void setMapa(Map<String, Object> valor) {mapa = valor;} // restante oculto para maximizar a clareza do exemplo
}
Entra em ação a tag<map>, que usaríamos para mapear o atributo mapa da classe acima da seguinte maneira:
<bean name="fonteDadosMapa"
class="br.com.casadocodigo.FonteDadosMapaArquivos"> <property name="mapa">
<map>
<entry key="arquivo"> <ref bean="arquivo"/> </entry>
<entry key="arquivoString"
value="/caminho/para/arquivo.csv"/> </map>
</property> </bean>
No interior da tag<map>incluímos uma lista de elementos do tipo<entry>que, como o próprio nome indica, representam uma entrada no mapa. O atributokeyde
<entry>identifica sua chave. Em seu interior são aceitos elementos dos tipos<ref>,
Properties
Um dos objetos mais usados da API Java padrão é a classe java.util.Properties. Como já era de se esperar, o formato XML do Spring oferece suporte especial a esta classe. Um exemplo prático é a classe SessionFactory do Hibernate para a qual o framework, como veremos mais adiante no livro, integra-se muito bem.
O snippet XML abaixo é quase auto explicativo: <bean id="sessionFactory"
class="org.springframework.orm.hibernate.LocalSessionFactoryBean"> <!--
Restante oculto para que possamos
focar apenas no mapeamento de propriedades -->
<property name="hibernateProperties"> <props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQL5InnoDBDialect
</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop> </props>
</property> </bean>
A tag<props>representa um objeto do tipo Properties. Em seu interior é aceita a tag<prop>que, como o próprio nome já diz, é usada para mapear as proprieda- des aceitas pelo objeto. No interior da tag é incluído o valor da propriedade que queremos mapear.