Introdução
Este tutorial mostra os diferentes âmbitos que pode atribuir a um feijão ou a um componente no Spring Framework.
É importante compreender que uma definição de feijão é apenas uma receita para criar instâncias de uma classe seguindo a definição desta receita. Esta receita pode então ser utilizada uma ou mais vezes durante o ciclo de vida da aplicação para criar uma instância do feijão.
O âmbito do feijão é uma das principais características da configuração do feijão na primavera. O escopo indicará quando e como será instanciado o objecto para a definição do Bean.
P>Primavera inclui 7 âmbitos diferentes do Bean:
- Singleton
- Protótipo
- Requisito
- Sessão
- Sessão global
- Aplicação
- Websocket
Destes, apenas 5 estão disponíveis numa aplicação web-aware.
Singleton
Singleton é o âmbito padrão para um feijão, aquele que será utilizado se nada mais for indicado. Este âmbito implica que o contentor Spring criará uma única instância partilhada da classe designada por este feijão, pelo que cada vez que o feijão for necessário, o mesmo objecto será injectado. A instância deste feijão é armazenada numa cache gerida pela Spring.
Podemos usar anotações para definir singletons como no exemplo seguinte:
Como já foi dito, Singleton é o escopo padrão para um feijão Spring, por isso não é necessário definir o seu @Scope
(primeiro exemplo). No entanto, para melhor clareza e compreensão, pode-se destacar este facto usando a anotação @Scope
como no segundo exemplo.
O seguinte teste mostra o comportamento de um singleton:
O comportamento de @Component
(ou qualquer uma das suas extensões) classes anotadas é o mesmo que para os feijões normais, eles serão singleton a menos que configurados de forma diferente.
Por exemplo, um @RestController
como o seguinte:
Avalia o seguinte teste:
Protótipo
No âmbito do Protótipo, o contentor Spring criará uma nova instância do objecto descrito pelo feijão cada vez que receber um pedido. Uma das regras básicas enunciadas na documentação da Primavera é utilizar o Protótipo de feijão escopado quando se trabalha num ambiente onde existe gestão de sessão (Stateful) e utilizar o escopo Singleton quando se trabalha em ambientes sem gestão de sessão (Stateless), no entanto existem muitos outros casos de utilização diferentes.
É importante salientar que o contentor Spring não se responsabiliza pelo que acontece às instâncias dos objectos recebidos quando se solicita um feijão. Isto significa que é tarefa do revelador realizar a limpeza e libertar os recursos referenciados pelo objecto definido pelo feijão.
O mesmo que com o escopo Singleton, podemos definir um feijão com escopo Protótipo utilizando as seguintes anotações::
@Bean(name = PROTOTYPE_BEAN_SAMPLE_NAME)
@Scope(SCOPE_PROTOTYPE)
public Sample samplePrototype() {
return new Sample();
}
|
O próximo teste mostra o comportamento de um protótipo:
Feijões Singleton com Feijões Protótipo injectado
É muito importante realçar que quando se define um Feijão Singleton com dependências ou Feijões Protótipo encapsulados, a injecção acontece quando o objecto Singleton é instanciado, pelo que a injecção acontece apenas uma vez. Assim, o objecto injectado definido pelo Feijão Protótipo será sempre o mesmo caso, embora tenha sido definido com um âmbito de Protótipo.
Por exemplo, podemos definir uma classe com um feijão injectado da seguinte forma:
Definimos os seguintes feijões:
O primeiro feijão (Sample
) tem um escopo de Protótipo e será injectado no segundo (SampleAutowired
) que tem um escopo de Singleton. Como explicado nos parágrafos anteriores, o comportamento esperado é que cada vez que solicitarmos um SampleAutowired
, a instância de Amostra será a mesma mesmo quando tiver um âmbito de Protótipo porque foi instanciado e atribuído apenas uma vez quando SampleAutowired
(Singleton) foi instanciado pela primeira vez…
Isto é provado no seguinte teste:
Escopos de aplicação Web-aware
Como mencionado na introdução, os restantes escopos só estão disponíveis para aplicações Web-aware.
Requerimento
O contentor Spring irá criar uma nova instância do objecto definido pelo Bean cada vez que receber um pedido HTTP.
Para definir um Bean com este âmbito podemos usar as seguintes anotações dependendo se é um Bean ou um Componente:
O comportamento para o @RestController
no snippet anterior pode ser testado como se segue:
Sessão
Container da mola criará uma nova instância do objecto definido pelo feijão para cada uma das sessões HTTP (aplicação estatal) e devolverá esta mesma instância cada vez que receber um pedido dentro da mesma sessão.
O comportamento para o @RestController
no snippet anterior pode ser testado da seguinte forma:
Sessão Global
O âmbito da Sessão Global tem um comportamento semelhante ao âmbito da Sessão mas só é aplicável no contexto de aplicações web baseadas em Portlet. A especificação Portlet define uma sessão global como uma sessão partilhada entre todos os Portlets que compõem uma aplicação.
Se este âmbito for utilizado numa aplicação web regular, o comportamento dos Feijões definidos com este âmbito será o mesmo como se tivessem sido definidos com um âmbito de Sessão.
Aplicação
O âmbito da Aplicação tem um comportamento muito semelhante ao do âmbito Singleton, Spring criará uma nova instância para cada ServletContext
. Uma aplicação Spring pode ter vários ServletContext, pelo que a instância devolvida pela Spring para cada pedido de feijão será a mesma dentro do mesmo contexto, mas diferente para cada um dos contextos.
Websocket
O contentor Spring criará uma nova instância do objecto definido pelo feijão e devolverá esta instância para cada pedido produzido dentro do ciclo de vida de um Websocket.
0 comentários