@Override public void register(final BeanDefinition beanDefinition, final Object bean) { instances.put(beanDefinition.name(), new BeanData(pc, beanDefinition, bean)); }
@Override public Object lookup(final String name) { BeanData beanData = instances.get(name); if (beanData == null) { return null; } return beanData.bean(); }
/** * Shutdowns the scope and calls all collected destroyable beans. */ @Override public void shutdown() { if (destroyableBeans == null) { return; } for (final BeanData destroyableBean : destroyableBeans) { destroyableBean.callDestroyMethods(); } destroyableBeans.clear(); }
/** * Wires beans. */ public void wireBean() { if (definition().wiringMode == WiringMode.NONE) { return; } wireProperties(); wireSets(); wireMethods(); }
/** * Invokes single method injection point on given bean with given bean definition. */ protected void wireMethods() { for (final MethodInjectionPoint methodRef : definition().methods) { invokeMethodInjectionPoint(methodRef); } }
/** * Wires bean, injects parameters and invokes init methods. * Such a loooong name :) */ protected void registerBeanAndWireAndInjectParamsAndInvokeInitMethods(final BeanData beanData) { initBeanDefinition(beanData.definition()); beanData.scopeRegister(); beanData.invokeInitMethods(InitMethodInvocationStrategy.POST_CONSTRUCT); beanData.wireBean(); beanData.invokeInitMethods(InitMethodInvocationStrategy.POST_DEFINE); beanData.injectParams(paramManager, petiteConfig.isImplicitParamInjection()); beanData.invokeInitMethods(InitMethodInvocationStrategy.POST_INITIALIZE); beanData.invokeConsumerIfRegistered(); }
/** * Creates and wires a bean within the container and optionally invokes init methods. However, bean is * <b>not</b> registered. */ @SuppressWarnings({"unchecked"}) public <E> E createBean(final Class<E> type, final WiringMode wiringMode) { final WiringMode finalWiringMode = petiteConfig.resolveWiringMode(wiringMode); final BeanDefinition def = externalsCache.get( type, () -> { final BeanDefinition beanDefinition = createBeandDefinitionForExternalBeans(type, finalWiringMode); initBeanDefinition(beanDefinition); return beanDefinition; }); final BeanData<E> beanData = new BeanData(this, def); registerBeanAndWireAndInjectParamsAndInvokeInitMethods(beanData); return beanData.bean(); }
/** * Invokes the method of some bean with the container, when its parameters requires to be injected into. * The bean is <b>not</b> registered within container. */ public <T> T invokeMethod(final Object bean, final Method method) { final WiringMode wiringMode = petiteConfig.resolveWiringMode(null); final BeanDefinition def = externalsCache.get( bean.getClass(), () -> { final BeanDefinition beanDefinition = createBeandDefinitionForExternalBeans(bean.getClass(), wiringMode); initBeanDefinition(beanDefinition); return beanDefinition; }); final BeanData beanData = new BeanData(this, def, bean); for (MethodInjectionPoint methodInjectionPoint : def.methods) { if (methodInjectionPoint.method.equals(method)) { return (T) beanData.invokeMethodInjectionPoint(methodInjectionPoint); } } try { return (T) method.invoke(bean); } catch (Exception e) { throw new PetiteException(e); } }
/** * Returns <code>true</code> if bean is destroyable. */ protected boolean isBeanDestroyable(final BeanData beanData) { DestroyMethodPoint[] dmp = beanData.definition().destroyMethodPoints(); return dmp != null && dmp.length != 0; }
public BeanData(final PetiteContainer petiteContainer, final BeanDefinition<T> beanDefinition) { this.pc = petiteContainer; this.beanDefinition = beanDefinition; this.bean = (T) newBeanInstance(); }
/** * Wires bean, injects parameters and invokes init methods. * Such a loooong name :) */ protected void registerBeanAndWireAndInjectParamsAndInvokeInitMethods(final BeanData beanData) { initBeanDefinition(beanData.definition()); beanData.scopeRegister(); beanData.invokeInitMethods(InitMethodInvocationStrategy.POST_CONSTRUCT); beanData.wireBean(); beanData.invokeInitMethods(InitMethodInvocationStrategy.POST_DEFINE); beanData.injectParams(paramManager, petiteConfig.isImplicitParamInjection()); beanData.invokeInitMethods(InitMethodInvocationStrategy.POST_INITIALIZE); beanData.invokeConsumerIfRegistered(); }
/** * Wires beans. */ public void wireBean() { if (definition().wiringMode == WiringMode.NONE) { return; } wireProperties(); wireSets(); wireMethods(); }
/** * Returns Petite bean instance. * Petite container will find the bean in corresponding scope and all its dependencies, * either by constructor or property injection. When using constructor injection, cyclic dependencies * can not be prevented, but at least they are detected. * * @see PetiteContainer#createBean(Class) */ public <T> T getBean(final String name) { // Lookup for registered bean definition. BeanDefinition def = lookupBeanDefinition(name); if (def == null) { // try provider ProviderDefinition providerDefinition = providers.get(name); if (providerDefinition != null) { return (T) invokeProvider(providerDefinition); } return null; } // Find the bean in its scope Object bean = def.scopeLookup(); if (bean == null) { // Create new bean in the scope initBeanDefinition(def); final BeanData beanData = new BeanData(this, def); registerBeanAndWireAndInjectParamsAndInvokeInitMethods(beanData); bean = beanData.bean(); } return (T) bean; }
/** * Invokes single method injection point on given bean with given bean definition. */ protected void wireMethods() { for (final MethodInjectionPoint methodRef : definition().methods) { invokeMethodInjectionPoint(methodRef); } }
/** * Invokes the method of some bean with the container, when its parameters requires to be injected into. * The bean is <b>not</b> registered within container. */ public <T> T invokeMethod(final Object bean, final Method method) { final WiringMode wiringMode = petiteConfig.resolveWiringMode(null); final BeanDefinition def = externalsCache.get( bean.getClass(), () -> { final BeanDefinition beanDefinition = createBeandDefinitionForExternalBeans(bean.getClass(), wiringMode); initBeanDefinition(beanDefinition); return beanDefinition; }); final BeanData beanData = new BeanData(this, def, bean); for (MethodInjectionPoint methodInjectionPoint : def.methods) { if (methodInjectionPoint.method.equals(method)) { return (T) beanData.invokeMethodInjectionPoint(methodInjectionPoint); } } try { return (T) method.invoke(bean); } catch (Exception e) { throw new PetiteException(e); } }
protected void wireSets() { for (final SetInjectionPoint sip : definition().sets) { String[] beanNames = pc.resolveBeanNamesForType(sip.targetClass); Collection beans = sip.createSet(beanNames.length); for (String beanName : beanNames) { if (!beanName.equals(definition().name)) { Object value = pc.getBean(beanName); beans.add(value); } } //BeanUtil.setDeclaredProperty(bean, sip.field.getName(), beans); final Setter setter = sip.propertyDescriptor.getSetter(true); try { setter.invokeSetter(bean, beans); } catch (Exception ex) { throw new PetiteException("Wiring failed", ex); } } }
public BeanData(final PetiteContainer petiteContainer, final BeanDefinition<T> beanDefinition) { this.pc = petiteContainer; this.beanDefinition = beanDefinition; this.bean = (T) newBeanInstance(); }
/** * Creates and wires a bean within the container and optionally invokes init methods. However, bean is * <b>not</b> registered. */ @SuppressWarnings({"unchecked"}) public <E> E createBean(final Class<E> type, final WiringMode wiringMode) { final WiringMode finalWiringMode = petiteConfig.resolveWiringMode(wiringMode); final BeanDefinition def = externalsCache.get( type, () -> { final BeanDefinition beanDefinition = createBeandDefinitionForExternalBeans(type, finalWiringMode); initBeanDefinition(beanDefinition); return beanDefinition; }); final BeanData<E> beanData = new BeanData(this, def); registerBeanAndWireAndInjectParamsAndInvokeInitMethods(beanData); return beanData.bean(); }
@Override public void register(final BeanDefinition beanDefinition, final Object bean) { Map<String, BeanData> threadLocalMap = context.get(); threadLocalMap.put(beanDefinition.name(), new BeanData(pc, beanDefinition, bean)); }
@Override public Object lookup(final String name) { Map<String, BeanData> threadLocalMap = context.get(); BeanData beanData = threadLocalMap.get(name); if (beanData == null) { return null; } return beanData.bean(); }