You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by st...@apache.org on 2011/03/04 01:02:13 UTC

svn commit: r1076897 - in /openwebbeans/trunk: samples/ejb-sample/src/main/java/org/apache/webbeans/sample/bean/ webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/component/ webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/util/ webbea...

Author: struberg
Date: Fri Mar  4 00:02:13 2011
New Revision: 1076897

URL: http://svn.apache.org/viewvc?rev=1076897&view=rev
Log:
OWB-538 allow lazy initialisation of default scoped beans

work in progress. All tests pass, but a few TCK tests are broken atm

Modified:
    openwebbeans/trunk/samples/ejb-sample/src/main/java/org/apache/webbeans/sample/bean/EchoManaged.java
    openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/component/EjbBeanCreatorImpl.java
    openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/util/EjbUtility.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ManagedBean.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractBeanCreator.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/BeanCreator.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/DefinitionUtil.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/ManagedBeanConfigurator.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansAnnotatedTypeUtil.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java

Modified: openwebbeans/trunk/samples/ejb-sample/src/main/java/org/apache/webbeans/sample/bean/EchoManaged.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/samples/ejb-sample/src/main/java/org/apache/webbeans/sample/bean/EchoManaged.java?rev=1076897&r1=1076896&r2=1076897&view=diff
==============================================================================
--- openwebbeans/trunk/samples/ejb-sample/src/main/java/org/apache/webbeans/sample/bean/EchoManaged.java (original)
+++ openwebbeans/trunk/samples/ejb-sample/src/main/java/org/apache/webbeans/sample/bean/EchoManaged.java Fri Mar  4 00:02:13 2011
@@ -21,6 +21,7 @@ package org.apache.webbeans.sample.bean;
 import javax.ejb.EJB;
 import javax.enterprise.context.RequestScoped;
 import javax.enterprise.inject.Default;
+import javax.enterprise.inject.spi.BeanManager;
 import javax.inject.Inject;
 import javax.inject.Named;
 import javax.enterprise.inject.Produces;
@@ -28,8 +29,6 @@ import javax.enterprise.inject.spi.Bean;
 import javax.persistence.EntityManagerFactory;
 import javax.persistence.PersistenceUnit;
 
-import org.apache.webbeans.config.WebBeansContext;
-import org.apache.webbeans.container.BeanManagerImpl;
 import org.apache.webbeans.sample.ejb.Echo;
 import org.apache.webbeans.sample.injection.InjectionTargetBean;
 
@@ -39,6 +38,8 @@ import org.apache.webbeans.sample.inject
 public class EchoManaged
 {
     private @Inject @Default Echo echo;
+
+    private @Inject BeanManager manager;
     
     private @EJB(name="EchoBean/org.apache.webbeans.sample.ejb.Echo") Echo nonContextual;
     
@@ -60,7 +61,6 @@ public class EchoManaged
 
     public String echo()
     {
-        BeanManagerImpl manager = WebBeansContext.getInstance().getBeanManagerImpl();
         Bean<?> b = manager.getBeans("injected").iterator().next();
         InjectionTargetBean bean = (InjectionTargetBean)manager.getReference(b, InjectionTargetBean.class, manager.createCreationalContext(b)); 
         

Modified: openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/component/EjbBeanCreatorImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/component/EjbBeanCreatorImpl.java?rev=1076897&r1=1076896&r2=1076897&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/component/EjbBeanCreatorImpl.java (original)
+++ openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/component/EjbBeanCreatorImpl.java Fri Mar  4 00:02:13 2011
@@ -56,11 +56,11 @@ public class EjbBeanCreatorImpl<T> exten
      * {@inheritDoc}
      */
     @Override
-    public void defineScopeType(String errorMessage) throws WebBeansPassivationException
+    public void defineScopeType(String errorMessage, boolean allowLazyInit) throws WebBeansPassivationException
     {
         try
         {
-            super.defineScopeType(errorMessage);
+            super.defineScopeType(errorMessage, allowLazyInit);
         }
         catch(WebBeansPassivationException e)
         {

Modified: openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/util/EjbUtility.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/util/EjbUtility.java?rev=1076897&r1=1076896&r2=1076897&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/util/EjbUtility.java (original)
+++ openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/util/EjbUtility.java Fri Mar  4 00:02:13 2011
@@ -88,7 +88,7 @@ public final class EjbUtility
         ejbBeanCreator.defineSerializable();
         ejbBeanCreator.defineStereoTypes();
         ejbBeanCreator.defineApiType();
-        ejbBeanCreator.defineScopeType("Session Bean implementation class : " + clazz.getName() + " stereotypes must declare same @ScopeType annotations");
+        ejbBeanCreator.defineScopeType("Session Bean implementation class : " + clazz.getName() + " stereotypes must declare same @ScopeType annotations", false);
         ejbBeanCreator.defineQualifier();
         ejbBeanCreator.defineName(WebBeansUtil.getManagedBeanDefaultName(clazz.getSimpleName()));            
         Set<ProducerMethodBean<?>> producerMethodBeans = ejbBeanCreator.defineProducerMethods();        

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ManagedBean.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ManagedBean.java?rev=1076897&r1=1076896&r2=1076897&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ManagedBean.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ManagedBean.java Fri Mar  4 00:02:13 2011
@@ -20,13 +20,16 @@ package org.apache.webbeans.component;
 
 import java.io.Serializable;
 import java.lang.reflect.Constructor;
+import java.lang.annotation.Annotation;
 
 import javassist.util.proxy.ProxyObject;
 
 import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.inject.Any;
+import javax.enterprise.inject.Default;
 import javax.enterprise.inject.spi.Decorator;
 
-import org.apache.webbeans.component.creation.AnnotatedTypeBeanCreatorImpl;
+import org.apache.webbeans.component.creation.ManagedBeanCreatorImpl;
 import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.decorator.AbstractDecoratorMethodHandler;
 import org.apache.webbeans.inject.InjectableConstructor;
@@ -83,10 +86,10 @@ public class ManagedBean<T> extends Abst
     {
         if (!fullInit)
         {
-            AnnotatedTypeBeanCreatorImpl<T> managedBeanCreator = new AnnotatedTypeBeanCreatorImpl<T>(this);
+            ManagedBeanCreatorImpl<T> managedBeanCreator = new ManagedBeanCreatorImpl<T>(this);
             managedBeanCreator.setAnnotatedType(getAnnotatedType());
 
-            getWebBeansContext().getWebBeansUtil().initializeManagedBean(getBeanClass(), this, managedBeanCreator);
+            getWebBeansContext().getWebBeansUtil().lazyInitializeManagedBean(getBeanClass(), this, managedBeanCreator);
             fullInit = true;
         }
 
@@ -115,6 +118,17 @@ public class ManagedBean<T> extends Abst
         this.fullInit = fullInit;
     }
 
+    @Override
+    public void addQualifier(Annotation qualifier)
+    {
+        if (!(qualifier instanceof Default || qualifier instanceof Any))
+        {
+            // if a bean defines other qualifiers than Default or Any, we need to fully initialize it
+            fullInit = true;
+        }
+        super.addQualifier(qualifier);
+    }
+
     /**
      * Get constructor.
      * 

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractBeanCreator.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractBeanCreator.java?rev=1076897&r1=1076896&r2=1076897&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractBeanCreator.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractBeanCreator.java Fri Mar  4 00:02:13 2011
@@ -130,15 +130,15 @@ public class AbstractBeanCreator<T> impl
      * {@inheritDoc}
      */
     @Override
-    public void defineScopeType(String errorMessage)
+    public void defineScopeType(String errorMessage, boolean allowLazyInit)
     {
         if(isDefaultMetaDataProvider())
         {
-            DefinitionUtil.defineScopeType(this.bean, this.beanAnnotations, errorMessage);
+            DefinitionUtil.defineScopeType(this.bean, this.beanAnnotations, errorMessage, allowLazyInit);
         }
         else
         {
-            DefinitionUtil.defineScopeType(this.bean, AnnotationUtil.getAnnotationsFromSet(this.annotatedType.getAnnotations()), errorMessage);
+            DefinitionUtil.defineScopeType(this.bean, AnnotationUtil.getAnnotationsFromSet(this.annotatedType.getAnnotations()), errorMessage, false);
         }
     }
 

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/BeanCreator.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/BeanCreator.java?rev=1076897&r1=1076896&r2=1076897&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/BeanCreator.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/BeanCreator.java Fri Mar  4 00:02:13 2011
@@ -86,7 +86,7 @@ public interface BeanCreator<T>
      * Check passivation related controls.
      * </p>
      */
-    public void defineScopeType(String errorMessage);
+    public void defineScopeType(String errorMessage, boolean allowLazyInit);
     
     /**
      * Defines qualifier.

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java?rev=1076897&r1=1076896&r2=1076897&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java Fri Mar  4 00:02:13 2011
@@ -856,7 +856,7 @@ public class BeansDeployer
                     logger.debug("Found Managed Bean with class name : [{0}]", annotatedType.getJavaClass().getName());
                 }
                 webBeansContext.getWebBeansUtil().defineManagedBean(managedBeanCreator,
-                                                                    processInjectionTargetEvent);
+                                                                    processInjectionTargetEvent, true);
             }
             
             return true;

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/DefinitionUtil.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/DefinitionUtil.java?rev=1076897&r1=1076896&r2=1076897&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/DefinitionUtil.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/DefinitionUtil.java Fri Mar  4 00:02:13 2011
@@ -32,6 +32,8 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.enterprise.context.Dependent;
 import javax.enterprise.context.NormalScope;
 import javax.enterprise.event.Observes;
@@ -315,7 +317,8 @@ public final class DefinitionUtil
      * @param component configuring web beans component
      * @param annotations annotations
      */
-    public static <T> void defineScopeType(AbstractOwbBean<T> component, Annotation[] annotations, String exceptionMessage)
+    public static <T> void defineScopeType(AbstractOwbBean<T> component, Annotation[] annotations,
+                                           String exceptionMessage, boolean allowLazyInit)
     {
         boolean found = false;
 
@@ -388,7 +391,7 @@ public final class DefinitionUtil
 
         if (!found)
         {
-            defineDefaultScopeType(component, exceptionMessage);
+            defineDefaultScopeType(component, exceptionMessage, allowLazyInit);
         }
     }
 
@@ -438,7 +441,7 @@ public final class DefinitionUtil
         
     }
 
-    public static void defineDefaultScopeType(OwbBean<?> component, String exceptionMessage)
+    public static void defineDefaultScopeType(OwbBean<?> component, String exceptionMessage, boolean allowLazyInit)
     {
         // Frist look for inherited scope
         IBeanInheritedMetaData metaData = null;
@@ -463,6 +466,13 @@ public final class DefinitionUtil
             if (stereos.size() == 0)
             {
                 component.setImplScopeType(new DependentScopeLiteral());
+
+                if (allowLazyInit && component instanceof ManagedBean && isPurePojoBean(component.getBeanClass()))
+                {
+                    // take the bean as Dependent but we could lazily initialize it
+                    // because the bean doesn't contains any CDI feature
+                    ((ManagedBean) component).setFullInit(false);
+                }
             }
             else
             {
@@ -506,12 +516,12 @@ public final class DefinitionUtil
                 }
                 else
                 {
-                    // take the bean as Dependent if
-                    // the bean contains at least one CDI feature
                     component.setImplScopeType(new DependentScopeLiteral());
 
-                    if (component instanceof ManagedBean && isPurePojoBean(component.getBeanClass()))
+                    if (allowLazyInit && component instanceof ManagedBean && isPurePojoBean(component.getBeanClass()))
                     {
+                        // take the bean as Dependent but we could lazily initialize it
+                        // because the bean doesn't contains any CDI feature
                         ((ManagedBean) component).setFullInit(false);
                     }
                 }
@@ -570,10 +580,26 @@ public final class DefinitionUtil
             anns = method.getAnnotations();
             for (Annotation ann : anns)
             {
-                if (ann instanceof Produces)
+                if (ann instanceof Produces      ||
+                    ann instanceof Inject        ||
+                    ann instanceof PostConstruct ||
+                    ann instanceof PreDestroy      )
                 {
                     return false;
                 }
+
+            }
+
+            Annotation[][] paramsAnns = method.getParameterAnnotations();
+            for (Annotation[] paramAnns: paramsAnns)
+            {
+                for (Annotation ann: paramAnns)
+                {
+                    if (ann instanceof Observes)
+                    {
+                        return false;
+                    }
+                }
             }
         }
 
@@ -733,7 +759,8 @@ public final class DefinitionUtil
 
     }
 
-    public static <T> ProducerMethodBean<T> createProducerComponent(Class<T> returnType, Method method, InjectionTargetBean<?> parent, boolean isSpecializes)
+    public static <T> ProducerMethodBean<T> createProducerComponent(Class<T> returnType, Method method, InjectionTargetBean<?> parent,
+                                                                    boolean isSpecializes)
     {
         ProducerMethodBean<T> component = new ProducerMethodBean<T>(parent, returnType);
         component.setCreatorMethod(method);
@@ -758,7 +785,7 @@ public final class DefinitionUtil
 
         DefinitionUtil.defineProducerMethodApiTypes(component, method.getGenericReturnType(), methodAnns);
         DefinitionUtil.defineScopeType(component, methodAnns, "WebBeans producer method : " + method.getName() + " in class " + parent.getReturnType().getName()
-                                                              + " must declare default @Scope annotation");
+                                                              + " must declare default @Scope annotation", false);
         webBeansContext.getWebBeansUtil().checkUnproxiableApiType(component, component.getScope());
         WebBeansUtil.checkProducerGenericType(component,method);
         DefinitionUtil.defineQualifiers(component, methodAnns);
@@ -815,7 +842,7 @@ public final class DefinitionUtil
 
         DefinitionUtil.defineProducerMethodApiTypes(component, field.getGenericType(), fieldAnns);
         DefinitionUtil.defineScopeType(component, fieldAnns, "WebBeans producer method : " + field.getName() + " in class " + parent.getReturnType().getName()
-                                                             + " must declare default @Scope annotation");
+                                                             + " must declare default @Scope annotation", false);
         webBeansContext.getWebBeansUtil().checkUnproxiableApiType(component, component.getScope());
         WebBeansUtil.checkProducerGenericType(component,field);
         DefinitionUtil.defineQualifiers(component, fieldAnns);
@@ -1321,7 +1348,7 @@ public final class DefinitionUtil
 
         DefinitionUtil.defineProducerMethodApiTypes(bean, method.getBaseType(), anns);
         DefinitionUtil.defineScopeType(bean, anns, "Bean producer method : " + method.getJavaMember().getName() + " in class "
-                                                   + parent.getReturnType().getName() + " must declare default @Scope annotation");
+                                                   + parent.getReturnType().getName() + " must declare default @Scope annotation", false);
         WebBeansUtil.checkProducerGenericType(bean,method.getJavaMember());        
         DefinitionUtil.defineQualifiers(bean, anns);
         DefinitionUtil.defineName(bean, anns, WebBeansUtil.getProducerDefaultName(method.getJavaMember().getName()));

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/ManagedBeanConfigurator.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/ManagedBeanConfigurator.java?rev=1076897&r1=1076896&r2=1076897&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/ManagedBeanConfigurator.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/ManagedBeanConfigurator.java Fri Mar  4 00:02:13 2011
@@ -142,7 +142,7 @@ public final class ManagedBeanConfigurat
 
         DefinitionUtil.defineApiTypes(component, clazz);
         DefinitionUtil.defineScopeType(component, clazzAnns, "Simple WebBean Component implementation class : " + clazz.getName()
-                                                             + " stereotypes must declare same @Scope annotations");
+                                                             + " stereotypes must declare same @Scope annotations", false);
         // we fully initialize the bean in this case.
         component.setFullInit(true);
 

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansAnnotatedTypeUtil.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansAnnotatedTypeUtil.java?rev=1076897&r1=1076896&r2=1076897&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansAnnotatedTypeUtil.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansAnnotatedTypeUtil.java Fri Mar  4 00:02:13 2011
@@ -453,7 +453,7 @@ public final class WebBeansAnnotatedType
                                                                                                       anns);
                     Set<Type> types = annotatedField.getTypeClosure();
                     producerFieldBean.getTypes().addAll(types);
-                    DefinitionUtil.defineScopeType(producerFieldBean, anns, "Annotated producer field: " + annotatedField +  "must declare default @Scope annotation");
+                    DefinitionUtil.defineScopeType(producerFieldBean, anns, "Annotated producer field: " + annotatedField +  "must declare default @Scope annotation", false);
                     webBeansContext.getWebBeansUtil().checkUnproxiableApiType(producerFieldBean,
                                                                                              producerFieldBean.getScope());
                     WebBeansUtil.checkProducerGenericType(producerFieldBean,annotatedField.getJavaMember());
@@ -516,7 +516,8 @@ public final class WebBeansAnnotatedType
                 producerMethodBean.getTypes().addAll(types);
                 DefinitionUtil.defineScopeType(producerMethodBean,
                                                AnnotationUtil.getAnnotationsFromSet(annotatedMethod.getAnnotations()),
-                                                                                    "Annotated producer method : " + annotatedMethod +  "must declare default @Scope annotation");
+                                                                                    "Annotated producer method : " + annotatedMethod +  "must declare default @Scope annotation",
+                                                                                    false);
                 webBeansContext.getWebBeansUtil().checkUnproxiableApiType(producerMethodBean,
                                                                                          producerMethodBean.getScope());
                 WebBeansUtil.checkProducerGenericType(producerMethodBean,annotatedMethod.getJavaMember());

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java?rev=1076897&r1=1076896&r2=1076897&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java Fri Mar  4 00:02:13 2011
@@ -2126,7 +2126,7 @@ public final class WebBeansUtil
             ManagedBean<T> component = null;
 
             webBeansContext.getInterceptorUtil().checkInterceptorConditions(clazz);
-            component = defineManagedBean(managedBeanCreator, injectionTargetEvent);
+            component = defineManagedBean(managedBeanCreator, injectionTargetEvent, false);
 
             if (component != null)
             {
@@ -2165,7 +2165,7 @@ public final class WebBeansUtil
             }
             else
             {
-                delegate = defineManagedBean(creator, processInjectionTargetEvent);
+                delegate = defineManagedBean(creator, processInjectionTargetEvent, false);
             }
 
             if (delegate != null)
@@ -2789,7 +2789,7 @@ public final class WebBeansUtil
     public <T> ManagedBean<T> defineAbstractDecorator(ManagedBeanCreatorImpl<T> managedBeanCreator, ProcessInjectionTarget<T> processInjectionTargetEvent)
     {
 
-        ManagedBean<T> bean = defineManagedBean(managedBeanCreator, processInjectionTargetEvent);
+        ManagedBean<T> bean = defineManagedBean(managedBeanCreator, processInjectionTargetEvent, false);
         if (bean == null)
         {
             // TODO could probably be a bit more descriptive
@@ -2805,133 +2805,155 @@ public final class WebBeansUtil
     }
 
 
-    public <T> ManagedBean<T> defineManagedBean(ManagedBeanCreatorImpl<T> managedBeanCreator, ProcessInjectionTarget<T> processInjectionTargetEvent)
+    public <T> ManagedBean<T> defineManagedBean(ManagedBeanCreatorImpl<T> managedBeanCreator, ProcessInjectionTarget<T> processInjectionTargetEvent, boolean allowLazyInit)
     {
         BeanManagerImpl manager = webBeansContext.getBeanManagerImpl();
 
         //Annotated type
         AnnotatedType<T> annotatedType = processInjectionTargetEvent.getAnnotatedType();
         ManagedBean<T> managedBean = managedBeanCreator.getBean();
+
         Class<T> clazz = annotatedType.getJavaClass();
 
+        managedBeanCreator.defineApiType();
+
         //Define meta-data
         managedBeanCreator.defineStereoTypes();
         //Scope type
         managedBeanCreator.defineScopeType(logger.getTokenString(OWBLogConst.TEXT_MB_IMPL) + clazz.getName() +
-                logger.getTokenString(OWBLogConst.TEXT_SAME_SCOPE));
-
-        managedBean.setFullInit(true);
+                                           logger.getTokenString(OWBLogConst.TEXT_SAME_SCOPE), allowLazyInit);
 
         managedBeanCreator.defineSerializable();
 
         //Check for Enabled via Alternative
         setInjectionTargetBeanEnableFlag(managedBean);
 
-        managedBeanCreator.defineApiType();
         managedBeanCreator.checkCreateConditions();
         managedBeanCreator.defineQualifier();
         managedBeanCreator.defineName(WebBeansUtil.getManagedBeanDefaultName(clazz.getSimpleName()));
-        managedBeanCreator.defineConstructor();
-        Set<ProducerMethodBean<?>> producerMethods = managedBeanCreator.defineProducerMethods();
-        Set<ProducerFieldBean<?>> producerFields = managedBeanCreator.defineProducerFields();
-        managedBeanCreator.defineInjectedFields();
-        managedBeanCreator.defineInjectedMethods();
 
-        Set<ObserverMethod<?>> observerMethods = new HashSet<ObserverMethod<?>>();
-        if(managedBean.isEnabled())
+        if (managedBean.isFullInit())
         {
-            observerMethods = managedBeanCreator.defineObserverMethods();
-        }
+            managedBeanCreator.defineConstructor();
+            Set<ProducerMethodBean<?>> producerMethods = managedBeanCreator.defineProducerMethods();
+            Set<ProducerFieldBean<?>> producerFields = managedBeanCreator.defineProducerFields();
+            managedBeanCreator.defineInjectedFields();
+            managedBeanCreator.defineInjectedMethods();
+
+            Set<ObserverMethod<?>> observerMethods = new HashSet<ObserverMethod<?>>();
+            if(managedBean.isEnabled())
+            {
+                observerMethods = managedBeanCreator.defineObserverMethods();
+            }
 
-        //Put final InjectionTarget instance
-        manager.putInjectionTargetWrapper(managedBean,
-                new InjectionTargetWrapper(processInjectionTargetEvent.getInjectionTarget()));
+            //Put final InjectionTarget instance
+            manager.putInjectionTargetWrapper(managedBean,
+                    new InjectionTargetWrapper(processInjectionTargetEvent.getInjectionTarget()));
 
-        Map<ProducerMethodBean<?>,AnnotatedMethod<?>> annotatedMethods =
-                new HashMap<ProducerMethodBean<?>, AnnotatedMethod<?>>();
+            Map<ProducerMethodBean<?>,AnnotatedMethod<?>> annotatedMethods =
+                    new HashMap<ProducerMethodBean<?>, AnnotatedMethod<?>>();
 
-        for(ProducerMethodBean<?> producerMethod : producerMethods)
-        {
-            AnnotatedMethod<?> method = webBeansContext.getAnnotatedElementFactory().newAnnotatedMethod(producerMethod.getCreatorMethod(),
-                                                                                   annotatedType);
-            ProcessProducerImpl<?, ?> producerEvent = fireProcessProducerEventForMethod(producerMethod,
-                                                                                                    method);
-            inspectErrorStack("There are errors that are added by ProcessProducer event observers for "
-                                           + "ProducerMethods. Look at logs for further details");
+            for(ProducerMethodBean<?> producerMethod : producerMethods)
+            {
+                AnnotatedMethod<?> method = webBeansContext.getAnnotatedElementFactory().newAnnotatedMethod(producerMethod.getCreatorMethod(),
+                                                                                       annotatedType);
+                ProcessProducerImpl<?, ?> producerEvent = fireProcessProducerEventForMethod(producerMethod,
+                                                                                                        method);
+                inspectErrorStack("There are errors that are added by ProcessProducer event observers for "
+                                               + "ProducerMethods. Look at logs for further details");
 
-            annotatedMethods.put(producerMethod, method);
-            manager.putInjectionTargetWrapper(producerMethod, new InjectionTargetWrapper(producerEvent.getProducer()));
+                annotatedMethods.put(producerMethod, method);
+                manager.putInjectionTargetWrapper(producerMethod, new InjectionTargetWrapper(producerEvent.getProducer()));
 
-            producerEvent.setProducerSet(false);
-        }
+                producerEvent.setProducerSet(false);
+            }
 
-        Map<ProducerFieldBean<?>,AnnotatedField<?>> annotatedFields =
-                new HashMap<ProducerFieldBean<?>, AnnotatedField<?>>();
+            Map<ProducerFieldBean<?>,AnnotatedField<?>> annotatedFields =
+                    new HashMap<ProducerFieldBean<?>, AnnotatedField<?>>();
 
-        for(ProducerFieldBean<?> producerField : producerFields)
-        {
-            AnnotatedField<?> field = webBeansContext.getAnnotatedElementFactory().newAnnotatedField(producerField.getCreatorField(),
-                                                                                annotatedType);
-            ProcessProducerImpl<?, ?> producerEvent = fireProcessProducerEventForField(producerField,
-                                                                                                    field);
-            inspectErrorStack("There are errors that are added by ProcessProducer event observers for"
-                                           + " ProducerFields. Look at logs for further details");
+            for(ProducerFieldBean<?> producerField : producerFields)
+            {
+                AnnotatedField<?> field = webBeansContext.getAnnotatedElementFactory().newAnnotatedField(producerField.getCreatorField(),
+                                                                                    annotatedType);
+                ProcessProducerImpl<?, ?> producerEvent = fireProcessProducerEventForField(producerField,
+                                                                                                        field);
+                inspectErrorStack("There are errors that are added by ProcessProducer event observers for"
+                                               + " ProducerFields. Look at logs for further details");
 
-            annotatedFields.put(producerField, field);
-            manager.putInjectionTargetWrapper(producerField, new InjectionTargetWrapper(producerEvent.getProducer()));
+                annotatedFields.put(producerField, field);
+                manager.putInjectionTargetWrapper(producerField, new InjectionTargetWrapper(producerEvent.getProducer()));
 
-            producerEvent.setProducerSet(false);
-        }
+                producerEvent.setProducerSet(false);
+            }
 
-        Map<ObserverMethod<?>,AnnotatedMethod<?>> observerMethodsMap =
-                new HashMap<ObserverMethod<?>, AnnotatedMethod<?>>();
+            Map<ObserverMethod<?>,AnnotatedMethod<?>> observerMethodsMap =
+                    new HashMap<ObserverMethod<?>, AnnotatedMethod<?>>();
 
-        for(ObserverMethod<?> observerMethod : observerMethods)
-        {
-            ObserverMethodImpl<?> impl = (ObserverMethodImpl<?>)observerMethod;
-            AnnotatedMethod<?> method = webBeansContext.getAnnotatedElementFactory().newAnnotatedMethod(impl.getObserverMethod(),
-                                                                                   annotatedType);
+            for(ObserverMethod<?> observerMethod : observerMethods)
+            {
+                ObserverMethodImpl<?> impl = (ObserverMethodImpl<?>)observerMethod;
+                AnnotatedMethod<?> method = webBeansContext.getAnnotatedElementFactory().newAnnotatedMethod(impl.getObserverMethod(),
+                                                                                       annotatedType);
 
-            observerMethodsMap.put(observerMethod, method);
-        }
+                observerMethodsMap.put(observerMethod, method);
+            }
 
-        BeanManagerImpl beanManager = webBeansContext.getBeanManagerImpl();
+            BeanManagerImpl beanManager = webBeansContext.getBeanManagerImpl();
 
-        //Fires ProcessManagedBean
-        ProcessBeanImpl<T> processBeanEvent = new GProcessManagedBean(managedBean,annotatedType);
-        beanManager.fireEvent(processBeanEvent, new Annotation[0]);
-        inspectErrorStack("There are errors that are added by ProcessManagedBean event observers for " +
-                "managed beans. Look at logs for further details");
+            //Fires ProcessManagedBean
+            ProcessBeanImpl<T> processBeanEvent = new GProcessManagedBean(managedBean, annotatedType);
+            beanManager.fireEvent(processBeanEvent, new Annotation[0]);
+            inspectErrorStack("There are errors that are added by ProcessManagedBean event observers for " +
+                    "managed beans. Look at logs for further details");
 
-        //Fires ProcessProducerMethod
-        fireProcessProducerMethodBeanEvent(annotatedMethods, annotatedType);
-        inspectErrorStack("There are errors that are added by ProcessProducerMethod event observers for " +
-                "producer method beans. Look at logs for further details");
+            //Fires ProcessProducerMethod
+            fireProcessProducerMethodBeanEvent(annotatedMethods, annotatedType);
+            inspectErrorStack("There are errors that are added by ProcessProducerMethod event observers for " +
+                    "producer method beans. Look at logs for further details");
 
-        //Fires ProcessProducerField
-        fireProcessProducerFieldBeanEvent(annotatedFields);
-        inspectErrorStack("There are errors that are added by ProcessProducerField event observers for " +
-                "producer field beans. Look at logs for further details");
+            //Fires ProcessProducerField
+            fireProcessProducerFieldBeanEvent(annotatedFields);
+            inspectErrorStack("There are errors that are added by ProcessProducerField event observers for " +
+                    "producer field beans. Look at logs for further details");
 
-        //Fire ObservableMethods
-        fireProcessObservableMethodBeanEvent(observerMethodsMap);
-        inspectErrorStack("There are errors that are added by ProcessObserverMethod event observers for " +
-                "observer methods. Look at logs for further details");
+            //Fire ObservableMethods
+            fireProcessObservableMethodBeanEvent(observerMethodsMap);
+            inspectErrorStack("There are errors that are added by ProcessObserverMethod event observers for " +
+                    "observer methods. Look at logs for further details");
 
-        if(!isAnnotatedTypeDecoratorOrInterceptor(annotatedType))
-        {
-            beanManager.addBean(WebBeansUtil.createNewBean(managedBean));
-            beanManager.addBean(managedBean);
-            for (ProducerMethodBean<?> producerMethod : producerMethods)
+            if(!isAnnotatedTypeDecoratorOrInterceptor(annotatedType))
             {
-                // add them one after the other to enable serialization handling et al
-                beanManager.addBean(producerMethod);
+                beanManager.addBean(WebBeansUtil.createNewBean(managedBean));
+                beanManager.addBean(managedBean);
+                for (ProducerMethodBean<?> producerMethod : producerMethods)
+                {
+                    // add them one after the other to enable serialization handling et al
+                    beanManager.addBean(producerMethod);
+                }
+                managedBeanCreator.defineDisposalMethods();//Define disposal method after adding producers
+                for (ProducerFieldBean<?> producerField : producerFields)
+                {
+                    // add them one after the other to enable serialization handling et al
+                    beanManager.addBean(producerField);
+                }
             }
-            managedBeanCreator.defineDisposalMethods();//Define disposal method after adding producers
-            for (ProducerFieldBean<?> producerField : producerFields)
+        }
+        else
+        {
+            // we still need to fire a ProcessManagedBean event, even for lazily initiated beans
+            // (which most probably are no beans at all...)
+
+            BeanManagerImpl beanManager = webBeansContext.getBeanManagerImpl();
+
+            //Fires ProcessManagedBean
+            ProcessBeanImpl<T> processBeanEvent = new GProcessManagedBean(managedBean, annotatedType);
+            beanManager.fireEvent(processBeanEvent, new Annotation[0]);
+            inspectErrorStack("There are errors that are added by ProcessManagedBean event observers for " +
+                    "managed beans. Look at logs for further details");
+            if(!isAnnotatedTypeDecoratorOrInterceptor(annotatedType))
             {
-                // add them one after the other to enable serialization handling et al
-                beanManager.addBean(producerField);
+                beanManager.addBean(WebBeansUtil.createNewBean(managedBean));
+                beanManager.addBean(managedBean);
             }
         }
 
@@ -2947,18 +2969,19 @@ public final class WebBeansUtil
         ManagedBeanCreatorImpl<T> managedBeanCreator = new ManagedBeanCreatorImpl<T>(managedBean);
         managedBeanCreator.setAnnotatedType(type);
 
+        managedBeanCreator.defineApiType();
+
         //Define meta-data
         managedBeanCreator.defineStereoTypes();
 
         //Scope type
         managedBeanCreator.defineScopeType(logger.getTokenString(OWBLogConst.TEXT_MB_IMPL) + clazz.getName() +
-                logger.getTokenString(OWBLogConst.TEXT_SAME_SCOPE));
+                logger.getTokenString(OWBLogConst.TEXT_SAME_SCOPE), false);
 
         managedBeanCreator.defineSerializable();
 
         //Check for Enabled via Alternative
         setInjectionTargetBeanEnableFlag(managedBean);
-        managedBeanCreator.defineApiType();
         managedBeanCreator.checkCreateConditions();
         managedBeanCreator.defineQualifier();
         managedBeanCreator.defineName(WebBeansUtil.getManagedBeanDefaultName(clazz.getSimpleName()));
@@ -3106,28 +3129,19 @@ public final class WebBeansUtil
         AnnotatedTypeBeanCreatorImpl<T> managedBeanCreator = new AnnotatedTypeBeanCreatorImpl<T>(managedBean);
         managedBeanCreator.setAnnotatedType(type);
 
+        managedBeanCreator.defineApiType();
+
         //Define meta-data
         managedBeanCreator.defineStereoTypes();
 
         //Scope type
         managedBeanCreator.defineScopeType(logger.getTokenString(OWBLogConst.TEXT_MB_IMPL) + clazz.getName()
-                                           + logger.getTokenString(OWBLogConst.TEXT_SAME_SCOPE));                                        
+                                           + logger.getTokenString(OWBLogConst.TEXT_SAME_SCOPE), false);
 
-        if (managedBean.isFullInit())
-        {
-            initializeManagedBean(clazz, managedBean, managedBeanCreator);
-        }
-
-        return managedBean;
-    }
-
-    public void initializeManagedBean(Class<?> clazz, ManagedBean<?> managedBean, AnnotatedTypeBeanCreatorImpl<?> managedBeanCreator)
-    {
         managedBeanCreator.defineSerializable();
 
         //Check for Enabled via Alternative
         setInjectionTargetBeanEnableFlag(managedBean);
-        managedBeanCreator.defineApiType();
         managedBeanCreator.checkCreateConditions();
         managedBeanCreator.defineQualifier();
         managedBeanCreator.defineName(getManagedBeanDefaultName(clazz.getSimpleName()));
@@ -3140,7 +3154,23 @@ public final class WebBeansUtil
         DefinitionUtil.defineDecoratorStack(managedBean);
         DefinitionUtil.defineBeanInterceptorStack(managedBean);
 
-        managedBeanCreator.defineDisposalMethods();//Define disposal method after adding producers
+        managedBeanCreator.defineDisposalMethods(); //Define disposal method after adding producers
+
+        return managedBean;
+    }
+
+    public void lazyInitializeManagedBean(Class<?> clazz, ManagedBean<?> managedBean, ManagedBeanCreatorImpl<?> managedBeanCreator)
+    {
+        managedBeanCreator.defineConstructor();
+        managedBeanCreator.defineProducerMethods();
+        managedBeanCreator.defineProducerFields();
+        managedBeanCreator.defineInjectedFields();
+        managedBeanCreator.defineInjectedMethods();
+        managedBeanCreator.defineObserverMethods();
+        DefinitionUtil.defineDecoratorStack(managedBean);
+        DefinitionUtil.defineBeanInterceptorStack(managedBean);
+
+        managedBeanCreator.defineDisposalMethods(); //Define disposal method after adding producers
     }