package test;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.enterprise.context.NormalScope;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@NormalScope
public @interface MyScoped {
}
package test;
import java.lang.annotation.Annotation;
import java.util.Map;
import java.util.HashMap;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.context.spi.Context;
import javax.enterprise.context.spi.Contextual;
import javax.enterprise.context.spi.CreationalContext;
public class MyContext implements Context {
private Map<String,Object> cache = new HashMap<String,Object>();
public <T> T get(Contextual<T> ctx) {
return null;
}
public <T> T get(Contextual<T> ctx, CreationalContext<T> crectx) {
String clz = ((Bean<T>)ctx).getBeanClass().getName();
@SuppressWarnings("unchecked")
T o = (T)cache.get(clz);
if(o == null) {
o = ctx.create(crectx);
cache.put(clz, o);
}
return o;
}
public Class<? extends Annotation> getScope() {
return MyScoped.class;
}
public boolean isActive() {
return true;
}
public void reset() {
cache.clear();
}
}
package test;
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 MyContextExtension implements Extension {
public void afterBeanDiscovery(@Observes AfterBeanDiscovery event, BeanManager manager) {
event.addContext(new MyContext());
}
}
...
<jar basedir="${bin}" includes="**/My*.class" destfile="${jar}">
<service type="javax.enterprise.inject.spi.Extension" provider="test.MyContextExtension"/>
</jar>
...
@Inject
private BeanManager bm;
...
// MyScope is now out of scope !!
((MyContext)bm.getContext(MyScoped.class)).reset();
MyScoped er i scope indtil eksplicit smidt ud.