diff --git a/pom.xml b/pom.xml
index 2398553..7a94452 100644
--- a/pom.xml
+++ b/pom.xml
@@ -12,12 +12,12 @@
com.alibaba.spring
spring-context-support
- 1.0.11
+ 1.0.12
1.6
1.6
- 3.2.18.RELEASE
+ 6.0.2
@@ -149,6 +149,13 @@
5.2.9.RELEASE
+
+
+ spring-6.0.2
+
+ 5.2.9.RELEASE
+
+
diff --git a/src/main/java/com/alibaba/spring/beans/factory/annotation/AbstractAnnotationBeanPostProcessor.java b/src/main/java/com/alibaba/spring/beans/factory/annotation/AbstractAnnotationBeanPostProcessor.java
index 8c98065..b69b1ff 100644
--- a/src/main/java/com/alibaba/spring/beans/factory/annotation/AbstractAnnotationBeanPostProcessor.java
+++ b/src/main/java/com/alibaba/spring/beans/factory/annotation/AbstractAnnotationBeanPostProcessor.java
@@ -14,6 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package com.alibaba.spring.beans.factory.annotation;
import org.apache.commons.logging.Log;
@@ -30,7 +31,7 @@
import org.springframework.beans.factory.annotation.InjectionMetadata;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
-import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter;
+import org.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor;
import org.springframework.beans.factory.support.MergedBeanDefinitionPostProcessor;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.EnvironmentAware;
@@ -73,65 +74,62 @@
* @since 1.0.3
*/
@SuppressWarnings("unchecked")
-public abstract class AbstractAnnotationBeanPostProcessor extends
- InstantiationAwareBeanPostProcessorAdapter implements MergedBeanDefinitionPostProcessor, PriorityOrdered,
- BeanFactoryAware, BeanClassLoaderAware, EnvironmentAware, DisposableBean {
-
+public abstract class AbstractAnnotationBeanPostProcessor
+ implements MergedBeanDefinitionPostProcessor, PriorityOrdered, SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware, BeanClassLoaderAware, EnvironmentAware, DisposableBean {
+
private final static int CACHE_SIZE = Integer.getInteger("", 32);
-
+
private final Log logger = LogFactory.getLog(getClass());
-
+
private final Class extends Annotation>[] annotationTypes;
-
- private final ConcurrentMap injectionMetadataCache =
- new ConcurrentHashMap(CACHE_SIZE);
-
- private final ConcurrentMap injectedObjectsCache = new ConcurrentHashMap(CACHE_SIZE);
-
+
+ private final ConcurrentMap injectionMetadataCache = new ConcurrentHashMap(
+ CACHE_SIZE);
+
+ private final ConcurrentMap injectedObjectsCache = new ConcurrentHashMap(
+ CACHE_SIZE);
+
private ConfigurableListableBeanFactory beanFactory;
-
+
private Environment environment;
-
+
private ClassLoader classLoader;
-
+
/**
* make sure higher priority than {@link AutowiredAnnotationBeanPostProcessor}
*/
private int order = Ordered.LOWEST_PRECEDENCE - 3;
-
+
/**
- * whether to turn Class references into Strings (for
- * compatibility with {@link org.springframework.core.type.AnnotationMetadata} or to
- * preserve them as Class references
+ * whether to turn Class references into Strings (for compatibility with {@link
+ * org.springframework.core.type.AnnotationMetadata} or to preserve them as Class references
*
* @since 1.0.11
*/
private boolean classValuesAsString;
-
+
/**
- * whether to turn nested Annotation instances into
- * {@link AnnotationAttributes} maps (for compatibility with
- * {@link org.springframework.core.type.AnnotationMetadata} or to preserve them as
- * Annotation instances
+ * whether to turn nested Annotation instances into {@link AnnotationAttributes} maps (for compatibility with {@link
+ * org.springframework.core.type.AnnotationMetadata} or to preserve them as Annotation instances
*
* @since 1.0.11
*/
private boolean nestedAnnotationsAsMap;
-
+
/**
* whether ignore default value or not
*
* @since 1.0.11
*/
private boolean ignoreDefaultValue = true;
-
+
/**
* whether try merged annotation or not
*
* @since 1.0.11
*/
private boolean tryMergedAnnotation = true;
-
+
/**
* @param annotationTypes the multiple types of {@link Annotation annotations}
*/
@@ -139,7 +137,7 @@ public AbstractAnnotationBeanPostProcessor(Class extends Annotation>... annota
Assert.notEmpty(annotationTypes, "The argument of annotations' types must not empty");
this.annotationTypes = annotationTypes;
}
-
+
private static Collection combine(Collection extends T>... elements) {
List allElements = new ArrayList();
for (Collection extends T> e : elements) {
@@ -147,7 +145,7 @@ private static Collection combine(Collection extends T>... elements) {
}
return allElements;
}
-
+
/**
* Annotation type
*
@@ -158,108 +156,110 @@ private static Collection combine(Collection extends T>... elements) {
public final Class extends Annotation> getAnnotationType() {
return annotationTypes[0];
}
-
+
protected final Class extends Annotation>[] getAnnotationTypes() {
return annotationTypes;
}
-
+
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
Assert.isInstanceOf(ConfigurableListableBeanFactory.class, beanFactory,
"AnnotationInjectedBeanPostProcessor requires a ConfigurableListableBeanFactory");
this.beanFactory = (ConfigurableListableBeanFactory) beanFactory;
}
-
+
@Override
- public PropertyValues postProcessPropertyValues(
- PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeanCreationException {
-
+ public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName)
+ throws BeansException {
InjectionMetadata metadata = findInjectionMetadata(beanName, bean.getClass(), pvs);
try {
metadata.inject(bean, beanName, pvs);
} catch (BeanCreationException ex) {
throw ex;
} catch (Throwable ex) {
- throw new BeanCreationException(beanName, "Injection of @" + getAnnotationType().getSimpleName()
- + " dependencies is failed", ex);
+ throw new BeanCreationException(beanName,
+ "Injection of @" + getAnnotationType().getSimpleName() + " dependencies is failed", ex);
}
return pvs;
}
-
-
+
+
/**
* Finds {@link InjectionMetadata.InjectedElement} Metadata from annotated fields
*
* @param beanClass The {@link Class} of Bean
* @return non-null {@link List}
*/
- private List findFieldAnnotationMetadata(final Class> beanClass) {
-
+ private List findFieldAnnotationMetadata(
+ final Class> beanClass) {
+
final List elements = new LinkedList();
-
+
ReflectionUtils.doWithFields(beanClass, new ReflectionUtils.FieldCallback() {
@Override
public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException {
-
+
for (Class extends Annotation> annotationType : getAnnotationTypes()) {
-
+
AnnotationAttributes attributes = doGetAnnotationAttributes(field, annotationType);
-
+
if (attributes != null) {
-
+
if (Modifier.isStatic(field.getModifiers())) {
if (logger.isWarnEnabled()) {
- logger.warn("@" + annotationType.getName() + " is not supported on static fields: " + field);
+ logger.warn("@" + annotationType.getName() + " is not supported on static fields: "
+ + field);
}
return;
}
-
+
elements.add(new AnnotatedFieldElement(field, attributes));
}
}
}
});
-
+
return elements;
-
+
}
-
+
/**
* Finds {@link InjectionMetadata.InjectedElement} Metadata from annotated methods
*
* @param beanClass The {@link Class} of Bean
* @return non-null {@link List}
*/
- private List findAnnotatedMethodMetadata(final Class> beanClass) {
-
+ private List findAnnotatedMethodMetadata(
+ final Class> beanClass) {
+
final List elements = new LinkedList();
-
+
ReflectionUtils.doWithMethods(beanClass, new ReflectionUtils.MethodCallback() {
@Override
public void doWith(Method method) throws IllegalArgumentException, IllegalAccessException {
-
+
Method bridgedMethod = findBridgedMethod(method);
-
+
if (!isVisibilityBridgeMethodPair(method, bridgedMethod)) {
return;
}
-
-
+
for (Class extends Annotation> annotationType : getAnnotationTypes()) {
-
+
AnnotationAttributes attributes = doGetAnnotationAttributes(bridgedMethod, annotationType);
-
+
if (attributes != null && method.equals(ClassUtils.getMostSpecificMethod(method, beanClass))) {
if (Modifier.isStatic(method.getModifiers())) {
if (logger.isWarnEnabled()) {
- logger.warn("@" + annotationType.getName() + " annotation is not supported on static methods: " + method);
+ logger.warn("@" + annotationType.getName()
+ + " annotation is not supported on static methods: " + method);
}
return;
}
if (method.getParameterTypes().length == 0) {
if (logger.isWarnEnabled()) {
- logger.warn("@" + annotationType.getName() + " annotation should only be used on methods with parameters: " +
- method);
+ logger.warn("@" + annotationType.getName()
+ + " annotation should only be used on methods with parameters: " + method);
}
}
PropertyDescriptor pd = BeanUtils.findPropertyForMethod(bridgedMethod, beanClass);
@@ -268,35 +268,41 @@ public void doWith(Method method) throws IllegalArgumentException, IllegalAccess
}
}
});
-
+
return elements;
}
-
+
/**
* Get {@link AnnotationAttributes}
*
* @param annotatedElement {@link AnnotatedElement the annotated element}
* @param annotationType the {@link Class tyoe} pf {@link Annotation annotation}
- * @return if annotatedElement
can't be found in annotatedElement
, return null
+ * @return if annotatedElement
can't be found in annotatedElement
, return
+ * null
* @since 1.0.11
*/
protected AnnotationAttributes doGetAnnotationAttributes(AnnotatedElement annotatedElement,
- Class extends Annotation> annotationType) {
- return getAnnotationAttributes(annotatedElement, annotationType, getEnvironment(),
- classValuesAsString, nestedAnnotationsAsMap, ignoreDefaultValue, tryMergedAnnotation);
+ Class extends Annotation> annotationType) {
+ return getAnnotationAttributes(annotatedElement, annotationType, getEnvironment(), classValuesAsString,
+ nestedAnnotationsAsMap, ignoreDefaultValue, tryMergedAnnotation);
}
-
- private AbstractAnnotationBeanPostProcessor.AnnotatedInjectionMetadata buildAnnotatedMetadata(final Class> beanClass) {
- Collection fieldElements = findFieldAnnotationMetadata(beanClass);
- Collection methodElements = findAnnotatedMethodMetadata(beanClass);
- return new AbstractAnnotationBeanPostProcessor.AnnotatedInjectionMetadata(beanClass, fieldElements, methodElements);
+
+ private AbstractAnnotationBeanPostProcessor.AnnotatedInjectionMetadata buildAnnotatedMetadata(
+ final Class> beanClass) {
+ Collection fieldElements = findFieldAnnotationMetadata(
+ beanClass);
+ Collection methodElements = findAnnotatedMethodMetadata(
+ beanClass);
+ return new AbstractAnnotationBeanPostProcessor.AnnotatedInjectionMetadata(beanClass, fieldElements,
+ methodElements);
}
-
+
private InjectionMetadata findInjectionMetadata(String beanName, Class> clazz, PropertyValues pvs) {
// Fall back to class name as cache key, for backwards compatibility with custom callers.
String cacheKey = (StringUtils.hasLength(beanName) ? beanName : clazz.getName());
// Quick check on the concurrent map first, with minimal locking.
- AbstractAnnotationBeanPostProcessor.AnnotatedInjectionMetadata metadata = this.injectionMetadataCache.get(cacheKey);
+ AbstractAnnotationBeanPostProcessor.AnnotatedInjectionMetadata metadata = this.injectionMetadataCache.get(
+ cacheKey);
if (InjectionMetadata.needsRefresh(metadata, clazz)) {
synchronized (this.injectionMetadataCache) {
metadata = this.injectionMetadataCache.get(cacheKey);
@@ -308,15 +314,15 @@ private InjectionMetadata findInjectionMetadata(String beanName, Class> clazz,
metadata = buildAnnotatedMetadata(clazz);
this.injectionMetadataCache.put(cacheKey, metadata);
} catch (NoClassDefFoundError err) {
- throw new IllegalStateException("Failed to introspect object class [" + clazz.getName() +
- "] for annotation metadata: could not find class that it depends on", err);
+ throw new IllegalStateException("Failed to introspect object class [" + clazz.getName()
+ + "] for annotation metadata: could not find class that it depends on", err);
}
}
}
}
return metadata;
}
-
+
@Override
public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class> beanType, String beanName) {
if (beanType != null) {
@@ -324,60 +330,60 @@ public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, C
metadata.checkConfigMembers(beanDefinition);
}
}
-
+
@Override
public int getOrder() {
return order;
}
-
+
public void setOrder(int order) {
this.order = order;
}
-
+
@Override
public void destroy() throws Exception {
-
+
for (Object object : injectedObjectsCache.values()) {
if (logger.isInfoEnabled()) {
logger.info(object + " was destroying!");
}
-
+
if (object instanceof DisposableBean) {
((DisposableBean) object).destroy();
}
}
-
+
injectionMetadataCache.clear();
injectedObjectsCache.clear();
-
+
if (logger.isInfoEnabled()) {
logger.info(getClass() + " was destroying!");
}
-
+
}
-
+
@Override
public void setBeanClassLoader(ClassLoader classLoader) {
this.classLoader = classLoader;
}
-
+
@Override
public void setEnvironment(Environment environment) {
this.environment = environment;
}
-
+
protected Environment getEnvironment() {
return environment;
}
-
+
protected ClassLoader getClassLoader() {
return classLoader;
}
-
+
protected ConfigurableListableBeanFactory getBeanFactory() {
return beanFactory;
}
-
+
/**
* Gets all injected-objects.
*
@@ -386,7 +392,7 @@ protected ConfigurableListableBeanFactory getBeanFactory() {
protected Collection