• Nenhum resultado encontrado

Mapeando atributos complexos

No documento Casa do Código. Prefácio (páginas 53-56)

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.

No documento Casa do Código. Prefácio (páginas 53-56)