Polishing

This commit is contained in:
Juergen Hoeller 2013-11-22 23:29:54 +01:00
parent 70164cb145
commit f39bb02628
6 changed files with 50 additions and 54 deletions

View File

@ -221,7 +221,6 @@ public class GroovyBeanDefinitionReader extends AbstractBeanDefinitionReader imp
}; };
binding.setVariable("beans", beans); binding.setVariable("beans", beans);
int countBefore = getRegistry().getBeanDefinitionCount(); int countBefore = getRegistry().getBeanDefinitionCount();
try { try {
GroovyShell shell = new GroovyShell(getResourceLoader().getClassLoader(), binding); GroovyShell shell = new GroovyShell(getResourceLoader().getClassLoader(), binding);
@ -239,11 +238,11 @@ public class GroovyBeanDefinitionReader extends AbstractBeanDefinitionReader imp
/** /**
* Defines a set of beans for the given block or closure. * Defines a set of beans for the given block or closure.
* @param c the block or closure * @param closure the block or closure
* @return this GroovyBeanDefinitionReader instance * @return this GroovyBeanDefinitionReader instance
*/ */
public GroovyBeanDefinitionReader beans(Closure c) { public GroovyBeanDefinitionReader beans(Closure closure) {
return invokeBeanDefiningClosure(c); return invokeBeanDefiningClosure(closure);
} }
/** /**
@ -433,7 +432,7 @@ public class GroovyBeanDefinitionReader extends AbstractBeanDefinitionReader imp
private GroovyBeanDefinitionWrapper invokeBeanDefiningMethod(String beanName, Object[] args) { private GroovyBeanDefinitionWrapper invokeBeanDefiningMethod(String beanName, Object[] args) {
boolean hasClosureArgument = args[args.length - 1] instanceof Closure; boolean hasClosureArgument = args[args.length - 1] instanceof Closure;
if (args[0] instanceof Class) { if (args[0] instanceof Class) {
Class beanClass = (args[0] instanceof Class ? (Class) args[0] : args[0].getClass()); Class<?> beanClass = (args[0] instanceof Class ? (Class) args[0] : args[0].getClass());
if (args.length >= 1) { if (args.length >= 1) {
if (hasClosureArgument) { if (hasClosureArgument) {
if (args.length-1 != 1) { if (args.length-1 != 1) {
@ -593,7 +592,7 @@ public class GroovyBeanDefinitionReader extends AbstractBeanDefinitionReader imp
GroovyBeanDefinitionWrapper current = this.currentBeanDefinition; GroovyBeanDefinitionWrapper current = this.currentBeanDefinition;
try { try {
Closure callable = (Closure) value; Closure callable = (Closure) value;
Class parameterType = callable.getParameterTypes()[0]; Class<?> parameterType = callable.getParameterTypes()[0];
if (parameterType.equals(Object.class)) { if (parameterType.equals(Object.class)) {
this.currentBeanDefinition = new GroovyBeanDefinitionWrapper(""); this.currentBeanDefinition = new GroovyBeanDefinitionWrapper("");
callable.call(this.currentBeanDefinition); callable.call(this.currentBeanDefinition);
@ -689,7 +688,7 @@ public class GroovyBeanDefinitionReader extends AbstractBeanDefinitionReader imp
private final String name; private final String name;
private Object value; public Object value;
public DeferredProperty(GroovyBeanDefinitionWrapper beanDefinition, String name, Object value) { public DeferredProperty(GroovyBeanDefinitionWrapper beanDefinition, String name, Object value) {
this.beanDefinition = beanDefinition; this.beanDefinition = beanDefinition;

View File

@ -22,6 +22,7 @@ import java.util.Arrays;
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.aop.scope.ScopedProxyFactoryBean; import org.springframework.aop.scope.ScopedProxyFactoryBean;
import org.springframework.asm.Type; import org.springframework.asm.Type;
import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactory;
@ -57,8 +58,6 @@ import org.springframework.util.ReflectionUtils;
*/ */
class ConfigurationClassEnhancer { class ConfigurationClassEnhancer {
private static final Log logger = LogFactory.getLog(ConfigurationClassEnhancer.class);
private static final Callback[] CALLBACKS = new Callback[] { private static final Callback[] CALLBACKS = new Callback[] {
new BeanMethodInterceptor(), new BeanMethodInterceptor(),
new DisposableBeanMethodInterceptor(), new DisposableBeanMethodInterceptor(),
@ -66,12 +65,13 @@ class ConfigurationClassEnhancer {
NoOp.INSTANCE NoOp.INSTANCE
}; };
private static final ConditionalCallbackFilter CALLBACK_FILTER = private static final ConditionalCallbackFilter CALLBACK_FILTER = new ConditionalCallbackFilter(CALLBACKS);
new ConditionalCallbackFilter(CALLBACKS);
private static final String BEAN_FACTORY_FIELD = "$$beanFactory"; private static final String BEAN_FACTORY_FIELD = "$$beanFactory";
private static final Log logger = LogFactory.getLog(ConfigurationClassEnhancer.class);
/** /**
* Loads the specified class and generates a CGLIB subclass of it equipped with * Loads the specified class and generates a CGLIB subclass of it equipped with
* container-aware callbacks capable of respecting scoping and other bean semantics. * container-aware callbacks capable of respecting scoping and other bean semantics.
@ -125,12 +125,13 @@ class ConfigurationClassEnhancer {
} }
/** /**
* Uses enhancer to generate a subclass of superclass, ensuring that * Uses enhancer to generate a subclass of superclass,
* {@link #callbackInstances} are registered for the new subclass. * ensuring that callbacks are registered for the new subclass.
*/ */
private Class<?> createClass(Enhancer enhancer) { private Class<?> createClass(Enhancer enhancer) {
Class<?> subclass = enhancer.createClass(); Class<?> subclass = enhancer.createClass();
// registering callbacks statically (as opposed to threadlocal) is critical for usage in an OSGi env (SPR-5932) // Registering callbacks statically (as opposed to thread-local)
// is critical for usage in an OSGi environment (SPR-5932)...
Enhancer.registerStaticCallbacks(subclass, CALLBACKS); Enhancer.registerStaticCallbacks(subclass, CALLBACKS);
return subclass; return subclass;
} }
@ -162,6 +163,7 @@ class ConfigurationClassEnhancer {
boolean isMatch(Method candidateMethod); boolean isMatch(Method candidateMethod);
} }
/** /**
* A {@link CallbackFilter} that works by interrogating {@link Callback}s in the order * A {@link CallbackFilter} that works by interrogating {@link Callback}s in the order
* that they are defined via {@link ConditionalCallback}. * that they are defined via {@link ConditionalCallback}.
@ -197,14 +199,14 @@ class ConfigurationClassEnhancer {
} }
} }
/** /**
* Intercepts the invocation of any {@link DisposableBean#destroy()} on @Configuration * Intercepts the invocation of any {@link DisposableBean#destroy()} on @Configuration
* class instances for the purpose of de-registering CGLIB callbacks. This helps avoid * class instances for the purpose of de-registering CGLIB callbacks. This helps avoid
* garbage collection issues. See SPR-7901. * garbage collection issues. See SPR-7901.
* @see EnhancedConfiguration * @see EnhancedConfiguration
*/ */
private static class DisposableBeanMethodInterceptor implements MethodInterceptor, private static class DisposableBeanMethodInterceptor implements MethodInterceptor, ConditionalCallback {
ConditionalCallback {
@Override @Override
public boolean isMatch(Method candidateMethod) { public boolean isMatch(Method candidateMethod) {
@ -231,23 +233,20 @@ class ConfigurationClassEnhancer {
* Intercepts the invocation of any * Intercepts the invocation of any
* {@link BeanFactoryAware#setBeanFactory(BeanFactory)} on {@code @Configuration} * {@link BeanFactoryAware#setBeanFactory(BeanFactory)} on {@code @Configuration}
* class instances for the purpose of recording the {@link BeanFactory}. * class instances for the purpose of recording the {@link BeanFactory}.
*
* @see EnhancedConfiguration * @see EnhancedConfiguration
*/ */
private static class BeanFactoryAwareMethodInterceptor implements MethodInterceptor, private static class BeanFactoryAwareMethodInterceptor implements MethodInterceptor, ConditionalCallback {
ConditionalCallback {
@Override @Override
public boolean isMatch(Method candidateMethod) { public boolean isMatch(Method candidateMethod) {
return candidateMethod.getName().equals("setBeanFactory") return candidateMethod.getName().equals("setBeanFactory") &&
&& candidateMethod.getParameterTypes().length == 1 candidateMethod.getParameterTypes().length == 1 &&
&& candidateMethod.getParameterTypes()[0].equals(BeanFactory.class) candidateMethod.getParameterTypes()[0].equals(BeanFactory.class) &&
&& BeanFactoryAware.class.isAssignableFrom(candidateMethod.getDeclaringClass()); BeanFactoryAware.class.isAssignableFrom(candidateMethod.getDeclaringClass());
} }
@Override @Override
public Object intercept(Object obj, Method method, Object[] args, public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
MethodProxy proxy) throws Throwable {
Field field = obj.getClass().getDeclaredField(BEAN_FACTORY_FIELD); Field field = obj.getClass().getDeclaredField(BEAN_FACTORY_FIELD);
Assert.state(field != null, "Unable to find generated bean factory field"); Assert.state(field != null, "Unable to find generated bean factory field");
field.set(obj, args[0]); field.set(obj, args[0]);
@ -396,8 +395,7 @@ class ConfigurationClassEnhancer {
enhancer.setUseFactory(false); enhancer.setUseFactory(false);
enhancer.setCallback(new MethodInterceptor() { enhancer.setCallback(new MethodInterceptor() {
@Override @Override
public Object intercept(Object obj, Method method, Object[] args, public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
MethodProxy proxy) throws Throwable {
if (method.getName().equals("getObject") && args.length == 0) { if (method.getName().equals("getObject") && args.length == 0) {
return beanFactory.getBean(beanName); return beanFactory.getBean(beanName);
} }
@ -411,8 +409,8 @@ class ConfigurationClassEnhancer {
Field field = ReflectionUtils.findField(enhancedConfigInstance.getClass(), BEAN_FACTORY_FIELD); Field field = ReflectionUtils.findField(enhancedConfigInstance.getClass(), BEAN_FACTORY_FIELD);
Assert.state(field != null, "Unable to find generated bean factory field"); Assert.state(field != null, "Unable to find generated bean factory field");
Object beanFactory = ReflectionUtils.getField(field, enhancedConfigInstance); Object beanFactory = ReflectionUtils.getField(field, enhancedConfigInstance);
Assert.state(beanFactory != null, "The BeanFactory has not been injected into the @Configuration class"); Assert.state(beanFactory != null, "BeanFactory has not been injected into @Configuration class");
Assert.state(beanFactory instanceof ConfigurableBeanFactory, "The injected BeanFactory is not a ConfigurableBeanFactory"); Assert.state(beanFactory instanceof ConfigurableBeanFactory, "Injected BeanFactory is not a ConfigurableBeanFactory");
return (ConfigurableBeanFactory) beanFactory; return (ConfigurableBeanFactory) beanFactory;
} }
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2013 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.
@ -25,6 +25,7 @@ import org.springframework.context.annotation.ImportAware;
import org.springframework.core.annotation.AnnotationAttributes; import org.springframework.core.annotation.AnnotationAttributes;
import org.springframework.core.type.AnnotationMetadata; import org.springframework.core.type.AnnotationMetadata;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
/** /**
* Abstract base {@code Configuration} class providing common structure for enabling * Abstract base {@code Configuration} class providing common structure for enabling
@ -38,15 +39,16 @@ import org.springframework.util.Assert;
public abstract class AbstractAsyncConfiguration implements ImportAware { public abstract class AbstractAsyncConfiguration implements ImportAware {
protected AnnotationAttributes enableAsync; protected AnnotationAttributes enableAsync;
protected Executor executor; protected Executor executor;
@Override @Override
public void setImportMetadata(AnnotationMetadata importMetadata) { public void setImportMetadata(AnnotationMetadata importMetadata) {
this.enableAsync = AnnotationAttributes.fromMap( this.enableAsync = AnnotationAttributes.fromMap(
importMetadata.getAnnotationAttributes(EnableAsync.class.getName(), false)); importMetadata.getAnnotationAttributes(EnableAsync.class.getName(), false));
Assert.notNull(this.enableAsync, Assert.notNull(this.enableAsync,
"@EnableAsync is not present on importing class " + "@EnableAsync is not present on importing class " + importMetadata.getClassName());
importMetadata.getClassName());
} }
/** /**
@ -54,14 +56,12 @@ public abstract class AbstractAsyncConfiguration implements ImportAware {
*/ */
@Autowired(required = false) @Autowired(required = false)
void setConfigurers(Collection<AsyncConfigurer> configurers) { void setConfigurers(Collection<AsyncConfigurer> configurers) {
if (configurers == null || configurers.isEmpty()) { if (CollectionUtils.isEmpty(configurers)) {
return; return;
} }
if (configurers.size() > 1) { if (configurers.size() > 1) {
throw new IllegalStateException("only one AsyncConfigurer may exist"); throw new IllegalStateException("Only one AsyncConfigurer may exist");
} }
AsyncConfigurer configurer = configurers.iterator().next(); AsyncConfigurer configurer = configurers.iterator().next();
this.executor = configurer.getAsyncExecutor(); this.executor = configurer.getAsyncExecutor();
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2011 the original author or authors. * Copyright 2002-2013 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.
@ -41,7 +41,7 @@ package org.springframework.core.env;
* instance available from {@link #getPropertySources()}. See * instance available from {@link #getPropertySources()}. See
* {@link ConfigurableEnvironment} Javadoc for usage examples. * {@link ConfigurableEnvironment} Javadoc for usage examples.
* *
* <p>See {@link SystemEnvironmentPropertySource} Javadoc for details on special handling * <p>See {@link SystemEnvironmentPropertySource} javadoc for details on special handling
* of property names in shell environments (e.g. Bash) that disallow period characters in * of property names in shell environments (e.g. Bash) that disallow period characters in
* variable names. * variable names.
* *
@ -61,8 +61,8 @@ public class StandardEnvironment extends AbstractEnvironment {
/** /**
* Customize the set of property sources with those appropriate for any standard Java * Customize the set of property sources with those appropriate for any standard
* environment: * Java environment:
* <ul> * <ul>
* <li>{@value #SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME} * <li>{@value #SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME}
* <li>{@value #SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME} * <li>{@value #SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME}

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2013 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.
@ -25,6 +25,7 @@ import org.springframework.core.annotation.AnnotationAttributes;
import org.springframework.core.type.AnnotationMetadata; import org.springframework.core.type.AnnotationMetadata;
import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
/** /**
* Abstract base {@code @Configuration} class providing common structure for enabling * Abstract base {@code @Configuration} class providing common structure for enabling
@ -38,27 +39,26 @@ import org.springframework.util.Assert;
public abstract class AbstractTransactionManagementConfiguration implements ImportAware { public abstract class AbstractTransactionManagementConfiguration implements ImportAware {
protected AnnotationAttributes enableTx; protected AnnotationAttributes enableTx;
protected PlatformTransactionManager txManager; protected PlatformTransactionManager txManager;
@Override @Override
public void setImportMetadata(AnnotationMetadata importMetadata) { public void setImportMetadata(AnnotationMetadata importMetadata) {
this.enableTx = AnnotationAttributes.fromMap( this.enableTx = AnnotationAttributes.fromMap(
importMetadata.getAnnotationAttributes(EnableTransactionManagement.class.getName(), false)); importMetadata.getAnnotationAttributes(EnableTransactionManagement.class.getName(), false));
Assert.notNull(this.enableTx, Assert.notNull(this.enableTx,
"@EnableTransactionManagement is not present on importing class " + "@EnableTransactionManagement is not present on importing class " + importMetadata.getClassName());
importMetadata.getClassName());
} }
@Autowired(required=false) @Autowired(required=false)
void setConfigurers(Collection<TransactionManagementConfigurer> configurers) { void setConfigurers(Collection<TransactionManagementConfigurer> configurers) {
if (configurers == null || configurers.isEmpty()) { if (CollectionUtils.isEmpty(configurers)) {
return; return;
} }
if (configurers.size() > 1) { if (configurers.size() > 1) {
throw new IllegalStateException("only one TransactionManagementConfigurer may exist"); throw new IllegalStateException("Only one TransactionManagementConfigurer may exist");
} }
TransactionManagementConfigurer configurer = configurers.iterator().next(); TransactionManagementConfigurer configurer = configurers.iterator().next();
this.txManager = configurer.annotationDrivenTransactionManager(); this.txManager = configurer.annotationDrivenTransactionManager();
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2011 the original author or authors. * Copyright 2002-2013 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.
@ -45,13 +45,12 @@ public class TransactionManagementConfigurationSelector
protected String[] selectImports(AdviceMode adviceMode) { protected String[] selectImports(AdviceMode adviceMode) {
switch (adviceMode) { switch (adviceMode) {
case PROXY: case PROXY:
return new String[] { AutoProxyRegistrar.class.getName(), ProxyTransactionManagementConfiguration.class.getName() }; return new String[] {AutoProxyRegistrar.class.getName(), ProxyTransactionManagementConfiguration.class.getName()};
case ASPECTJ: case ASPECTJ:
return new String[] { TransactionManagementConfigUtils.TRANSACTION_ASPECT_CONFIGURATION_CLASS_NAME }; return new String[] {TransactionManagementConfigUtils.TRANSACTION_ASPECT_CONFIGURATION_CLASS_NAME};
default: default:
return null; return null;
} }
} }
} }