diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/groovy/GroovyBeanDefinitionWrapper.java b/spring-beans/src/main/java/org/springframework/beans/factory/groovy/GroovyBeanDefinitionWrapper.java index b54adc2e51e..7f1d3739e74 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/groovy/GroovyBeanDefinitionWrapper.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/groovy/GroovyBeanDefinitionWrapper.java @@ -24,7 +24,6 @@ import groovy.lang.GroovyObjectSupport; import org.springframework.beans.BeanWrapper; import org.springframework.beans.BeanWrapperImpl; -import org.springframework.beans.factory.config.AutowireCapableBeanFactory; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinitionHolder; import org.springframework.beans.factory.config.ConstructorArgumentValues; @@ -182,16 +181,16 @@ class GroovyBeanDefinitionWrapper extends GroovyObjectSupport { AbstractBeanDefinition bd = getBeanDefinition(); if (AUTOWIRE.equals(property)) { if ("byName".equals(newValue)) { - bd.setAutowireMode(AutowireCapableBeanFactory.AUTOWIRE_BY_NAME); + bd.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_NAME); } else if ("byType".equals(newValue)) { - bd.setAutowireMode(AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE); + bd.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE); } else if ("constructor".equals(newValue)) { - bd.setAutowireMode(AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR); + bd.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_CONSTRUCTOR); } else if (Boolean.TRUE.equals(newValue)) { - bd.setAutowireMode(AutowireCapableBeanFactory.AUTOWIRE_BY_NAME); + bd.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_NAME); } } // constructorArgs @@ -211,8 +210,9 @@ class GroovyBeanDefinitionWrapper extends GroovyObjectSupport { } // factoryMethod else if (FACTORY_METHOD.equals(property)) { - if (newValue != null) + if (newValue != null) { bd.setFactoryMethodName(newValue.toString()); + } } // initMethod else if (INIT_METHOD.equals(property)) { diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java index 05c9400c857..da878cccfbd 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java @@ -154,10 +154,10 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac */ private final NamedThreadLocal currentlyCreatedBean = new NamedThreadLocal<>("Currently created bean"); - /** Cache of unfinished FactoryBean instances: FactoryBean name --> BeanWrapper */ + /** Cache of unfinished FactoryBean instances: FactoryBean name to BeanWrapper */ private final ConcurrentMap factoryBeanInstanceCache = new ConcurrentHashMap<>(16); - /** Cache of filtered PropertyDescriptors: bean Class -> PropertyDescriptor array */ + /** Cache of filtered PropertyDescriptors: bean Class to PropertyDescriptor array */ private final ConcurrentMap, PropertyDescriptor[]> filteredPropertyDescriptorsCache = new ConcurrentHashMap<>(256); @@ -1116,10 +1116,9 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac } } - // Need to determine the constructor... + // Candidate constructors for autowiring? Constructor[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName); - if (ctors != null || - mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_CONSTRUCTOR || + if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR || mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) { return autowireConstructor(beanName, mbd, ctors, args); } @@ -1309,25 +1308,21 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac PropertyValues pvs = (mbd.hasPropertyValues() ? mbd.getPropertyValues() : null); - if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME || - mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) { + if (mbd.getResolvedAutowireMode() == AUTOWIRE_BY_NAME || mbd.getResolvedAutowireMode() == AUTOWIRE_BY_TYPE) { MutablePropertyValues newPvs = new MutablePropertyValues(pvs); - // Add property values based on autowire by name if applicable. - if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME) { + if (mbd.getResolvedAutowireMode() == AUTOWIRE_BY_NAME) { autowireByName(beanName, mbd, bw, newPvs); } - // Add property values based on autowire by type if applicable. - if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) { + if (mbd.getResolvedAutowireMode() == AUTOWIRE_BY_TYPE) { autowireByType(beanName, mbd, bw, newPvs); } - pvs = newPvs; } boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors(); - boolean needsDepCheck = (mbd.getDependencyCheck() != RootBeanDefinition.DEPENDENCY_CHECK_NONE); + boolean needsDepCheck = (mbd.getDependencyCheck() != AbstractBeanDefinition.DEPENDENCY_CHECK_NONE); if (hasInstAwareBpps || needsDepCheck) { if (pvs == null) { @@ -1532,9 +1527,9 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac for (PropertyDescriptor pd : pds) { if (pd.getWriteMethod() != null && !pvs.contains(pd.getName())) { boolean isSimple = BeanUtils.isSimpleProperty(pd.getPropertyType()); - boolean unsatisfied = (dependencyCheck == RootBeanDefinition.DEPENDENCY_CHECK_ALL) || - (isSimple && dependencyCheck == RootBeanDefinition.DEPENDENCY_CHECK_SIMPLE) || - (!isSimple && dependencyCheck == RootBeanDefinition.DEPENDENCY_CHECK_OBJECTS); + boolean unsatisfied = (dependencyCheck == AbstractBeanDefinition.DEPENDENCY_CHECK_ALL) || + (isSimple && dependencyCheck == AbstractBeanDefinition.DEPENDENCY_CHECK_SIMPLE) || + (!isSimple && dependencyCheck == AbstractBeanDefinition.DEPENDENCY_CHECK_OBJECTS); if (unsatisfied) { throw new UnsatisfiedDependencyException(mbd.getResourceDescription(), beanName, pd.getName(), "Set this property value or disable dependency checking for this bean."); @@ -1787,7 +1782,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac if (initMethod == null) { if (mbd.isEnforceInitMethod()) { - throw new BeanDefinitionValidationException("Couldn't find an init method named '" + + throw new BeanDefinitionValidationException("Could not find an init method named '" + initMethodName + "' on bean with name '" + beanName + "'"); } else { diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/BeanDefinitionBuilder.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/BeanDefinitionBuilder.java index 8a28c97956d..48f1be8120a 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/BeanDefinitionBuilder.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/BeanDefinitionBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -69,9 +69,7 @@ public class BeanDefinitionBuilder { * @param instanceSupplier a callback for creating an instance of the bean * @since 5.0 */ - public static BeanDefinitionBuilder genericBeanDefinition( - @Nullable Class beanClass, Supplier instanceSupplier) { - + public static BeanDefinitionBuilder genericBeanDefinition(Class beanClass, Supplier instanceSupplier) { BeanDefinitionBuilder builder = new BeanDefinitionBuilder(new GenericBeanDefinition()); builder.beanDefinition.setBeanClass(beanClass); builder.beanDefinition.setInstanceSupplier(instanceSupplier); @@ -275,7 +273,7 @@ public class BeanDefinitionBuilder { * Set the autowire mode for this definition. */ public BeanDefinitionBuilder setAutowireMode(int autowireMode) { - beanDefinition.setAutowireMode(autowireMode); + this.beanDefinition.setAutowireMode(autowireMode); return this; } @@ -283,7 +281,7 @@ public class BeanDefinitionBuilder { * Set the depency check mode for this definition. */ public BeanDefinitionBuilder setDependencyCheck(int dependencyCheck) { - beanDefinition.setDependencyCheck(dependencyCheck); + this.beanDefinition.setDependencyCheck(dependencyCheck); return this; } @@ -316,7 +314,7 @@ public class BeanDefinitionBuilder { */ public BeanDefinitionBuilder applyCustomizers(BeanDefinitionCustomizer... customizers) { for (BeanDefinitionCustomizer customizer : customizers) { - customizer.customize(beanDefinition); + customizer.customize(this.beanDefinition); } return this; } diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/ConstructorResolver.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/ConstructorResolver.java index 691910b8cce..522c61cf252 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/ConstructorResolver.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/ConstructorResolver.java @@ -44,6 +44,7 @@ import org.springframework.beans.factory.BeanCreationException; import org.springframework.beans.factory.BeanDefinitionStoreException; import org.springframework.beans.factory.InjectionPoint; import org.springframework.beans.factory.UnsatisfiedDependencyException; +import org.springframework.beans.factory.config.AutowireCapableBeanFactory; import org.springframework.beans.factory.config.ConstructorArgumentValues; import org.springframework.beans.factory.config.ConstructorArgumentValues.ValueHolder; import org.springframework.beans.factory.config.DependencyDescriptor; @@ -140,7 +141,7 @@ class ConstructorResolver { if (constructorToUse == null) { // Need to resolve the constructor. boolean autowiring = (chosenCtors != null || - mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_CONSTRUCTOR); + mbd.getResolvedAutowireMode() == AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR); ConstructorArgumentValues resolvedValues = null; int minNrOfArgs; @@ -427,7 +428,7 @@ class ConstructorResolver { AutowireUtils.sortFactoryMethods(candidates); ConstructorArgumentValues resolvedValues = null; - boolean autowiring = (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_CONSTRUCTOR); + boolean autowiring = (mbd.getResolvedAutowireMode() == AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR); int minTypeDiffWeight = Integer.MAX_VALUE; Set ambiguousFactoryMethods = null; diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/DisposableBeanAdapter.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/DisposableBeanAdapter.java index 6086b29d7b2..e9e3b56c339 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/DisposableBeanAdapter.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/DisposableBeanAdapter.java @@ -115,7 +115,7 @@ class DisposableBeanAdapter implements DisposableBean, Runnable, Serializable { this.destroyMethod = determineDestroyMethod(destroyMethodName); if (this.destroyMethod == null) { if (beanDefinition.isEnforceDestroyMethod()) { - throw new BeanDefinitionValidationException("Couldn't find a destroy method named '" + + throw new BeanDefinitionValidationException("Could not find a destroy method named '" + destroyMethodName + "' on bean with name '" + beanName + "'"); } } diff --git a/spring-context-support/src/main/java/org/springframework/scheduling/quartz/SchedulerFactoryBean.java b/spring-context-support/src/main/java/org/springframework/scheduling/quartz/SchedulerFactoryBean.java index a4a3cf4f205..b1b15a403f6 100644 --- a/spring-context-support/src/main/java/org/springframework/scheduling/quartz/SchedulerFactoryBean.java +++ b/spring-context-support/src/main/java/org/springframework/scheduling/quartz/SchedulerFactoryBean.java @@ -192,9 +192,6 @@ public class SchedulerFactoryBean extends SchedulerAccessor implements FactoryBe @Nullable private Map schedulerContextMap; - @Nullable - private ApplicationContext applicationContext; - @Nullable private String applicationContextSchedulerContextKey; @@ -213,6 +210,9 @@ public class SchedulerFactoryBean extends SchedulerAccessor implements FactoryBe private boolean waitForJobsToCompleteOnShutdown = false; + @Nullable + private ApplicationContext applicationContext; + @Nullable private Scheduler scheduler; @@ -564,10 +564,10 @@ public class SchedulerFactoryBean extends SchedulerAccessor implements FactoryBe CollectionUtils.mergePropertiesIntoMap(this.quartzProperties, mergedProps); if (this.dataSource != null) { - mergedProps.put(StdSchedulerFactory.PROP_JOB_STORE_CLASS, LocalDataSourceJobStore.class.getName()); + mergedProps.setProperty(StdSchedulerFactory.PROP_JOB_STORE_CLASS, LocalDataSourceJobStore.class.getName()); } if (this.schedulerName != null) { - mergedProps.put(StdSchedulerFactory.PROP_SCHED_INSTANCE_NAME, this.schedulerName); + mergedProps.setProperty(StdSchedulerFactory.PROP_SCHED_INSTANCE_NAME, this.schedulerName); } schedulerFactory.initialize(mergedProps); diff --git a/spring-context-support/src/test/java/org/springframework/scheduling/quartz/QuartzSupportTests.java b/spring-context-support/src/test/java/org/springframework/scheduling/quartz/QuartzSupportTests.java index 29f278ec8cd..340d6542d06 100644 --- a/spring-context-support/src/test/java/org/springframework/scheduling/quartz/QuartzSupportTests.java +++ b/spring-context-support/src/test/java/org/springframework/scheduling/quartz/QuartzSupportTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2016 the original author or authors. + * Copyright 2002-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -292,10 +292,7 @@ public class QuartzSupportTests { bean.destroy(); } - /** - * Tests the creation of multiple schedulers (SPR-772) - */ - @Test + @Test // SPR-772 public void multipleSchedulers() throws Exception { ClassPathXmlApplicationContext ctx = context("multipleSchedulers.xml"); try { @@ -363,8 +360,8 @@ public class QuartzSupportTests { @SuppressWarnings("resource") public void schedulerAutoStartupFalse() throws Exception { StaticApplicationContext context = new StaticApplicationContext(); - BeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition( - SchedulerFactoryBean.class).addPropertyValue("autoStartup", false).getBeanDefinition(); + BeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(SchedulerFactoryBean.class) + .addPropertyValue("autoStartup", false).getBeanDefinition(); context.registerBeanDefinition("scheduler", beanDefinition); Scheduler bean = context.getBean("scheduler", Scheduler.class); assertFalse(bean.isStarted()); diff --git a/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassBeanDefinitionReader.java b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassBeanDefinitionReader.java index 357b6ec5794..290fb2d25b9 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassBeanDefinitionReader.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassBeanDefinitionReader.java @@ -36,6 +36,7 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinitionHolder; import org.springframework.beans.factory.groovy.GroovyBeanDefinitionReader; import org.springframework.beans.factory.parsing.SourceExtractor; +import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.AbstractBeanDefinitionReader; import org.springframework.beans.factory.support.BeanDefinitionReader; import org.springframework.beans.factory.support.BeanDefinitionRegistry; @@ -90,8 +91,8 @@ class ConfigurationClassBeanDefinitionReader { /** - * Create a new {@link ConfigurationClassBeanDefinitionReader} instance that will be used - * to populate the given {@link BeanDefinitionRegistry}. + * Create a new {@link ConfigurationClassBeanDefinitionReader} instance + * that will be used to populate the given {@link BeanDefinitionRegistry}. */ ConfigurationClassBeanDefinitionReader(BeanDefinitionRegistry registry, SourceExtractor sourceExtractor, ResourceLoader resourceLoader, Environment environment, BeanNameGenerator importBeanNameGenerator, @@ -221,7 +222,7 @@ class ConfigurationClassBeanDefinitionReader { beanDef.setFactoryBeanName(configClass.getBeanName()); beanDef.setUniqueFactoryMethodName(methodName); } - beanDef.setAutowireMode(RootBeanDefinition.AUTOWIRE_CONSTRUCTOR); + beanDef.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_CONSTRUCTOR); beanDef.setAttribute(RequiredAnnotationBeanPostProcessor.SKIP_REQUIRED_CHECK_ATTRIBUTE, Boolean.TRUE); AnnotationConfigUtils.processCommonDefinitionAnnotations(beanDef, metadata); @@ -264,7 +265,6 @@ class ConfigurationClassBeanDefinitionReader { logger.debug(String.format("Registering bean definition for @Bean method %s.%s()", configClass.getMetadata().getClassName(), beanName)); } - this.registry.registerBeanDefinition(beanName, beanDefToRegister); } diff --git a/spring-context/src/main/java/org/springframework/context/support/GenericApplicationContext.java b/spring-context/src/main/java/org/springframework/context/support/GenericApplicationContext.java index 1a73c6be729..308fe5ddbc6 100644 --- a/spring-context/src/main/java/org/springframework/context/support/GenericApplicationContext.java +++ b/spring-context/src/main/java/org/springframework/context/support/GenericApplicationContext.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -361,8 +361,8 @@ public class GenericApplicationContext extends AbstractApplicationContext implem * bean definition metadata (typically declared as a lambda expression * or method reference). * @param beanClass the class of the bean - * @param customizers one or more callbacks for customizing the - * factory's {@link BeanDefinition}, e.g. setting a lazy-init or primary flag + * @param customizers one or more callbacks for customizing the factory's + * {@link BeanDefinition}, e.g. setting a lazy-init or primary flag * @since 5.0 * @see #registerBean(String, Class, Supplier, BeanDefinitionCustomizer...) */ @@ -377,8 +377,8 @@ public class GenericApplicationContext extends AbstractApplicationContext implem * (again typically declared as a lambda expression or method reference). * @param beanName the name of the bean (may be {@code null}) * @param beanClass the class of the bean - * @param customizers one or more callbacks for customizing the - * factory's {@link BeanDefinition}, e.g. setting a lazy-init or primary flag + * @param customizers one or more callbacks for customizing the factory's + * {@link BeanDefinition}, e.g. setting a lazy-init or primary flag * @since 5.0 * @see #registerBean(String, Class, Supplier, BeanDefinitionCustomizer...) */ @@ -393,8 +393,8 @@ public class GenericApplicationContext extends AbstractApplicationContext implem * (again typically declared as a lambda expression or method reference). * @param beanClass the class of the bean * @param supplier a callback for creating an instance of the bean - * @param customizers one or more callbacks for customizing the - * factory's {@link BeanDefinition}, e.g. setting a lazy-init or primary flag + * @param customizers one or more callbacks for customizing the factory's + * {@link BeanDefinition}, e.g. setting a lazy-init or primary flag * @since 5.0 * @see #registerBean(String, Class, Supplier, BeanDefinitionCustomizer...) */ @@ -410,10 +410,10 @@ public class GenericApplicationContext extends AbstractApplicationContext implem *

This method can be overridden to adapt the registration mechanism for * all {@code registerBean} methods (since they all delegate to this one). * @param beanName the name of the bean (may be {@code null}) - * @param beanClass the class of the bean (may be {@code null} if a name is given) + * @param beanClass the class of the bean * @param supplier a callback for creating an instance of the bean - * @param customizers one or more callbacks for customizing the - * factory's {@link BeanDefinition}, e.g. setting a lazy-init or primary flag + * @param customizers one or more callbacks for customizing the factory's + * {@link BeanDefinition}, e.g. setting a lazy-init or primary flag * @since 5.0 */ public void registerBean(@Nullable String beanName, Class beanClass, @Nullable Supplier supplier, diff --git a/spring-context/src/main/java/org/springframework/scripting/config/ScriptBeanDefinitionParser.java b/spring-context/src/main/java/org/springframework/scripting/config/ScriptBeanDefinitionParser.java index e0e906ad931..e655ad05964 100644 --- a/spring-context/src/main/java/org/springframework/scripting/config/ScriptBeanDefinitionParser.java +++ b/spring-context/src/main/java/org/springframework/scripting/config/ScriptBeanDefinitionParser.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -134,11 +134,11 @@ class ScriptBeanDefinitionParser extends AbstractBeanDefinitionParser { String autowire = element.getAttribute(AUTOWIRE_ATTRIBUTE); int autowireMode = parserContext.getDelegate().getAutowireMode(autowire); // Only "byType" and "byName" supported, but maybe other default inherited... - if (autowireMode == GenericBeanDefinition.AUTOWIRE_AUTODETECT) { - autowireMode = GenericBeanDefinition.AUTOWIRE_BY_TYPE; + if (autowireMode == AbstractBeanDefinition.AUTOWIRE_AUTODETECT) { + autowireMode = AbstractBeanDefinition.AUTOWIRE_BY_TYPE; } - else if (autowireMode == GenericBeanDefinition.AUTOWIRE_CONSTRUCTOR) { - autowireMode = GenericBeanDefinition.AUTOWIRE_NO; + else if (autowireMode == AbstractBeanDefinition.AUTOWIRE_CONSTRUCTOR) { + autowireMode = AbstractBeanDefinition.AUTOWIRE_NO; } bd.setAutowireMode(autowireMode); diff --git a/spring-context/src/test/java/org/springframework/context/annotation/AnnotationConfigApplicationContextTests.java b/spring-context/src/test/java/org/springframework/context/annotation/AnnotationConfigApplicationContextTests.java index 5baa61ba3e1..d33f5afa0e0 100644 --- a/spring-context/src/test/java/org/springframework/context/annotation/AnnotationConfigApplicationContextTests.java +++ b/spring-context/src/test/java/org/springframework/context/annotation/AnnotationConfigApplicationContextTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,7 +30,7 @@ import org.springframework.context.annotation6.ComponentForScanning; import org.springframework.context.annotation6.ConfigForScanning; import org.springframework.context.annotation6.Jsr330NamedForScanning; -import static java.lang.String.format; +import static java.lang.String.*; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; import static org.springframework.util.StringUtils.*; @@ -41,12 +41,6 @@ import static org.springframework.util.StringUtils.*; */ public class AnnotationConfigApplicationContextTests { - @Test(expected = IllegalArgumentException.class) - public void nullGetBeanParameterIsDisallowed() { - ApplicationContext context = new AnnotationConfigApplicationContext(Config.class); - context.getBean((Class) null); - } - @Test public void scanAndRefresh() { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); @@ -93,6 +87,39 @@ public class AnnotationConfigApplicationContextTests { assertThat(testBean.name, equalTo("foo")); } + @Test + public void getBeanByTypeRaisesNoSuchBeanDefinitionException() { + ApplicationContext context = new AnnotationConfigApplicationContext(Config.class); + + // attempt to retrieve a bean that does not exist + Class targetType = Pattern.class; + try { + context.getBean(targetType); + fail("Should have thrown NoSuchBeanDefinitionException"); + } + catch (NoSuchBeanDefinitionException ex) { + assertThat(ex.getMessage(), containsString(format("No qualifying bean of type '%s'", targetType.getName()))); + } + } + + @Test + public void getBeanByTypeAmbiguityRaisesException() { + ApplicationContext context = new AnnotationConfigApplicationContext(TwoTestBeanConfig.class); + + try { + context.getBean(TestBean.class); + } + catch (NoSuchBeanDefinitionException ex) { + assertThat(ex.getMessage(), + allOf( + containsString("No qualifying bean of type '" + TestBean.class.getName() + "'"), + containsString("tb1"), + containsString("tb2") + ) + ); + } + } + /** * Tests that Configuration classes are registered according to convention * @see org.springframework.beans.factory.support.DefaultBeanNameGenerator#generateBeanName @@ -119,6 +146,41 @@ public class AnnotationConfigApplicationContextTests { assertNotNull(configObject); } + @Test + public void autowiringIsEnabledByDefault() { + ApplicationContext context = new AnnotationConfigApplicationContext(AutowiredConfig.class); + assertThat(context.getBean(TestBean.class).name, equalTo("foo")); + } + + @Test + public void nullReturningBeanPostProcessor() { + AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); + context.register(AutowiredConfig.class); + context.getBeanFactory().addBeanPostProcessor(new BeanPostProcessor() { + @Override + public Object postProcessBeforeInitialization(Object bean, String beanName) { + return (bean instanceof TestBean ? null : bean); + } + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) { + return bean; + } + }); + context.getBeanFactory().addBeanPostProcessor(new BeanPostProcessor() { + @Override + public Object postProcessBeforeInitialization(Object bean, String beanName) { + bean.getClass().getName(); + return bean; + } + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) { + bean.getClass().getName(); + return bean; + } + }); + context.refresh(); + } + @Test public void individualBeans() { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); @@ -262,74 +324,6 @@ public class AnnotationConfigApplicationContextTests { assertSame(context, context.getBean("b", BeanB.class).applicationContext); } - @Test - public void getBeanByTypeRaisesNoSuchBeanDefinitionException() { - ApplicationContext context = new AnnotationConfigApplicationContext(Config.class); - - // attempt to retrieve a bean that does not exist - Class targetType = Pattern.class; - try { - context.getBean(targetType); - fail("Should have thrown NoSuchBeanDefinitionException"); - } - catch (NoSuchBeanDefinitionException ex) { - assertThat(ex.getMessage(), containsString(format("No qualifying bean of type '%s'", targetType.getName()))); - } - } - - @Test - public void getBeanByTypeAmbiguityRaisesException() { - ApplicationContext context = new AnnotationConfigApplicationContext(TwoTestBeanConfig.class); - - try { - context.getBean(TestBean.class); - } - catch (NoSuchBeanDefinitionException ex) { - assertThat(ex.getMessage(), - allOf( - containsString("No qualifying bean of type '" + TestBean.class.getName() + "'"), - containsString("tb1"), - containsString("tb2") - ) - ); - } - } - - @Test - public void autowiringIsEnabledByDefault() { - ApplicationContext context = new AnnotationConfigApplicationContext(AutowiredConfig.class); - assertThat(context.getBean(TestBean.class).name, equalTo("foo")); - } - - @Test - public void nullReturningBeanPostProcessor() { - AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); - context.register(AutowiredConfig.class); - context.getBeanFactory().addBeanPostProcessor(new BeanPostProcessor() { - @Override - public Object postProcessBeforeInitialization(Object bean, String beanName) { - return (bean instanceof TestBean ? null : bean); - } - @Override - public Object postProcessAfterInitialization(Object bean, String beanName) { - return bean; - } - }); - context.getBeanFactory().addBeanPostProcessor(new BeanPostProcessor() { - @Override - public Object postProcessBeforeInitialization(Object bean, String beanName) { - bean.getClass().getName(); - return bean; - } - @Override - public Object postProcessAfterInitialization(Object bean, String beanName) { - bean.getClass().getName(); - return bean; - } - }); - context.refresh(); - } - @Configuration static class Config { @@ -351,14 +345,6 @@ public class AnnotationConfigApplicationContextTests { } } - static class ConfigMissingAnnotation { - - @Bean - public TestBean testBean() { - return new TestBean(); - } - } - @Configuration static class TwoTestBeanConfig { diff --git a/spring-context/src/test/java/org/springframework/context/support/GenericApplicationContextTests.java b/spring-context/src/test/java/org/springframework/context/support/GenericApplicationContextTests.java index 6a42e68062a..bf480dfa47a 100644 --- a/spring-context/src/test/java/org/springframework/context/support/GenericApplicationContextTests.java +++ b/spring-context/src/test/java/org/springframework/context/support/GenericApplicationContextTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,7 +19,6 @@ package org.springframework.context.support; import org.junit.Test; import org.springframework.beans.factory.NoUniqueBeanDefinitionException; -import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.support.RootBeanDefinition; import static org.junit.Assert.*;