Author: struberg
Date: Wed Mar 2 22:02:21 2011
New Revision: 1076423
URL: http://svn.apache.org/viewvc?rev=1076423&view=rev
Log:
OWB-538 lazily initialize auto @Dependent beans with no CDI usage
we can lazy init pojos with no CDI annotation at all
Modified:
openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/component/EjbBeanCreatorImpl.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractOwbBean.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/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/container/BeanManagerImpl.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java
openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/jsf/JSFUtil.java
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=1076423&r1=1076422&r2=1076423&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
Wed Mar 2 22:02:21 2011
@@ -60,7 +60,7 @@ public class EjbBeanCreatorImpl<T> exten
{
try
{
- super.defineScopeType(errorMessage);
+ super.defineScopeType(errorMessage);
}
catch(WebBeansPassivationException e)
{
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractOwbBean.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractOwbBean.java?rev=1076423&r1=1076422&r2=1076423&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractOwbBean.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractOwbBean.java
Wed Mar 2 22:02:21 2011
@@ -94,7 +94,8 @@ public abstract class AbstractOwbBean<T>
/**Beans injection points*/
protected Set<InjectionPoint> injectionPoints = new
HashSet<InjectionPoint>();
-
+
+
/**
* This string will be used for passivating the Bean.
* It will be created on the first use.
@@ -104,7 +105,6 @@ public abstract class AbstractOwbBean<T>
private final WebBeansContext webBeansContext;
-
/**
* Constructor definiton. Each subclass redefines its own constructor with
* calling this.
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=1076423&r1=1076422&r2=1076423&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
Wed Mar 2 22:02:21 2011
@@ -26,6 +26,7 @@ import javassist.util.proxy.ProxyObject;
import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.spi.Decorator;
+import org.apache.webbeans.component.creation.AnnotatedTypeBeanCreatorImpl;
import org.apache.webbeans.config.WebBeansContext;
import org.apache.webbeans.decorator.AbstractDecoratorMethodHandler;
import org.apache.webbeans.inject.InjectableConstructor;
@@ -43,6 +44,17 @@ public class ManagedBean<T> extends Abst
protected boolean isAbstractDecorator;
+ /**
+ * Whether the bean is fully initialized or not yet.
+ * Only beans scanned from the classpath can be lazily initialized,
+ * and only if they do _NOT_ contain any javax.inject or javax.enterprise
+ * annotation! In other words: we can skip eager initialisation for
+ * beans which only could picked up as auto-@Dependent beans which
+ * do not register/ any other beans (e.g. via @Produces)
+ */
+ private boolean fullInit = true;
+
+
public ManagedBean(Class<T> returnType, WebBeansContext webBeansContext)
{
this(returnType, WebBeansType.MANAGED, webBeansContext);
@@ -69,6 +81,16 @@ public class ManagedBean<T> extends Abst
@Override
protected T createComponentInstance(CreationalContext<T> creationalContext)
{
+ if (!fullInit)
+ {
+ AnnotatedTypeBeanCreatorImpl<T> managedBeanCreator = new
AnnotatedTypeBeanCreatorImpl<T>(this);
+ managedBeanCreator.setAnnotatedType(getAnnotatedType());
+
+
getWebBeansContext().getWebBeansUtil().initializeManagedBean(getBeanClass(),
this, managedBeanCreator);
+ fullInit = true;
+ }
+
+
Constructor<T> con = getConstructor();
InjectableConstructor<T> ic = new InjectableConstructor<T>(con,
this,creationalContext);
@@ -83,7 +105,16 @@ public class ManagedBean<T> extends Abst
return instance;
}
-
+ public boolean isFullInit()
+ {
+ return fullInit;
+ }
+
+ public void setFullInit(boolean fullInit)
+ {
+ this.fullInit = fullInit;
+ }
+
/**
* 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=1076423&r1=1076422&r2=1076423&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
Wed Mar 2 22:02:21 2011
@@ -47,8 +47,9 @@ public class AbstractBeanCreator<T> impl
/**Bean annotations*/
private final Annotation[] beanAnnotations;
- /**If annotated type is set by ProcessAnnotatedType event, used this
annotated type
- * to define bean instance intead of using class artifacts.
+ /**
+ * If annotated type is set by ProcessAnnotatedType event, used this
annotated type
+ * to define bean instance instead of using class artifacts.
*/
private AnnotatedType<T> annotatedType;
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=1076423&r1=1076422&r2=1076423&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
Wed Mar 2 22:02:21 2011
@@ -823,7 +823,7 @@ public class BeansDeployer
else
{
webBeansContext.getWebBeansUtil().defineDecorator(managedBeanCreator,
-
processInjectionTargetEvent);
+
processInjectionTargetEvent);
}
}
//Interceptor
@@ -840,7 +840,7 @@ public class BeansDeployer
else
{
webBeansContext.getWebBeansUtil().defineInterceptor(managedBeanCreator,
-
processInjectionTargetEvent);
+
processInjectionTargetEvent);
}
}
else
@@ -856,14 +856,14 @@ public class BeansDeployer
logger.debug("Found Managed Bean with class name : [{0}]",
annotatedType.getJavaClass().getName());
}
webBeansContext.getWebBeansUtil().defineManagedBean(managedBeanCreator,
-
processInjectionTargetEvent);
+
processInjectionTargetEvent);
}
return true;
}
- //Not a managed bean
else
{
+ //Not a managed bean
return false;
}
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=1076423&r1=1076422&r2=1076423&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
Wed Mar 2 22:02:21 2011
@@ -58,6 +58,7 @@ import org.apache.webbeans.component.Abs
import org.apache.webbeans.component.AbstractInjectionTargetBean;
import org.apache.webbeans.component.AbstractProducerBean;
import org.apache.webbeans.component.EnterpriseBeanMarker;
+import org.apache.webbeans.component.ManagedBean;
import org.apache.webbeans.component.OwbBean;
import org.apache.webbeans.component.InjectionTargetBean;
import org.apache.webbeans.component.ProducerFieldBean;
@@ -503,11 +504,80 @@ 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 &&
!useCdiAnnotations(component.getBeanClass()))
+ {
+ ((ManagedBean) component).setFullInit(false);
+ }
+ }
+ }
+ }
+
+ }
+
+ /**
+ * Check if the bean uses CDI features
+ * @param cls the Class to check
+ * @return <code>true</code> if the bean uses CDI annotations somewhere
+ */
+ private static boolean useCdiAnnotations(Class<?> cls)
+ {
+ Class superClass = cls.getSuperclass();
+ if ( superClass != Object.class && useCdiAnnotations(superClass))
+ {
+ return true;
+ }
+
+ if (containsCdiAnnotation(cls.getAnnotations()))
+ {
+ return true;
+ }
+
+ Field[] fields = cls.getDeclaredFields();
+ for (Field field : fields)
+ {
+ if (containsCdiAnnotation(field.getAnnotations()))
+ {
+ return true;
+ }
+ }
+
+ Method[] methods = cls.getDeclaredMethods();
+ for (Method method : methods)
+ {
+ if (containsCdiAnnotation(method.getAnnotations()))
+ {
+ return true;
+ }
+ }
+
+ //X TODO also check method parameters?
+
+ return false;
+ }
+
+ /**
+ * A CDI annotation must either start with 'javax.inject.' or
'javax.enterprise'
+ * @return true if at least one of the given annotations is a CDI
annotation
+ */
+ private static boolean containsCdiAnnotation(Annotation[] annotations)
+ {
+ if (annotations != null && annotations.length > 0)
+ {
+ for (Annotation ann : annotations)
+ {
+ String annName = ann.toString();
+ if (annName.startsWith("@javax.inject") ||
annName.startsWith("@javax.enterprise"))
+ {
+ return true;
}
}
}
+ return false;
}
/**
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=1076423&r1=1076422&r2=1076423&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
Wed Mar 2 22:02:21 2011
@@ -143,6 +143,8 @@ 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");
+ // we fully initialize the bean in this case.
+ component.setFullInit(true);
WebBeansUtil.checkGenericType(component);
DefinitionUtil.defineQualifiers(component, clazzAnns);
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java?rev=1076423&r1=1076422&r2=1076423&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java
Wed Mar 2 22:02:21 2011
@@ -183,6 +183,7 @@ public class BeanManagerImpl implements
*/
private boolean inUse = false;
+
/**
* Creates a new {@link BeanManager} instance.
* Called by the system. Do not use outside of the
@@ -1097,6 +1098,11 @@ public class BeanManagerImpl implements
{
InjectionTargetBean<T> bean =
webBeansContext.getWebBeansUtil().defineManagedBean(type);
+ if (bean == null)
+ {
+ throw new DefinitionException("Could not create
InjectionTargetBean for type " + type.getJavaClass());
+ }
+
return new InjectionTargetProducer<T>(bean);
}
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=1076423&r1=1076422&r2=1076423&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
Wed Mar 2 22:02:21 2011
@@ -138,6 +138,7 @@ import org.apache.webbeans.exception.Web
import org.apache.webbeans.exception.WebBeansException;
import org.apache.webbeans.exception.helper.ViolationMessageBuilder;
import org.apache.webbeans.exception.inject.DefinitionException;
+import org.apache.webbeans.exception.inject.DeploymentException;
import
org.apache.webbeans.exception.inject.InconsistentSpecializationException;
import org.apache.webbeans.exception.inject.NullableDependencyException;
import org.apache.webbeans.inject.AlternativesManager;
@@ -2133,6 +2134,11 @@ public final class WebBeansUtil
webBeansContext.getAnnotationManager().getInterceptorBindingMetaAnnotations(
clazz.getDeclaredAnnotations()));
}
+ else
+ {
+ // TODO could probably be a bit more descriptive
+ throw new DeploymentException("Cannot create Interceptor for
class" + injectionTargetEvent.getAnnotatedType());
+ }
}
}
@@ -2168,7 +2174,8 @@ public final class WebBeansUtil
}
else
{
- logger.trace("Unable to configure decorator with class :
[{0}]", clazz);
+ // TODO could probably be a bit more descriptive
+ throw new DeploymentException("Cannot create Decorator for
class" + processInjectionTargetEvent.getAnnotatedType());
}
}
}
@@ -2783,6 +2790,11 @@ public final class WebBeansUtil
{
ManagedBean<T> bean = defineManagedBean(managedBeanCreator,
processInjectionTargetEvent);
+ if (bean == null)
+ {
+ // TODO could probably be a bit more descriptive
+ throw new DeploymentException("Cannot create ManagedBean for
class" + processInjectionTargetEvent.getAnnotatedType());
+ }
//X TODO move proxy instance creation into JavassistProxyFactory!
Class clazz =
webBeansContext.getJavassistProxyFactory().createAbstractDecoratorProxyClass(bean);
@@ -2802,13 +2814,16 @@ public final class WebBeansUtil
ManagedBean<T> managedBean = managedBeanCreator.getBean();
Class<T> clazz = annotatedType.getJavaClass();
- managedBeanCreator.defineSerializable();
-
//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);
+
+ managedBeanCreator.defineSerializable();
+
//Check for Enabled via Alternative
setInjectionTargetBeanEnableFlag(managedBean);
@@ -2932,14 +2947,15 @@ public final class WebBeansUtil
ManagedBeanCreatorImpl<T> managedBeanCreator = new
ManagedBeanCreatorImpl<T>(managedBean);
managedBeanCreator.setAnnotatedType(type);
- managedBeanCreator.defineSerializable();
-
//Define meta-data
managedBeanCreator.defineStereoTypes();
//Scope type
managedBeanCreator.defineScopeType(logger.getTokenString(OWBLogConst.TEXT_MB_IMPL)
+ clazz.getName() +
logger.getTokenString(OWBLogConst.TEXT_SAME_SCOPE));
+
+ managedBeanCreator.defineSerializable();
+
//Check for Enabled via Alternative
setInjectionTargetBeanEnableFlag(managedBean);
managedBeanCreator.defineApiType();
@@ -3090,14 +3106,25 @@ public final class WebBeansUtil
AnnotatedTypeBeanCreatorImpl<T> managedBeanCreator = new
AnnotatedTypeBeanCreatorImpl<T>(managedBean);
managedBeanCreator.setAnnotatedType(type);
- managedBeanCreator.defineSerializable();
-
//Define meta-data
managedBeanCreator.defineStereoTypes();
//Scope type
managedBeanCreator.defineScopeType(logger.getTokenString(OWBLogConst.TEXT_MB_IMPL)
+ clazz.getName()
+
logger.getTokenString(OWBLogConst.TEXT_SAME_SCOPE));
+
+ 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();
@@ -3114,10 +3141,9 @@ public final class WebBeansUtil
DefinitionUtil.defineBeanInterceptorStack(managedBean);
managedBeanCreator.defineDisposalMethods();//Define disposal method
after adding producers
-
- return managedBean;
}
+
@SuppressWarnings("unchecked")
public <T> ManagedBean<T> defineAbstractDecorator(AnnotatedType<T> type)
{
Modified:
openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/jsf/JSFUtil.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/jsf/JSFUtil.java?rev=1076423&r1=1076422&r2=1076423&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/jsf/JSFUtil.java
(original)
+++
openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/jsf/JSFUtil.java
Wed Mar 2 22:02:21 2011
@@ -187,7 +187,9 @@ public final class JSFUtil
String cid = getJSFRequestParameter("cid");
return cid;
}
-
+
+ /** use {@link org.apache.webbeans.container.BeanManagerImpl#isInUse()}
instead */
+ @Deprecated
public static boolean isOwbApplication()
{
ServletContext context = null;