2011-12-06 13 views
11

क्या किसी उदाहरण के बजाय प्रदाता को विधि इंटरसेप्टर बांधने का कोई तरीका है?प्रदाता के लिए विधि इंटरसेप्टर को कैसे बांधें?

उदा मैं इंटरसेप्टर को बांधने के लिए नीचे दिए गए कोड का उपयोग करता हूं, मैं एक प्रदाता को इंटरसेप्टर को कैसे बांधूं और फिर एनोटेशन के लिए कैसे बाध्य करूं?

bindInterceptor(
    Matchers.any(), Matchers.annotatedWith(ANNOTATION.class), new INTERCEPTOR()); 
+0

आप क्या अवरुद्ध करने की कोशिश कर रहे हैं? get() विधि या शायद कुछ सेटर विधि? –

+0

खैर कोई भी तरीका आदर्श रूप में, हम एक प्रदर्शन की निगरानी प्रणाली है कि विधि कॉल और कई बार उनके निष्पादन आदि मैं lazily इंटरसेप्टर को प्रारंभ करना चाहते हैं को बीच में रोक दिया है। –

उत्तर

18

Guice Guice द्वारा निर्मित नहीं उदाहरणों पर AOP अनुमति नहीं देता: Guice AOP Limitations

"उदाहरण एक से Guice द्वारा बनाया जाना चाहिए @ सम्मिलित करें-एनोटेट या कोई तर्क निर्माता"

इसका मतलब है कि एक प्रदाता के साथ बनाए गए उदाहरण एओपी के लिए उम्मीदवार नहीं होंगे।

दूसरा पहलू पर, जब तक आपके प्रदाता की स्थिति का उल्लेख के तहत Guice द्वारा instantiated है, अपने प्रदाता AOP के लिए एक उम्मीदवार हो सकता है।

AOP एनोटेशन:

यहाँ एक उदाहरण है कि इस दर्शाता है

@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) 
@interface AOPExample {} 

प्रदाता:

public class ExampleProvider implements Provider<Example> { 

    @AOPExample 
    public Example get() { 
     System.out.println("Building..."); 
     return new Example(); 
    } 
} 

लक्ष्य उदाहरण:

public class Example { 

    @AOPExample 
    public void tryMe() { 
     System.out.println("example working..."); 
     try { 
      Thread.sleep(1000L); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 

} 

मॉड्यूल:

public class ExampleModule extends AbstractModule { 
    @Override 
    protected void configure() { 
     bindInterceptor(Matchers.any(), Matchers.annotatedWith(AOPExample.class), new LoggingAOP()); 

     bind(Example.class).toProvider(ExampleProvider.class); 
    } 
} 

टेस्ट कोड:

public class Test { 

    public static void main(String[] args) { 
     Injector injector = Guice.createInjector(new TestModule()); 

     ExampleProvider exampleProvider = injector.getInstance(ExampleProvider.class); 
     Example example = exampleProvider.get(); 

     example.tryMe(); 

     Example directExample = injector.getInstance(Example.class); 

     directExample.tryMe(); 

    } 
} 

टेस्ट आउटपुट:

start 
Building... 
end took: 3 
example working... 
start 
Building... 
end took: 0 
example working... 

सूचना है कि "उदाहरण के काम कर रहे ..." टाइमर कोड से घिरा हुआ नहीं है। Provider.get ("बिल्डिंग ...") हालांकि है।

यदि आपका प्रश्न हो: इंटरसेप्टर (नई इंटरसेप्टर()) एक Guice प्रदाता के माध्यम से प्रदान की जा सकती, जवाब नहीं है। इस कार्यक्षमता के निकटतम आप मॉड्यूल कॉन्फ़िगरेशन विधि में requestInjection() को कॉल कर सकते हैं। यह आपके इंटरसेप्टर को उचित कोड के साथ इंजेक्ट करेगा। आपके इंटरसेप्टर से आप किसी भी तरह के ओवरहेड से बचने के लिए प्रदाता का उपयोग करने में सक्षम हो सकते हैं जो स्टार्टअप के दौरान आपको धीमा कर रहा है।

यहाँ मैं क्या मतलब है:

मॉड्यूल:

public class TestModule extends AbstractModule { 
    @Override 
    protected void configure() { 
     bind(String.class).toInstance("One"); 
     bind(String.class).annotatedWith(Names.named("two")).toInstance("Two"); 

     LoggingAOP loggingAOP = new LoggingAOP(); 

     bindInterceptor(Matchers.any(), Matchers.annotatedWith(AOPExample.class), loggingAOP); 

     requestInjection(loggingAOP); 

     bind(Example.class).toProvider(ExampleProvider.class); 
    } 
} 

इंटरसेप्टर:

public class LoggingAOP implements MethodInterceptor { 

    @Inject 
    private Provider<SomethingThatTakesALongTimeToInit> provider; 

    public Object invoke(MethodInvocation invocation) throws Throwable { 
     provider.get()... 
     System.out.println("start"); 
     long start = System.currentTimeMillis(); 
     Object value = invocation.proceed(); 
     System.out.println("end took: " + (System.currentTimeMillis() - start)); 
     return value; 
    } 
} 

आशा इससे आपके प्रश्न का उत्तर देते हैं।

+1

ग्रेट "नमस्ते दुनिया" Guice AOP के लिए उदाहरण। – ripper234

+0

धन्यवाद @ ripper234।जिस तरह से हमारे पास ट्रांसफ्यूज़ में समान (लगभग समान) सुविधाएं हैं, एक परियोजना जिस पर मैं काम कर रहा हूं: http://androidtransfuse.org/documentation.html#method_interceptors –

संबंधित मुद्दे