SeamFramework.orgCommunity Documentation
Até agora,vimos muitos exemplos de declaração de Web Beans usando anotações. No entanto, há várias situações em que não podemos usar anotações para definir um Web Bean:
quando a classe de implementação vem de alguma biblioteca preexistente, ou
quando deveria haver vários Web Beans com a mesma classe de implementação.
Em ambos os casos, We Beans nos dá duas opções:
escrever um método produtor (producer method), ou
declarar um Web Bean utilizando XML.
Muitos frameworks usam XML para fornecer metadados relativos às classes Java. No entanto, Web Beans utiliza uma abordagem muito diferente para especificar os nomes de classes Java, atributos ou métodos dos outros frameworks. Em vez de escrever os nomes das classes e dos membros ( como uma String de valores em elementos e atributos XML), Web Beans permite que você use o nome da classe ou membro como o nome do elemento XML.
A vantagem dessa abordagem é que você pode escrever um esquema XML (XML schema) que evita erros ortográficos no seu documento XML. É até mesmo possível para uma ferramenta gerar o esquema XML (XML schema) automaticamente, a partir do código Java compilad.Ou, um ambiente integrado de desenvolvimento poderia fazer a mesma validação sem a necessidade explicíta do passo intermediário de geração.
Para cada pacote Java, Web Beans define um namespace XML correspondente. O nome é formado precedendo urn:java:
ao nome do pacote Java. Para o pacote com.mydomain.myapp
, o namespace XML é urn:java:com.mydomain.myapp
.
Tipos Java pertencentes a um pacote são referenciados a utilizar um elemento XML no namespace correspondente ao pacote. O nome do elemento é o nome do tipo Java. Atributos e métodos do tipo são especificados por elementos filhos do mesmo namespace. Se o tipo for uma anotação, os membros são definidos por atributos do elemento.
Por exemplo, o elemento <util:Date/>
no seguinte fragmento XML refere-se à classe java.util.Date
:
<WebBeans xmlns="urn:java:javax.webbeans"
xmlns:util="urn:java:java.util">
<util:Date/>
</WebBeans
>
E esse é todo o código necessário para declarar que Date
é um simples Web Bean! Uma instância de Date
pode agora ser injetada por qualquer outro Web Bean:
@Current Date date
Podemos declarar o escopo, tipo de puplicação (deployment type) e tipo de ligação de interceptador (interceptor binding types) com a utilização direta de elementos filhos na declaração do Web Bean:
<myapp:ShoppingCart>
<SessionScoped/>
<myfwk:Transactional requiresNew="true"/>
<myfwk:Secure/>
</myapp:ShoppingCart
>
Utilizamos exatamente a mesma abordagem para especificar nomes e tipos de ligação:
<util:Date>
<Named
>currentTime</Named>
</util:Date>
<util:Date>
<SessionScoped/>
<myapp:Login/>
<Named
>loginTime</Named>
</util:Date>
<util:Date>
<ApplicationScoped/>
<myapp:SystemStart/>
<Named
>systemStartTime</Named>
</util:Date
>
Em que @Login
e @SystemStart
são anotações do tipo ligação.
@Current Date currentTime;
@Login Date loginTime;
@SystemStart Date systemStartTime;
Como é habitual, um Web Bean pode suportar múltiplos tipos de ligação (binding types):
<myapp:AsynchronousChequePaymentProcessor>
<myapp:PayByCheque/>
<myapp:Asynchronous/>
</myapp:AsynchronousChequePaymentProcessor
>
Interceptadores e Decoradores são simplesmente Web Beans. Assim, podem ser declarados como qualquer outro Web Bean:
<myfwk:TransactionInterceptor>
<Interceptor/>
<myfwk:Transactional/>
</myfwk:TransactionInterceptor
>
Web Beans nos permite definir um Web Bean em um ponto de injeção. Por exemplo:
<myapp:System>
<ApplicationScoped/>
<myapp:admin>
<myapp:Name>
<myapp:firstname
>Gavin</myapp:firstname>
<myapp:lastname
>King</myapp:lastname>
<myapp:email
>gavin@hibernate.org</myapp:email>
</myapp:Name>
</myapp:admin>
</myapp:System
>
O elemento <Name>
declara um Web Bean simples de escopo @Dependent
e classe Name
, com um conjunto inicial de valores para os campos. Esse Web Bean possui a especial, container-generated binding and is therefore injectable only to the specific injection point at which it is declared.
Esse simples - mas poderoso - recurso permite que o formato XML do Web Beans seja utilizado para especificar grafos completos de objetos Java. Não é uma solução de ligação de dados (databinding) completa, mas está bem próxima!
Se desejamos que o formato do documento XML seja criado por pessoas que não são desenvolvedores Java, ou por pessoas que não têm acesso ao nosso código, precisamos fornecer um esquema (XML schema). Não há nada específico no Web Beans sobre escrever ou utilizar o esquema.
<WebBeans xmlns="urn:java:javax.webbeans"
xmlns:myapp="urn:java:com.mydomain.myapp"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:java:javax.webbeans http://java.sun.com/jee/web-beans-1.0.xsd
urn:java:com.mydomain.myapp http://mydomain.com/xsd/myapp-1.2.xsd">
<myapp:System>
...
</myapp:System>
</WebBeans
>
Escrever um esquema XML (XML schema) é um tanto tedioso. Tod via, o projeto Web Beans RI fornecerá uma ferramenta que automaticamente gera o esquema XML (XML schema), a partir do código da classe Java compilada.