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 2014/10/05 11:09:45 UTC
svn commit: r1629479 - in /openwebbeans/trunk/webbeans-impl/src:
main/java/org/apache/webbeans/intercept/ main/java/org/apache/webbeans/util/
test/java/org/apache/webbeans/test/component/decorator/clean/
test/java/org/apache/webbeans/test/component/eve...
Author: struberg
Date: Sun Oct 5 09:09:44 2014
New Revision: 1629479
URL: http://svn.apache.org/r1629479
Log:
OWB-1020 take class level interceptors if there is no own method interceptor.
This speeds up scanning of classes with interceptors and also reduces the memory footprint
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorResolutionService.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/AnnotationUtil.java
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/component/decorator/clean/ServiceDecorator.java
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/component/event/normal/TransactionalInterceptor.java
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/resolution/InterceptorResolutionServiceTest.java
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/performance/StartupPerformanceTest.java
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorResolutionService.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorResolutionService.java?rev=1629479&r1=1629478&r2=1629479&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorResolutionService.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorResolutionService.java Sun Oct 5 09:09:44 2014
@@ -109,9 +109,21 @@ public class InterceptorResolutionServic
decorators = Collections.emptyList(); // less to store
}
+ Set<Interceptor<?>> allUsedCdiInterceptors = new HashSet<Interceptor<?>>();
+
// pick up CDI interceptors from a class level
Set<Annotation> classInterceptorBindings = annotationManager.getInterceptorAnnotations(annotatedType.getAnnotations());
- Set<Interceptor<?>> allUsedCdiInterceptors = new HashSet<Interceptor<?>>();
+ List<Interceptor<?>> classLevelInterceptors;
+ if (classInterceptorBindings.size() > 0)
+ {
+ classLevelInterceptors = webBeansContext.getBeanManagerImpl().resolveInterceptors(InterceptionType.AROUND_INVOKE, AnnotationUtil.asArray(classInterceptorBindings));
+ allUsedCdiInterceptors.addAll(classLevelInterceptors);
+ }
+ else
+ {
+ classLevelInterceptors = Collections.EMPTY_LIST;
+ }
+
Set<Interceptor<?>> allUsedConstructorCdiInterceptors = new HashSet<Interceptor<?>>();
addCdiClassLifecycleInterceptors(annotatedType, classInterceptorBindings, allUsedCdiInterceptors, allUsedConstructorCdiInterceptors);
@@ -132,7 +144,8 @@ public class InterceptorResolutionServic
calculateEjbMethodInterceptors(methodInterceptorInfo, allUsedEjbInterceptors, classLevelEjbInterceptors, annotatedMethod);
- calculateCdiMethodInterceptors(methodInterceptorInfo, InterceptionType.AROUND_INVOKE, allUsedCdiInterceptors, annotatedMethod, classInterceptorBindings);
+ calculateCdiMethodInterceptors(methodInterceptorInfo, InterceptionType.AROUND_INVOKE, allUsedCdiInterceptors, annotatedMethod,
+ classInterceptorBindings, classLevelInterceptors);
calculateCdiMethodDecorators(methodInterceptorInfo, decorators, annotatedMethod);
@@ -359,7 +372,7 @@ public class InterceptorResolutionServic
foundMethods.add(lifecycleMethod);
calculateEjbMethodInterceptors(methodInterceptorInfo, allUsedEjbInterceptors, classLevelEjbInterceptors, lifecycleMethod);
- calculateCdiMethodInterceptors(methodInterceptorInfo, interceptionType, allUsedCdiInterceptors, lifecycleMethod, classInterceptorBindings);
+ calculateCdiMethodInterceptors(methodInterceptorInfo, interceptionType, allUsedCdiInterceptors, lifecycleMethod, classInterceptorBindings, null);
}
}
for (AnnotatedConstructor<?> lifecycleMethod : annotatedType.getConstructors())
@@ -367,7 +380,7 @@ public class InterceptorResolutionServic
// TODO: verifyLifecycleMethod(lifeycleAnnotation, lifecycleMethod);
calculateEjbMethodInterceptors(methodInterceptorInfo, allUsedEjbInterceptors, classLevelEjbInterceptors, lifecycleMethod);
- calculateCdiMethodInterceptors(methodInterceptorInfo, interceptionType, allUsedCdiInterceptors, lifecycleMethod, classInterceptorBindings);
+ calculateCdiMethodInterceptors(methodInterceptorInfo, interceptionType, allUsedCdiInterceptors, lifecycleMethod, classInterceptorBindings, null);
}
if (foundMethods.size() > 0 )
@@ -573,19 +586,22 @@ public class InterceptorResolutionServic
InterceptionType interceptionType,
Set<Interceptor<?>> allUsedCdiInterceptors,
AnnotatedCallable annotatedMethod,
- Set<Annotation> classInterceptorBindings)
+ Set<Annotation> classInterceptorBindings,
+ List<Interceptor<?>> classLevelInterceptors)
{
AnnotationManager annotationManager = webBeansContext.getAnnotationManager();
boolean unproxyable = isUnproxyable(annotatedMethod);
+ boolean hasMethodInterceptors = false;
Map<Class<? extends Annotation>, Annotation> cummulatedInterceptorBindings = new HashMap<Class<? extends Annotation>, Annotation>();
for (Annotation interceptorBinding: annotationManager.getInterceptorAnnotations(annotatedMethod.getAnnotations()))
{
cummulatedInterceptorBindings.put(interceptorBinding.annotationType(), interceptorBinding);
+ hasMethodInterceptors = true;
}
- if (unproxyable && cummulatedInterceptorBindings.size() > 0)
+ if (unproxyable && hasMethodInterceptors)
{
throw new WebBeansConfigurationException(annotatedMethod + " is not proxyable, but an Interceptor got defined on it!");
}
@@ -609,12 +625,20 @@ public class InterceptorResolutionServic
return;
}
- List<Interceptor<?>> methodInterceptors
- = webBeansContext.getBeanManagerImpl().resolveInterceptors(interceptionType, AnnotationUtil.asArray(cummulatedInterceptorBindings.values()));
- methodInterceptorInfo.setCdiInterceptors(methodInterceptors);
+ List<Interceptor<?>> methodInterceptors;
+ if (hasMethodInterceptors || classLevelInterceptors == null)
+ {
+ methodInterceptors = webBeansContext.getBeanManagerImpl().resolveInterceptors(interceptionType, AnnotationUtil.asArray(cummulatedInterceptorBindings.values()));
+ allUsedCdiInterceptors.addAll(methodInterceptors);
+ }
+ else
+ {
+ // if there is no explicit interceptor defined on the method, then we just take all the interceptors from the class
+ methodInterceptors = classLevelInterceptors;
+ }
- allUsedCdiInterceptors.addAll(methodInterceptors);
+ methodInterceptorInfo.setCdiInterceptors(methodInterceptors);
}
/**
@@ -630,34 +654,35 @@ public class InterceptorResolutionServic
private <T> void verifyLifecycleMethod(Class<? extends Annotation> lifecycleAnnotation, AnnotatedMethod<T> annotatedMethod)
{
List<AnnotatedParameter<T>> params = annotatedMethod.getParameters();
+ Method method = annotatedMethod.getJavaMember();
if (params.size() > 0 && (params.size() > 1 || !params.get(0).getBaseType().equals(InvocationContext.class)))
{
throw new WebBeansConfigurationException(lifecycleAnnotation.getName() + " LifecycleMethod "
- + annotatedMethod.getJavaMember()
+ + method
+ " must either have no parameter or InvocationContext but has:"
- + Arrays.toString(annotatedMethod.getJavaMember().getParameterTypes()));
+ + Arrays.toString(method.getParameterTypes()));
}
- if (!annotatedMethod.getJavaMember().getReturnType().equals(Void.TYPE))
+ if (!method.getReturnType().equals(Void.TYPE))
{
throw new WebBeansConfigurationException("@" + lifecycleAnnotation.getName()
- + " annotated method : " + annotatedMethod.getJavaMember().getName()
+ + " annotated method : " + method.getName()
+ " in class : " + annotatedMethod.getDeclaringType().getJavaClass().getName()
+ " must return void type");
}
- if (isNoCheckedExceptionEnforced() && ClassUtil.isMethodHasCheckedException(annotatedMethod.getJavaMember()))
+ if (isNoCheckedExceptionEnforced() && ClassUtil.isMethodHasCheckedException(method))
{
throw new WebBeansConfigurationException("@" + lifecycleAnnotation.getName()
- + " annotated method : " + annotatedMethod.getJavaMember().getName()
+ + " annotated method : " + method.getName()
+ " in class : " + annotatedMethod.getDeclaringType().getJavaClass().getName()
+ " can not throw any checked exception");
}
- if (Modifier.isStatic(annotatedMethod.getJavaMember().getModifiers()))
+ if (Modifier.isStatic(method.getModifiers()))
{
throw new WebBeansConfigurationException("@" + lifecycleAnnotation.getName()
- + " annotated method : " + annotatedMethod.getJavaMember().getName()
+ + " annotated method : " + method.getName()
+ " in class : " + annotatedMethod.getDeclaringType().getJavaClass().getName()
+ " can not be static");
}
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/AnnotationUtil.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/AnnotationUtil.java?rev=1629479&r1=1629478&r2=1629479&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/AnnotationUtil.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/AnnotationUtil.java Sun Oct 5 09:09:44 2014
@@ -19,7 +19,6 @@
package org.apache.webbeans.util;
import java.lang.annotation.Annotation;
-import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
@@ -94,28 +93,7 @@ public final class AnnotationUtil
/**
* Check given annotation exist on the method.
- *
- * @param method method
- * @param clazz annotation class
- * @return true or false
- */
- public static boolean hasMethodAnnotation(Method method, Class<? extends Annotation> clazz)
- {
- final AnnotatedElement element = method;
- Annotation[] anns = getDeclaredAnnotations(element);
- for (Annotation annotation : anns)
- {
- if (annotation.annotationType().equals(clazz))
- {
- return true;
- }
- }
-
- return false;
-
- }
-
- /**
+ *
* Utility method to get around some errors caused by
* interactions between the Equinox class loaders and
* the OpenJPA transformation process. There is a window
@@ -128,20 +106,21 @@ public final class AnnotationUtil
* defined on the second pass, this should succeed. If
* we get a second exception, then it's likely some
* other problem.
- *
- * @param element The AnnotatedElement we need information for.
- *
- * @return An array of the Annotations defined on the element.
+
+ * @param method method
+ * @param clazz annotation class
+ * @return true or false
*/
- private static Annotation[] getDeclaredAnnotations(AnnotatedElement element)
+ public static boolean hasMethodAnnotation(Method method, Class<? extends Annotation> clazz)
{
try
{
- return element.getDeclaredAnnotations();
+ return method.getAnnotation(clazz) != null;
}
- catch (LinkageError e)
+ catch (LinkageError le)
{
- return element.getDeclaredAnnotations();
+ // try once again
+ return method.getAnnotation(clazz) != null;
}
}
@@ -164,33 +143,6 @@ public final class AnnotationUtil
return false;
}
- public static <X> boolean hasAnnotatedMethodMultipleParameterAnnotation(AnnotatedMethod<X> annotatedMethod, Class<? extends Annotation> clazz)
- {
- Asserts.assertNotNull(annotatedMethod, "annotatedMethod argument can not be null");
- Asserts.nullCheckForClass(clazz);
-
- boolean found = false;
-
- List<AnnotatedParameter<X>> parameters = annotatedMethod.getParameters();
- for(AnnotatedParameter<X> parameter : parameters)
- {
- if(parameter.isAnnotationPresent(clazz))
- {
- if(!found)
- {
- found = true;
- }
- else
- {
- return true;
- }
- }
- }
-
-
- return false;
- }
-
public static <X> AnnotatedParameter<X> getFirstAnnotatedParameter(AnnotatedMethod<X> annotatedMethod, Class<? extends Annotation> annotation)
{
for (AnnotatedParameter<X> annotatedParameter: annotatedMethod.getParameters())
@@ -425,8 +377,7 @@ public final class AnnotationUtil
*
* @param qualifierAnnotationType
*/
- private static List<Method> getBindingCdiAnnotationMethods(
- Class<? extends Annotation> qualifierAnnotationType)
+ private static List<Method> getBindingCdiAnnotationMethods(Class<? extends Annotation> qualifierAnnotationType)
{
Method[] qualifierMethods = qualifierAnnotationType.getDeclaredMethods();
@@ -436,32 +387,9 @@ public final class AnnotationUtil
for (Method qualifierMethod : qualifierMethods)
{
- Annotation[] qualifierMethodAnnotations = getDeclaredAnnotations(qualifierMethod);
-
- if (qualifierMethodAnnotations.length > 0)
- {
- // look for @Nonbinding
- boolean nonbinding = false;
-
- for (Annotation qualifierMethodAnnotation : qualifierMethodAnnotations)
- {
- if (Nonbinding.class.equals(
- qualifierMethodAnnotation.annotationType()))
- {
- nonbinding = true;
- break;
- }
- }
-
- if (!nonbinding)
- {
- // no @Nonbinding found - add to list
- bindingMethods.add(qualifierMethod);
- }
- }
- else
+ if (!hasMethodAnnotation(qualifierMethod, Nonbinding.class))
{
- // no method-annotations - add to list
+ // no @Nonbinding found - add to list
bindingMethods.add(qualifierMethod);
}
}
Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/component/decorator/clean/ServiceDecorator.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/component/decorator/clean/ServiceDecorator.java?rev=1629479&r1=1629478&r2=1629479&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/component/decorator/clean/ServiceDecorator.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/component/decorator/clean/ServiceDecorator.java Sun Oct 5 09:09:44 2014
@@ -28,7 +28,6 @@ import org.apache.webbeans.test.annotati
import org.apache.webbeans.test.component.service.IService;
@Decorator
-@Named
public class ServiceDecorator implements IService
{
private @Inject @Delegate @Binding1 IService delegate;
Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/component/event/normal/TransactionalInterceptor.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/component/event/normal/TransactionalInterceptor.java?rev=1629479&r1=1629478&r2=1629479&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/component/event/normal/TransactionalInterceptor.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/component/event/normal/TransactionalInterceptor.java Sun Oct 5 09:09:44 2014
@@ -21,10 +21,11 @@ package org.apache.webbeans.test.compone
import javax.interceptor.AroundInvoke;
import javax.interceptor.Interceptor;
import javax.interceptor.InvocationContext;
+import java.io.Serializable;
@Interceptor
@Transactional
-public class TransactionalInterceptor
+public class TransactionalInterceptor implements Serializable
{
@AroundInvoke
Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/resolution/InterceptorResolutionServiceTest.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/resolution/InterceptorResolutionServiceTest.java?rev=1629479&r1=1629478&r2=1629479&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/resolution/InterceptorResolutionServiceTest.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/resolution/InterceptorResolutionServiceTest.java Sun Oct 5 09:09:44 2014
@@ -28,6 +28,8 @@ import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
+import java.util.concurrent.TimeUnit;
+import java.util.logging.Logger;
import org.apache.webbeans.intercept.InterceptorResolutionService;
import org.apache.webbeans.test.AbstractUnitTest;
@@ -64,6 +66,8 @@ import static org.apache.webbeans.interc
public class InterceptorResolutionServiceTest extends AbstractUnitTest
{
+ private static final Logger log = Logger.getLogger(InterceptorResolutionServiceTest.class.getName());
+
@Test
public void testClassLevelSingleInterceptor() throws Exception
{
@@ -156,7 +160,16 @@ public class InterceptorResolutionServic
Bean<ClassMultiInterceptedClass> bean =
(Bean<ClassMultiInterceptedClass>) getBeanManager().resolve((Set) getBeanManager().getBeans(ClassMultiInterceptedClass.class));
- BeanInterceptorInfo interceptorInfo = ir.calculateInterceptorInfo(bean.getTypes(), bean.getQualifiers(), annotatedType);
+ BeanInterceptorInfo interceptorInfo = null;
+ long start = System.nanoTime();
+ for (int i=0; i < 2; i++)
+ {
+ // for being able to do some cheap performance tests
+ interceptorInfo = ir.calculateInterceptorInfo(bean.getTypes(), bean.getQualifiers(), annotatedType);
+ }
+ long end = System.nanoTime();
+ log.info("calculating the interceptor info took " + TimeUnit.NANOSECONDS.toMillis(end-start) + " ms");
+
Assert.assertNotNull(interceptorInfo);
Assert.assertNotNull(interceptorInfo.getCdiInterceptors());
Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/performance/StartupPerformanceTest.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/performance/StartupPerformanceTest.java?rev=1629479&r1=1629478&r2=1629479&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/performance/StartupPerformanceTest.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/performance/StartupPerformanceTest.java Sun Oct 5 09:09:44 2014
@@ -20,8 +20,36 @@ package org.apache.webbeans.test.perform
import java.util.ArrayList;
import java.util.Collection;
+import java.util.concurrent.TimeUnit;
+import java.util.logging.Logger;
import org.apache.webbeans.test.AbstractUnitTest;
+import org.apache.webbeans.test.component.binding.AnyBindingComponent;
+import org.apache.webbeans.test.component.binding.DefaultAnyBinding;
+import org.apache.webbeans.test.component.binding.NonAnyBindingComponent;
+import org.apache.webbeans.test.component.decorator.clean.AccountComponent;
+import org.apache.webbeans.test.component.decorator.clean.LargeTransactionDecorator;
+import org.apache.webbeans.test.component.decorator.clean.ServiceDecorator;
+import org.apache.webbeans.test.component.definition.BeanTypesDefinedBean;
+import org.apache.webbeans.test.component.dependent.DependentComponent;
+import org.apache.webbeans.test.component.dependent.DependentOwnerComponent;
+import org.apache.webbeans.test.component.dependent.MultipleDependentComponent;
+import org.apache.webbeans.test.component.dependent.circular.DependentA;
+import org.apache.webbeans.test.component.dependent.circular.DependentB;
+import org.apache.webbeans.test.component.event.normal.ComponentWithObservable1;
+import org.apache.webbeans.test.component.event.normal.ComponentWithObserves1;
+import org.apache.webbeans.test.component.event.normal.ComponentWithObserves2;
+import org.apache.webbeans.test.component.event.normal.ComponentWithObserves3;
+import org.apache.webbeans.test.component.event.normal.ComponentWithObserves4;
+import org.apache.webbeans.test.component.event.normal.ComponentWithObserves5;
+import org.apache.webbeans.test.component.event.normal.ComponentWithObserves6;
+import org.apache.webbeans.test.component.event.normal.ComponentWithObserves7;
+import org.apache.webbeans.test.component.event.normal.Transactional;
+import org.apache.webbeans.test.component.event.normal.TransactionalInterceptor;
+import org.apache.webbeans.test.component.inheritance.InheritFromMultipleParentComponent;
+import org.apache.webbeans.test.component.inheritance.InheritFromParentComponent;
+import org.apache.webbeans.test.component.inheritance.ParentComponent;
+import org.apache.webbeans.test.component.inheritance.ParentComponentSubClass;
import org.apache.webbeans.test.concepts.alternatives.common.AlternativeBean;
import org.apache.webbeans.test.concepts.alternatives.common.Pencil;
import org.apache.webbeans.test.concepts.alternatives.common.PencilProducerBean;
@@ -62,20 +90,12 @@ public class StartupPerformanceTest exte
{
private static final int NUMBER_ITERATIONS = 2;
+ private static final Logger log = Logger.getLogger(StartupPerformanceTest.class.getName());
+
@Test
public void testPerformance()
{
- for (int i=0; i < NUMBER_ITERATIONS; i++)
- {
- startupWithClasses();
- }
- }
-
- private void startupWithClasses()
- {
- Collection<String> beanXmls = new ArrayList<String>();
-
Collection<Class<?>> beanClasses = new ArrayList<Class<?>>();
beanClasses.add(PaymentProcessorComponent.class);
beanClasses.add(InstanceInjectedComponent.class);
@@ -102,18 +122,57 @@ public class StartupPerformanceTest exte
beanClasses.add(DependentBean.class);
beanClasses.add(DependentBeanProducer.class);
beanClasses.add(InstanceForDependentBean.class);
-
-
beanClasses.add(MyProductBean.class);
beanClasses.add(MyProductProducer.class);
beanClasses.add(ProductInjectedBean.class);
-
beanClasses.add(StringProducerBean.class);
beanClasses.add(GetterStringFieldInjector.class);
beanClasses.add(GetterStringProducerBean.class);
beanClasses.add(InformationConsumerBean.class);
beanClasses.add(MultipleListProducer.class);
beanClasses.add(GetterStringProducerBean.class);
+ beanClasses.add(AnyBindingComponent.class);
+ beanClasses.add(DefaultAnyBinding.class);
+ beanClasses.add(NonAnyBindingComponent.class);
+ beanClasses.add(AccountComponent.class);
+ beanClasses.add(BeanTypesDefinedBean.class);
+ beanClasses.add(DependentA.class);
+ beanClasses.add(DependentB.class);
+ beanClasses.add(DependentComponent.class);
+ beanClasses.add(DependentOwnerComponent.class);
+ beanClasses.add(MultipleDependentComponent.class);
+ beanClasses.add(ComponentWithObservable1.class);
+ beanClasses.add(ComponentWithObserves1.class);
+ beanClasses.add(ComponentWithObserves2.class);
+ beanClasses.add(ComponentWithObserves3.class);
+ beanClasses.add(ComponentWithObserves4.class);
+ beanClasses.add(ComponentWithObserves5.class);
+ beanClasses.add(ComponentWithObserves6.class);
+ beanClasses.add(ComponentWithObserves7.class);
+ beanClasses.add(InheritFromMultipleParentComponent.class);
+ beanClasses.add(InheritFromParentComponent.class);
+ beanClasses.add(ParentComponent.class);
+ beanClasses.add(ParentComponentSubClass.class);
+
+ beanClasses.add(Transactional.class);
+ addInterceptor(TransactionalInterceptor.class);
+
+ addDecorator(LargeTransactionDecorator.class);
+ addDecorator(ServiceDecorator.class);
+
+ long start = System.nanoTime();
+ for (int i=0; i < NUMBER_ITERATIONS; i++)
+ {
+ startupWithClasses(beanClasses);
+ }
+ long stop = System.nanoTime();
+ log.info("Starting up " + beanClasses.size() + " classes " + NUMBER_ITERATIONS + " times took " + TimeUnit.NANOSECONDS.toMillis(stop - start) + " ms");
+ }
+
+ private void startupWithClasses(Collection<Class<?>> beanClasses)
+ {
+ Collection<String> beanXmls = new ArrayList<String>();
+
startContainer(beanClasses, beanXmls);