Skip to content

@Bean 'lite' mode not supported if @Bean methods are not declared locally #30449

@quaff

Description

@quaff

I'm not sure it's a bug or undocumented limitation.

If no @Bean defined in Config then @Bean defined in BaseConfig will be ignored.

@ContextConfiguration(classes = Config.class)
@ExtendWith(SpringExtension.class)
public class InjectionTests {

	@Autowired
	private String bean1;

	@Autowired
	private String bean2;

	@Test
	void test() {
		assertThat(bean1).isEqualTo("bean1");
		assertThat(bean2).isEqualTo("bean2");
	}

}

class Config extends BaseConfig {

}

class BaseConfig {
	@Bean
	String bean1() {
		return "bean1";
	}
	@Bean
	String bean2() {
		return "bean2";
	}
}

there are many workarounds

  1. move any one of @Bean to Config
class Config extends BaseConfig {
	@Bean
	String bean2() {
		return "bean2";
	}
}

class BaseConfig {
	@Bean
	String bean1() {
		return "bean1";
	}
}
  1. mark @Configuration or @Component on Config
@Configuration
// @Component
class Config extends BaseConfig {

}

class BaseConfig {
	@Bean
	String bean1() {
		return "bean1";
	}
	@Bean
	String bean2() {
		return "bean2";
	}
}
  1. use @Import instead of ContextConfiguration
@Import(Config.class)
@ExtendWith(SpringExtension.class)
public class InjectionTests {

	@Autowired
	private String bean1;

	@Autowired
	private String bean2;

	@Test
	void test() {
		assertThat(bean1).isEqualTo("bean1");
		assertThat(bean2).isEqualTo("bean2");
	}

}

Metadata

Metadata

Assignees

Labels

in: coreIssues in core modules (aop, beans, core, context, expression)type: enhancementA general enhancement

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions