diff --git a/spring-context/src/main/java/org/springframework/context/annotation/Bean.java b/spring-context/src/main/java/org/springframework/context/annotation/Bean.java index 35b17ac86528570ca6398b071d3e372cd686f18a..0dfdee94051e98b6a8685def604898236607883f 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/Bean.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/Bean.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. @@ -251,6 +251,14 @@ public @interface Bean { */ Autowire autowire() default Autowire.NO; + /** + * Is this bean a candidate for getting autowired into some other bean? + *

Default is {@code true}; set this to {@code false} for internal delegates + * that are not meant to get in the way of beans of the same type in other places. + * @since 5.1 + */ + boolean autowireCandidate() default true; + /** * The optional name of a method to call on the bean instance during initialization. * Not commonly used, given that the method may be called programmatically directly 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 2034fca30d44fd33db5d46d0916962cd99361dc9..9824b852294e044a8cdebed780808bf0497022c8 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 @@ -232,6 +232,11 @@ class ConfigurationClassBeanDefinitionReader { beanDef.setAutowireMode(autowire.value()); } + boolean autowireCandidate = bean.getBoolean("autowireCandidate"); + if (!autowireCandidate) { + beanDef.setAutowireCandidate(false); + } + String initMethodName = bean.getString("initMethod"); if (StringUtils.hasText(initMethodName)) { beanDef.setInitMethodName(initMethodName); diff --git a/spring-context/src/test/java/org/springframework/context/annotation/configuration/BeanAnnotationAttributePropagationTests.java b/spring-context/src/test/java/org/springframework/context/annotation/configuration/BeanAnnotationAttributePropagationTests.java index 5c6152262d0f0ec9cd2ece4e40f0772c6424589a..1053ed195fbb80c1222c7f95597b2b8cf1c5b507 100644 --- a/spring-context/src/test/java/org/springframework/context/annotation/configuration/BeanAnnotationAttributePropagationTests.java +++ b/spring-context/src/test/java/org/springframework/context/annotation/configuration/BeanAnnotationAttributePropagationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 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. @@ -18,6 +18,7 @@ package org.springframework.context.annotation.configuration; import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowire; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.DefaultListableBeanFactory; @@ -41,9 +42,30 @@ import static org.junit.Assert.*; * correctly into the resulting BeanDefinition * * @author Chris Beams + * @author Juergen Hoeller */ public class BeanAnnotationAttributePropagationTests { + @Test + public void autowireMetadataIsPropagated() { + @Configuration class Config { + @Bean(autowire=Autowire.BY_TYPE) Object foo() { return null; } + } + + assertEquals("autowire mode was not propagated", + AbstractBeanDefinition.AUTOWIRE_BY_TYPE, beanDef(Config.class).getAutowireMode()); + } + + @Test + public void autowireCandidateMetadataIsPropagated() { + @Configuration class Config { + @Bean(autowireCandidate=false) Object foo() { return null; } + } + + assertFalse("autowire candidate flag was not propagated", + beanDef(Config.class).isAutowireCandidate()); + } + @Test public void initMethodMetadataIsPropagated() { @Configuration class Config { @@ -138,7 +160,7 @@ public class BeanAnnotationAttributePropagationTests { @Test public void eagerConfigurationProducesEagerBeanDefinitions() { - @Lazy(false) @Configuration class Config { // will probably never happen, doesn't make much sense + @Lazy(false) @Configuration class Config { // will probably never happen, doesn't make much sense @Bean Object foo() { return null; } }