Custom scopes in Spring
In Spring you have to implement your custom scope using the Scope interface. I have implemented a custom scope as a copy of request scope for illustration:
package com.mycompany.springapp.scope;
import org.springframework.beans.factory.config.Scope;
import org.springframework.web.context.request.AbstractRequestAttributesScope;
import org.springframework.web.context.request.RequestAttributes;
public class MyCustomScope extends AbstractRequestAttributesScope implements Scope {
@Override
protected int getScope() {
return RequestAttributes.SCOPE_REQUEST;
}
/**
* There is no conversation id concept for a request, so this method
* returns null
.
*/
public String getConversationId() {
return null;
}
}
Then you register your new scope like this in your
You can then use it like all the other built-in scopes:
package com.mycompany.springapp.scope; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component @Scope("custom") public class MyCustomScopedService { }
See here for additional information.
Custom scopes with CDI
In CDI - according to the CDI programming model - you first define your own scope annotation:
package com.mycompany.jeeapp.scope.extension; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.Target; import javax.enterprise.context.NormalScope; @Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @Target({ElementType.TYPE, ElementType.METHOD}) @NormalScope public @interface CustomScoped { }
Then there is the Context interface that you need to implement. I have made it a copy of
HttpRequestScope
for illustration.package com.mycompany.jeeapp.scope.extension; import org.jboss.weld.context.http.HttpRequestContext; import org.jboss.weld.context.http.HttpRequestContextImpl; import java.lang.Class; public class MyCustomScope extends HttpRequestContextImpl implements HttpRequestContext { public Class getScope() { return CustomScoped.class; } }
You assign your new scope annotation to the beans that are instintiated in this scope:
@CustomScoped public class MyCustomScopeService { ... }
To register the scope create this class and drop it together with your application into the CDI enabled container. The CDI runtime will register it automatically.
package com.mycompany.jeeapp.scope.extension; import javax.enterprise.event.Observes; import javax.enterprise.inject.spi.AfterBeanDiscovery; import javax.enterprise.inject.spi.BeanManager; import javax.enterprise.inject.spi.Extension; public class MyCustomScopeExtension implements Extension{ public void afterBeanDiscovery(@Observes AfterBeanDiscovery event, BeanManager manager) { event.addContext(new MyCustomScope()); } }
See this blog entry for a comprehensive example.
Nothing to complain about! Both technologies perfectly support extensions for scopes and context.
Thanks for sharing....
ReplyDeleteHi Niklas,
ReplyDeleteYou have posed the question: "The interesting question to me is: is Java EE 6 sufficient for enterprise development." I cannot find where you posted your conclusion. I would like to read it.
Thanks,
Mark
Hi Mark, thx for the comment. This is a difficult question. I think you could use it. I would, however, prefer the Spring stack for numereous reasons. I have a blog in the queue already that explains those reasons and my conclusion, but I need to find a day where I'm brave enough to post it ;-) Maybe in the next weeks.
ReplyDeleteCheers, Niklas