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;
}
}
आशा इससे आपके प्रश्न का उत्तर देते हैं।
आप क्या अवरुद्ध करने की कोशिश कर रहे हैं? get() विधि या शायद कुछ सेटर विधि? –
खैर कोई भी तरीका आदर्श रूप में, हम एक प्रदर्शन की निगरानी प्रणाली है कि विधि कॉल और कई बार उनके निष्पादन आदि मैं lazily इंटरसेप्टर को प्रारंभ करना चाहते हैं को बीच में रोक दिया है। –