Usando FactoryBean com Spring
Em muitos casos será necessário criar um objeto no ApplicationContext que não é um Java Bean. Ou em alguns casos, é necessário executar algum método de inicialização no objeto criado, ou algum procedimento customizado. Para esses casos o Spring possuí o conceito de FactoryBean.
FactoryBean é uma interface que possui três métodos para implementar, como visto a seguir:

Na maioria dos casos é mais adequado estender a classe abstrata AbstractFactoryBean que implementa a interface acima. Por default, ao estender essa classe o objeto criado é um singleton, que é o mais comum na maioria dos casos. Na AbstractFactoryBean restam os métodos ‘getObjectType’ e ‘createInstance’ para implementer. O ‘createInstance’ difere do ‘getObject’ pois só é chamado uma única vez (para singleton’s), e varias vezes para prototypes.
Como exemplo, vamos criar uma classe ‘KeyStoreFactoryBean’ que implementa essa interface. O objetivo é a criação de KeyStore’s de forma prática dentro do ApplicationContext. Note que um KeyStore não é um Java Bean, portanto essa é uma maneira adequada de permitir injetar KeyStore’s dentro de outros objetos do ApplicationContext. Portanto, começamos com uma implementação inicial:

A instância retornada será do tipo java.security.KeyStore e poderá ser injetada em qualquer setKeyStore(KeyStore) de outro Java Bean do ApplicationContext. Veja um exemplo desse bean declarado no ApplicationContext:

Para tornar nosso exemplo realista vamos tornar o KeyStoreFactoryBean configurável. Para isso vamos adicionar quatro propriedades. O local que o arquivo KeyStore está (podendo ser no classpath, filesystem, URL, etc), uma senha para abrir o KeyStore, o tipo de KeyStore (ex: pkcs12, jks, etc) e o provider a ser utilizado. Os últimos dois parâmetros assumem valores padrões do Java, conforme esperado.
O código interessante é a implementação do método ‘createInstance’. Aqui criamos um KeyStore de acordo com os parâmetros passados. Veja o exemplo completo:

Repare na utilização da classe ‘org.springframework.core.io.Resource’ do Spring. Ela permite injetar qualquer arquivo, estando no classpath, no filesystem, URL, etc. Isso facilita a configuração.
Dessa forma é possível criar um KeyStore dessa forma no ApplicationContext:

Como vimos, um FactoryBean pode auxiliar em muito a criação de objetos difíceis de configurar. É muito utilizado para configurar objetos de frameworks externos dentro do Spring.
OBS: O exemplo completo da classe KeyStoreFactoryBean pode ser encontrado no módulo ws-security do projeto spring-ws, sub-projeto do springframework.
Abraços,
Michel Zanini.
É impressionamente as facilidades que o spring oferece no contexto de injeção de dependências e a grande facilidade de usar, mas é muito importante definir bem o objetivo do que se vai fazer para utilizar o factorybean da melhor maneira possível. Esse foi um ótimo exemplo e é possível citar inúmeros outros! Ótimo post, parabéns Michel!
André Albino Pereira
Junho 12, 2008 em 7:17 pm