polishing

git-svn-id: https://src.springframework.org/svn/spring-framework/trunk@2993 50f2f4bb-b051-0410-bef5-90022cba6387
This commit is contained in:
Juergen Hoeller 2010-02-16 18:21:25 +00:00
parent e5972f8b29
commit cddadd2fd5
2 changed files with 30 additions and 26 deletions

View File

@ -65,7 +65,7 @@ public abstract class AbstractInterceptorDrivenBeanDefinitionDecorator implement
String existingBeanName = definitionHolder.getBeanName(); String existingBeanName = definitionHolder.getBeanName();
BeanDefinition existingDefinition = definitionHolder.getBeanDefinition(); BeanDefinition existingDefinition = definitionHolder.getBeanDefinition();
// delegate to subclass for interceptor def // delegate to subclass for interceptor definition
BeanDefinition interceptorDefinition = createInterceptorDefinition(node); BeanDefinition interceptorDefinition = createInterceptorDefinition(node);
// generate name and register the interceptor // generate name and register the interceptor
@ -75,9 +75,9 @@ public abstract class AbstractInterceptorDrivenBeanDefinitionDecorator implement
BeanDefinitionHolder result = definitionHolder; BeanDefinitionHolder result = definitionHolder;
if (!isProxyFactoryBeanDefinition(existingDefinition)) { if (!isProxyFactoryBeanDefinition(existingDefinition)) {
// create the proxy definitionHolder // create the proxy definition
RootBeanDefinition proxyDefinition = new RootBeanDefinition(); RootBeanDefinition proxyDefinition = new RootBeanDefinition();
// create proxy factory bean definitionHolder // create proxy factory bean definition
proxyDefinition.setBeanClass(ProxyFactoryBean.class); proxyDefinition.setBeanClass(ProxyFactoryBean.class);
// set up property values // set up property values
@ -88,8 +88,7 @@ public abstract class AbstractInterceptorDrivenBeanDefinitionDecorator implement
mpvs.add("target", existingDefinition); mpvs.add("target", existingDefinition);
// create the interceptor names list // create the interceptor names list
ManagedList interceptorList = new ManagedList(); mpvs.add("interceptorNames", new ManagedList<String>());
mpvs.add("interceptorNames", interceptorList);
result = new BeanDefinitionHolder(proxyDefinition, existingBeanName); result = new BeanDefinitionHolder(proxyDefinition, existingBeanName);
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2009 the original author or authors. * Copyright 2002-2010 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -27,6 +27,7 @@ import java.util.concurrent.ConcurrentHashMap;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.springframework.asm.ClassReader; import org.springframework.asm.ClassReader;
import org.springframework.asm.Label; import org.springframework.asm.Label;
import org.springframework.asm.MethodVisitor; import org.springframework.asm.MethodVisitor;
@ -46,27 +47,29 @@ import org.springframework.util.ClassUtils;
* as far as possible. * as far as possible.
* *
* @author Adrian Colyer * @author Adrian Colyer
* @author Juergen Hoeller
* @author Costin Leau * @author Costin Leau
* @author Juergen Hoeller
* @since 2.0 * @since 2.0
*/ */
public class LocalVariableTableParameterNameDiscoverer implements ParameterNameDiscoverer { public class LocalVariableTableParameterNameDiscoverer implements ParameterNameDiscoverer {
private static Log logger = LogFactory.getLog(LocalVariableTableParameterNameDiscoverer.class); private static Log logger = LogFactory.getLog(LocalVariableTableParameterNameDiscoverer.class);
// the cache uses a nested index (value is a map) to keep the top level cache relatively small in size
private final Map<Class<?>, Map<Member, String[]>> parameterNamesCache = new ConcurrentHashMap<Class<?>, Map<Member, String[]>>();
// marker object for classes that do not have any debug info // marker object for classes that do not have any debug info
private static final Map<Member, String[]> NO_DEBUG_INFO_MAP = Collections.emptyMap(); private static final Map<Member, String[]> NO_DEBUG_INFO_MAP = Collections.emptyMap();
// the cache uses a nested index (value is a map) to keep the top level cache relatively small in size
private final Map<Class<?>, Map<Member, String[]>> parameterNamesCache =
new ConcurrentHashMap<Class<?>, Map<Member, String[]>>();
public String[] getParameterNames(Method method) { public String[] getParameterNames(Method method) {
Class<?> declaringClass = method.getDeclaringClass(); Class<?> declaringClass = method.getDeclaringClass();
Map<Member, String[]> map = parameterNamesCache.get(declaringClass); Map<Member, String[]> map = this.parameterNamesCache.get(declaringClass);
if (map == null) { if (map == null) {
// initialize cache // initialize cache
map = inspectClass(declaringClass); map = inspectClass(declaringClass);
parameterNamesCache.put(declaringClass, map); this.parameterNamesCache.put(declaringClass, map);
} }
if (map != NO_DEBUG_INFO_MAP) { if (map != NO_DEBUG_INFO_MAP) {
return map.get(method); return map.get(method);
@ -77,11 +80,11 @@ public class LocalVariableTableParameterNameDiscoverer implements ParameterNameD
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public String[] getParameterNames(Constructor ctor) { public String[] getParameterNames(Constructor ctor) {
Class<?> declaringClass = ctor.getDeclaringClass(); Class<?> declaringClass = ctor.getDeclaringClass();
Map<Member, String[]> map = parameterNamesCache.get(declaringClass); Map<Member, String[]> map = this.parameterNamesCache.get(declaringClass);
if (map == null) { if (map == null) {
// initialize cache // initialize cache
map = inspectClass(declaringClass); map = inspectClass(declaringClass);
parameterNamesCache.put(declaringClass, map); this.parameterNamesCache.put(declaringClass, map);
} }
if (map != NO_DEBUG_INFO_MAP) { if (map != NO_DEBUG_INFO_MAP) {
return map.get(ctor); return map.get(ctor);
@ -91,10 +94,8 @@ public class LocalVariableTableParameterNameDiscoverer implements ParameterNameD
} }
/** /**
* Inspects the target class. Exceptions will be logged and a maker map returned to indicate the lack of debug information. * Inspects the target class. Exceptions will be logged and a maker map returned
* * to indicate the lack of debug information.
* @param clazz
* @return
*/ */
private Map<Member, String[]> inspectClass(Class<?> clazz) { private Map<Member, String[]> inspectClass(Class<?> clazz) {
InputStream is = clazz.getResourceAsStream(ClassUtils.getClassFileName(clazz)); InputStream is = clazz.getResourceAsStream(ClassUtils.getClassFileName(clazz));
@ -105,40 +106,42 @@ public class LocalVariableTableParameterNameDiscoverer implements ParameterNameD
logger.debug("Cannot find '.class' file for class [" + clazz logger.debug("Cannot find '.class' file for class [" + clazz
+ "] - unable to determine constructors/methods parameter names"); + "] - unable to determine constructors/methods parameter names");
} }
return NO_DEBUG_INFO_MAP; return NO_DEBUG_INFO_MAP;
} }
try { try {
ClassReader classReader = new ClassReader(is); ClassReader classReader = new ClassReader(is);
Map<Member, String[]> map = new ConcurrentHashMap<Member, String[]>(); Map<Member, String[]> map = new ConcurrentHashMap<Member, String[]>();
classReader.accept(new ParameterNameDiscoveringVisitor(clazz, map), false); classReader.accept(new ParameterNameDiscoveringVisitor(clazz, map), false);
return map; return map;
} catch (IOException ex) { }
catch (IOException ex) {
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
logger.debug("Exception thrown while reading '.class' file for class [" + clazz logger.debug("Exception thrown while reading '.class' file for class [" + clazz
+ "] - unable to determine constructors/methods parameter names", ex); + "] - unable to determine constructors/methods parameter names", ex);
} }
} finally { }
finally {
try { try {
is.close(); is.close();
} catch (IOException ex) { }
catch (IOException ex) {
// ignore // ignore
} }
} }
return NO_DEBUG_INFO_MAP; return NO_DEBUG_INFO_MAP;
} }
/** /**
* Helper class that inspects all methods (constructor included) and then * Helper class that inspects all methods (constructor included) and then
* attempts to find the parameter names for that member. * attempts to find the parameter names for that member.
*/ */
private static class ParameterNameDiscoveringVisitor extends EmptyVisitor { private static class ParameterNameDiscoveringVisitor extends EmptyVisitor {
private static final String STATIC_CLASS_INIT = "<clinit>";
private final Class<?> clazz; private final Class<?> clazz;
private final Map<Member, String[]> memberMap; private final Map<Member, String[]> memberMap;
private static final String STATIC_CLASS_INIT = "<clinit>";
public ParameterNameDiscoveringVisitor(Class<?> clazz, Map<Member, String[]> memberMap) { public ParameterNameDiscoveringVisitor(Class<?> clazz, Map<Member, String[]> memberMap) {
this.clazz = clazz; this.clazz = clazz;
@ -163,6 +166,7 @@ public class LocalVariableTableParameterNameDiscoverer implements ParameterNameD
} }
} }
private static class LocalVariableTableVisitor extends EmptyVisitor { private static class LocalVariableTableVisitor extends EmptyVisitor {
private static final String CONSTRUCTOR = "<init>"; private static final String CONSTRUCTOR = "<init>";
@ -255,4 +259,5 @@ public class LocalVariableTableParameterNameDiscoverer implements ParameterNameD
return (aType == Type.LONG_TYPE || aType == Type.DOUBLE_TYPE); return (aType == Type.LONG_TYPE || aType == Type.DOUBLE_TYPE);
} }
} }
} }