From fc699b2b3784413bb7348b8c2a92eb2ab871479f Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Wed, 4 Jul 2018 22:41:05 +0200 Subject: [PATCH] @Bean provides autowireCandidate flag (analogous to XML definitions) Issue: SPR-16204 --- .../context/annotation/Bean.java | 10 ++++++- ...onfigurationClassBeanDefinitionReader.java | 5 ++++ ...anAnnotationAttributePropagationTests.java | 26 +++++++++++++++++-- 3 files changed, 38 insertions(+), 3 deletions(-) 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 35b17ac865..0dfdee9405 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 2034fca30d..9824b85229 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 5c6152262d..1053ed195f 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; } }