No FramaWork JSF, temos um Scope chamado de ViewScope, esse Ecope, mantem os objetos até que a View seja fechada. Nessa aula, foi abordado o Request e Session Scope, como ficaria o no spring o ViewScope?
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
No FramaWork JSF, temos um Scope chamado de ViewScope, esse Ecope, mantem os objetos até que a View seja fechada. Nessa aula, foi abordado o Request e Session Scope, como ficaria o no spring o ViewScope?
O spring não possui view scope, por isso voce tera que criar o seu proprio @scope("view").
1) O spring te da suporte para criacao de um novo escopo
public class ViewScope implements org.springframework.beans.factory.config.Scope {
public Object get(String name, ObjectFactory<?> objectFactory) {
if (FacesContext.getCurrentInstance().getViewRoot() != null) {
Map<String, Object> viewMap = FacesContext.getCurrentInstance()
.getViewRoot()
.getViewMap(); // Map do JSF cujo os valores são referentes ao escopo de view
if (viewMap.containsKey(name)) {
return viewMap.get(name);
} else {
Object object = objectFactory.getObject();
// da próxima vez que for requisitado, dentro do escopo de view,
// ele não precisará ser construído.
viewMap.put(name, object);
return object;
}
} else {
return null;
}
}
public Object remove(String name) {
if (FacesContext.getCurrentInstance().getViewRoot() != null) {
// simplesmente, remove o bean Spring do ViewMap do JSF
return FacesContext.getCurrentInstance().getViewRoot().getViewMap().remove(name);
} else {
return null;
}
}
...
}2) Agora vc precisa invocar o metodo register scope
public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry {
void registerScope(String scopeName, Scope scope);
...
}
@Configuration
public class ViewScopeConfig {
@Bean
public static CustomScopeConfigurer customScopeConfigurer() {
Map<String, Object> scopes = new HashMap<>();
scopes.put("view", new ViewScope());
CustomScopeConfigurer customScopeConfigurer = new CustomScopeConfigurer();
customScopeConfigurer.setScopes(scopes);
return customScopeConfigurer;
}
}3) Por ultimo, basta anotar seu Managed Bean com as seguinte annotations:
@Component
@Scope("view")