यह एक छोटी सी समस्या नहीं है, लेकिन निश्चित रूप से यह एक अच्छा सवाल है! आपके द्वारा उल्लिखित स्कोप बाध्यकारी समस्याओं के लिए एक परीक्षक हो सकता है। मुझे लगता है कि मैं गलत बाध्यकारी अभ्यास के साथ चेतावनी उत्पन्न करने के लिए एक जूनिट धावक बना सकता हूं। मैं बाद में इस पोस्ट को अपडेट कर दूंगा।
अब के लिए एक उदाहरण है कि बाइंडिंग स्कॉप्स कैसे प्राप्त करें।
मॉड्यूल
public class ScopeTestModel extends ServletModule {
@Override
protected void configureServlets() {
super
.configureServlets();
bind(Key.get(Object.class, Names.named("REQ1"))).to(Object.class).in(ServletScopes.REQUEST);
bind(Key.get(Object.class, Names.named("REQ2"))).to(RequestScopedObject.class);
bind(Key.get(Object.class, Names.named("SINGLETON1"))).to(Object.class).asEagerSingleton();
bind(Key.get(Object.class, Names.named("SINGLETON2"))).to(Object.class).in(Scopes.SINGLETON);
bind(Key.get(Object.class, Names.named("SINGLETON3"))).to(SingletonScopedObject.class);
bind(Key.get(Object.class, Names.named("SESS1"))).to(Object.class).in(ServletScopes.SESSION);
bind(Key.get(Object.class, Names.named("SESS2"))).to(SessionScopedObject.class);
}
}
testcase
public class TestScopeBinding {
private Injector injector = Guice.createInjector(new ScopeTestModel());
@Test
public void testRequestScope() throws Exception {
Binding<Object> req1 = injector.getBinding(Key.get(Object.class, Names.named("REQ1")));
Binding<Object> req2 = injector.getBinding(Key.get(Object.class, Names.named("REQ2")));
Scope scope1 = getScopeInstanceOrNull(req1);
Scope scope2 = getScopeInstanceOrNull(req2);
Assert.assertEquals(ServletScopes.REQUEST,scope1);
Assert.assertEquals(ServletScopes.REQUEST,scope2);
}
@Test
public void testSessionScope() throws Exception {
injector.getAllBindings();
Binding<Object> sess1 = injector.getBinding(Key.get(Object.class, Names.named("SESS1")));
Binding<Object> sess2 = injector.getBinding(Key.get(Object.class, Names.named("SESS2")));
Scope scope1 = getScopeInstanceOrNull(sess1);
Scope scope2 = getScopeInstanceOrNull(sess2);
Assert.assertEquals(ServletScopes.SESSION,scope1);
Assert.assertEquals(ServletScopes.SESSION,scope2);
}
@Test
public void testSingletonScope() throws Exception {
injector.getAllBindings();
Binding<Object> sng1 = injector.getBinding(Key.get(Object.class, Names.named("SINGLETON1")));
Binding<Object> sng2 = injector.getBinding(Key.get(Object.class, Names.named("SINGLETON2")));
Binding<Object> sng3 = injector.getBinding(Key.get(Object.class, Names.named("SINGLETON3")));
Scope scope1 = getScopeInstanceOrNull(sng1);
Scope scope2 = getScopeInstanceOrNull(sng2);
Scope scope3 = getScopeInstanceOrNull(sng3);
Assert.assertEquals(Scopes.SINGLETON,scope1);
Assert.assertEquals(Scopes.SINGLETON,scope2);
Assert.assertEquals(Scopes.SINGLETON,scope3);
}
private Scope getScopeInstanceOrNull(final Binding<?> binding) {
return binding.acceptScopingVisitor(new DefaultBindingScopingVisitor<Scope>() {
@Override
public Scope visitScopeAnnotation(Class<? extends Annotation> scopeAnnotation) {
throw new RuntimeException(String.format("I don't know how to handle the scopeAnnotation: %s",scopeAnnotation.getCanonicalName()));
}
@Override
public Scope visitNoScoping() {
if(binding instanceof LinkedKeyBinding) {
Binding<?> childBinding = injector.getBinding(((LinkedKeyBinding)binding).getLinkedKey());
return getScopeInstanceOrNull(childBinding);
}
return null;
}
@Override
public Scope visitEagerSingleton() {
return Scopes.SINGLETON;
}
public Scope visitScope(Scope scope) {
return scope;
}
});
}
}
Scoped वस्तुओं
@RequestScoped
public class RequestScopedObject extends Object {
}
@SessionScoped
public class SessionScopedObject extends Object {
}
@Singleton
public class SingletonScopedObject extends Object {
}
स्रोत
2013-09-02 12:28:15
धन्यवाद, यह निश्चित रूप से पहेली का एक टुकड़ा है। यह जांचने के लिए कि बाध्यकारी एक सिंगलटन है या नहीं, वहां 'Scopes.isSingleton() 'भी है। पहेली का दूसरा भाग वह जगह है जहां मैं फंस गया था। मुझे एक गिइस 4 समाधान मिला है जिसे मैं पोस्ट करने जा रहा हूं, लेकिन यदि संभव हो तो मुझे अभी भी एक गिइस 3 समाधान पसंद आएगा। –