SeamFramework.orgCommunity Documentation

Capítulo 11. Especialização

11.1. Utilizando a especialização
11.2. Vantagens da especialização

Nós já vimos a forma como o modelo de injeção de dependências da Web Beans permite sobrescrever a implementação da API em tempo de implantação. Por exemplo, o seguinte Bean Web corporativo fornece uma implementação da API PaymentProcessor em produção:

@CreditCard @Stateless

public class CreditCardPaymentProcessor 
        implements PaymentProcessor {
    ...
}

But in our staging environment, we override that implementation of PaymentProcessor with a different Web Bean:

@CreditCard @Stateless @Staging

public class StagingCreditCardPaymentProcessor 
        implements PaymentProcessor {
    ...
}

What we've tried to do with StagingCreditCardPaymentProcessor is to completely replace AsyncPaymentProcessor in a particular deployment of the system. In that deployment, the deployment type @Staging would have a higher priority than the default deployment type @Production, and therefore clients with the following injection point:

@CreditCard PaymentProcessor ccpp

Pode receber uma instância de StagingCreditCardPaymentProcessor.

Infelizmente, existem várias armadilhas que facilmente podemos cair:

Em cada um destes casos, o Web Bean que tentamos sobrescrever ainda podia ser chamado em tempo de execução. Portanto, a sobrescrita é algo propensa a erros de desenvolvimento.

Web Beans provides a special feature, called specialization, that helps the developer avoid these traps. Specialization looks a little esoteric at first, but it's easy to use in practice, and you'll really appreciate the extra security it provides.

Specialization is a feature that is specific to simple and enterprise Web Beans. To make use of specialization, the higher-priority Web Bean must:

@Stateless @Staging @Specializes

public class StagingCreditCardPaymentProcessor 
        extends CreditCardPaymentProcessor {
    ...
}

Nós dizemos que a alta prioridade na Web Bean specializa sua superclasse.

Quando a especialização é utilizada:

Em nosso exemplo, o tipo de ligação (binding type) @CreditCard do CreditCardPaymentProcessor é herdado por StagingCreditCardPaymentProcessor.

Além disso, o gerenciador do Web Bean irá validar que:

Se qualquer uma dessas condições são violadas, o gerenciador do Web Bean lança uma excepção em tempo de inicialização.

Therefore, we can be certain that the superclass will never be called in any deployment of the system where the Web Bean annotated @Specializes is deployed and enabled.