static <T> Provider<T> decorate(BeanSpec spec, Provider<T> realProvider, Genie genie) { if (realProvider instanceof PostConstructorInvoker) { return realProvider; } Method postConstructor = findPostConstructor(spec.rawType()); return null == postConstructor ? realProvider : new PostConstructorInvoker<T>(realProvider, postConstructor); }
private static Method findPostConstructor(Class<?> type) { for (Method m : type.getDeclaredMethods()) { if (Modifier.isStatic(m.getModifiers()) || Void.TYPE != m.getReturnType()) { continue; } if (m.isAnnotationPresent(PostConstruct.class)) { m.setAccessible(true); return m; } } Class<?> parent = type.getSuperclass(); if (null != parent && Object.class != parent) { return findPostConstructor(parent); } return null; }
private Provider<?> decorate(final BeanSpec spec, Provider provider, final boolean isFactory) { if (BEAN_SPEC_PROVIDER == provider) { return provider; } final Provider postConstructed = PostConstructProcessorInvoker.decorate(spec, PostConstructorInvoker.decorate(spec, ElementLoaderProvider.decorate(spec, provider, this), this), this); Provider eventFired = new Provider() { @Override public Object get() { if (supportInjectionPoint && !isFactory) { TGT_SPEC.set(spec); } try { Object bean = postConstructed.get(); fireInjectEvent(bean, spec); return bean; } finally { if (supportInjectionPoint && !isFactory) { TGT_SPEC.remove(); } } } }; return ScopedProvider.decorate(spec, eventFired, this); }
private static Method findPostConstructor(Class<?> type) { for (Method m : type.getDeclaredMethods()) { if (Modifier.isStatic(m.getModifiers()) || Void.TYPE != m.getReturnType()) { continue; } if (m.isAnnotationPresent(PostConstruct.class)) { m.setAccessible(true); return m; } } Class<?> parent = type.getSuperclass(); if (null != parent && Object.class != parent) { return findPostConstructor(parent); } return null; }
private Provider<?> decorate(final BeanSpec spec, Provider provider, final boolean isFactory) { if (BEAN_SPEC_PROVIDER == provider) { return provider; } final Provider postConstructed = PostConstructProcessorInvoker.decorate(spec, PostConstructorInvoker.decorate(spec, ElementLoaderProvider.decorate(spec, provider, this), this), this); Provider eventFired = new Provider() { @Override public Object get() { if (supportInjectionPoint && !isFactory) { TGT_SPEC.set(spec); } try { Object bean = postConstructed.get(); fireInjectEvent(bean, spec); return bean; } finally { if (supportInjectionPoint && !isFactory) { TGT_SPEC.remove(); } } } }; return ScopedProvider.decorate(spec, eventFired, this); }
static <T> Provider<T> decorate(BeanSpec spec, Provider<T> realProvider, Genie genie) { if (realProvider instanceof PostConstructorInvoker) { return realProvider; } Method postConstructor = findPostConstructor(spec.rawType()); return null == postConstructor ? realProvider : new PostConstructorInvoker<T>(realProvider, postConstructor); }