Spring中能否在非@Configuration类中自动装配@Configuration类?
解答
可以直接注入,不存在类别的限制。
标注@Configuration的类本质上就是Spring容器管理的单例Bean,因为@Configuration本身就被@Component元标注,和@Component、@Service等注解标注的普通Bean遵循完全一致的依赖注入规则。只要满足两个基础前提,你可以在任意Spring托管的类中注入@Configuration类的实例:
- 被注入的
@Configuration类在Spring组件扫描路径范围内,能被容器正常识别加载 - 发起注入的类本身是被Spring容器托管的,包括但不限于
@Component/@Service/@Repository等标注的业务类、@Configuration标注的其他配置类、@SpringBootTest等注解标注的测试类
注意:如果类本身没有任何Spring托管相关注解(比如无任何注解的普通Java类,既没有被组件扫描识别,也没有通过
@Bean等方式注册到容器),Spring不会接管这个类的实例化过程,自然也不会为它完成依赖注入,这和你要注入的是不是@Configuration类没有关系。
可运行示例
// 被注入的@Configuration配置类 @Configuration public class AppConfig { // 类内可以正常定义@Bean方法、配置逻辑 @Bean public RestTemplate restTemplate() { return new RestTemplate(); } public String getConfigInfo() { return "config loaded"; } } // 普通@Component标注的非配置类,可直接注入 @Component public class BizService { @Autowired private AppConfig appConfig; public void doBiz() { // 直接调用配置类实例的方法即可 System.out.println(appConfig.getConfigInfo()); } } // SpringBoot测试类,同样支持直接注入 @SpringBootTest public class ConfigInjectTest { @Autowired private AppConfig appConfig; @Test void shouldInjectConfigSuccess() { // 注入的实例不为null,可正常使用 Assertions.assertNotNull(appConfig); } }
常见认知误区
不少开发者会误以为@Configuration只是用来声明Bean定义的元标记,对应的类本身不会注册为容器中的Bean,这个认知是错误的。@Configuration的元注解包含@Component,因此被它标注的类会和普通组件走完全相同的扫描、注册、注入流程,不存在只能在配置类之间互相注入的限制。
内容的提问来源于stack exchange,提问作者src2012
相关产品推荐
相关产品推荐

