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