Contentor de molas não só instancia um feijão e arame as suas dependências, como também fornece o âmbito de uma instância. Existe um suporte incorporado para seis âmbitos de feijão no Spring Framework. Por exemplo, o escopo do feijão pode ser de um único botão, protótipo e assim por diante. Este post mostra como definir um escopo de feijão utilizando a anotação Spring @Scope.
Escopes de feijão Spring suportados
- Escopo Singleton- Uma instância de objecto único correspondente a uma definição de feijão é criada para cada contentor Spring IoC. Singleton scope é um escopo padrão de feijão.
- Escopo do protótipo – Uma nova instância de objecto é criada sempre que o feijão é solicitado do contentor Spring.
- Solicitar escopo – Para cada solicitação HTTP é criada uma nova instância de feijão. Este escopo do feijão Spring é válido apenas no contexto de uma aplicação SpringContext.
- Escopo da sessão- Uma única instância de feijão é escopada para o ciclo de vida de uma sessão HTTP. Este âmbito é válido apenas no contexto de uma aplicação Spring ApplicationContext.
- Application scope- Escopo de uma única instância de feijão para o ciclo de vida de um ServletContext. Este âmbito é válido apenas no contexto de uma Spring ApplicationContext.
- Websocket scope- Escopo uma definição de feijão único para o ciclo de vida de um WebSocket. Este âmbito só é válido no contexto de uma Spring ApplicationContext.
Onde utilizar @AnnotationScope
@AnnotationScope pode ser utilizada como anotação ao nível do tipo em conjunto com @Component e @Configuration annotation. Quando utilizada como anotação ao nível do tipo, @Scope indica o nome de um âmbito a utilizar para instâncias do tipo anotado.
@Anotação de âmbito também pode ser utilizada como anotação ao nível do método em conjunção com @Bean. Quando utilizada como anotação a nível de método @Scope indica o nome de um âmbito a utilizar para a instância devolvida do método.
@Anotação de âmbito com diferentes âmbitos
Nesta secção veremos trechos de código de utilização da anotação @Scope com diferentes âmbitos de feijão. Os âmbitos fornecidos fora da caixa na Primavera podem ser referidos utilizando as constantes SCOPE_* disponíveis nas interfaces ConfigurávelBeanFactory e WebApplicationContext.
@Escopo com escopo de feijão Singleton
@Service@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)public class BeanService{ ... ...}
@Escopo com escopo de feijão Protótipo
@Service@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)public class BeanService{ ... ...}
@Escopo com Âmbito de feijão Request bean scope
@Service@Scope(WebApplicationContext.SCOPE_REQUEST)public class BeanService{ ... ...}
@Escopo com Âmbito de feijão Session
@Service@Scope(WebApplicationContext.SCOPE_SESSION)public class BeanService{ ... ...}
@Escopo com Âmbito do feijão Aplicação
@Service@Scope(WebApplicationContext.SCOPE_APPLICATION)public class BeanService{ ... ...}
@Escopo com Âmbito do feijão WebSocket
@Component@Scope(scopeName = "websocket", proxyMode = ScopedProxyMode.TARGET_CLASS)public class MyBean { ... ...}
Anotonalidade do feijão com um único botão, exemplo
Definir um feijão com um único botão significa que uma única instância desse feijão é criada pelo recipiente. Todos os pedidos para esse feijão devolverão o mesmo objecto e quaisquer modificações ao campo serão reflectidas em todas as referências ao feijão uma vez que todas as referências apontam para o mesmo objecto.
O âmbito de um único botão é o âmbito padrão do feijão se nenhum âmbito for explicitamente especificado.
Temos uma classe de Utilizador com campos como firstName, lastName e age. A classe é anotada com a anotação @Scope com escopo especificado como singleton.
App config class to specify component scanning.
@Configuration@ComponentScan("com.knpcode.springexample")public class AppConfig {}
Agora, se executar este exemplo e obtiver dois objectos de User bean do contentor, ambos os objectos de referência apontarão para o mesmo feijão, uma vez que o escopo é singleton.
Output
First Name- RayLast Name- Chandler
Como pode ver firstName e lastName são definidos utilizando a referência user1, obtendo e imprimindo os valores destes campos a partir da referência user2 também dão os mesmos valores.
Spring @Scope annotation Prototype example
Na classe User como mostrado acima se o escopo for alterado para Prototype.
Executar o exemplo agora e analisar a saída.
First Name- nullLast Name- null
Campos ainda são nulos para a instância User2 como instância separada é criada agora por causa do escopo do protótipo.
Anotação Spring @Scope com @Configuration
No exemplo acima @Scope é utilizado em conjunto com @Component, vejamos um exemplo onde @Scope é utilizado com @Configuration e @Bean annotations.
Existem duas classes cujas instâncias serão devolvidas a partir dos métodos anotados com @Bean methods.
public class MyBean {public void myMethod() {System.out.println("In MyMethod of MyBean class");}}
public class ClassB {public ClassB(){System.out.println("In constructor of ClassB");}}
Config class
Na classe config @Scope é utilizada como anotação a nível de tipo e anotação a nível de método. Ao nível do tipo (em conjunto com @Configuration) o âmbito é especificado como protótipo.
Ao nível do método com um método não é especificado nenhum âmbito, o que significa que o bean terá o nível padrão Singleton. Note-se que o âmbito especificado ao nível do tipo não se aplica automaticamente ao nível do método, os métodos terão o seu próprio âmbito. Outro método tem o escopo Prototype.
Podemos verificar o escopo do feijão obtendo a instância BeanDefinition que tem métodos éSingleton e isPrototype.
Output
AppConfig has prototype scope- trueMyBean has prototype scope- falseMyBean has singleton scope- trueClassB has prototype scope- true
Da saída é possível ver que o escopo do feijão AppConfig é protótipo, é o que definimos ao nível do tipo.
O âmbito da instância MyBean é Singleton que é atribuído por defeito. O âmbito da instância ClassB é o protótipo tal como definido ao nível do método na classe Config.
- Spring @PostConstruct e @PreDestroy Annotation
- Spring @Resource Annotation
- Spring @Required Annotation
- Spring @Value Annotation
- Spring Bean Definition Inheritance
- Spring Tipos de Recipientes IoC – Contexto de Aplicação e BeanFactory
- Spring + JPA (Hibernate) OneToMany Example
- Spring Boot and Dependency Injection
Isso é tudo para o tópico Spring @Scope Annotation. Se algo estiver em falta ou se tiver algo a partilhar sobre o tópico, por favor escreva um comentário.
P>Pode também gostar
li>Fluxos do Tipo Primitivo em Java