@ComponentScan和@ConditionalOnMissingBean一起使用的问题

来源:4-10 Web MVC 常用注解(下)

lcc_java

2019-07-14

@ComponentScan
public class BeanApplication {
	public static void main(String[] args) {
		ApplicationContext context = SpringApplication.run(BeanApplication.class, args);
		TestBean bean = context.getBean(TestBean.class);
		System.out.println(bean);
	}
}

@Component
@ConditionalOnMissingBean(TestBean.class)
class TestBean {
}

在上面的代码中,并没有获取到testBean这个bean。
期望的结果是@ComponentScan可以扫描所有带有@Component的类,然后根据条件@ConditionalOnMissingBean(TestBean.class)加载bean。可是实际上并没有加载,想知道怎么才能加载。

以下2种情况是可以成功加载的
第一种:

@Import(TestBean.class)
public class BeanApplication {
	public static void main(String[] args) {
		ApplicationContext context = SpringApplication.run(BeanApplication.class, args);
		TestBean bean = context.getBean(TestBean.class);
		System.out.println(bean);
	}
}

@ConditionalOnMissingBean(TestBean.class)
class TestBean {
}

第二种:

@ComponentScan
public class BeanApplication {
	public static void main(String[] args) {
		ApplicationContext context = SpringApplication.run(BeanApplication.class, args);
		TestBean bean = context.getBean(TestBean.class);
		System.out.println(bean);
	}
}

@Component
class TestBean {
}

但是这两种情况分别无法达到如下需求
第一种:不能根据@Component扫描到需要加载的bean
第二章:不能根据@ConditionalOnMissingBean进行条件装配

想请教以下,有什么好的解决方案没?

写回答

1回答

小马哥

2020-03-29

请问您使用的版本是多少?@ComponentScan 和 @SpringBootApplication 是存在区别的。

0
2
lcc_java
将 @ComponentScan 换成 @SpringBootApplication 之后的测试结果是一样的
2020-03-29
共2条回复

Spring Boot2.0深度实践 核心原理拆解+源码分析

系统化剖析Spring Boot 2.0,掌握技术原理,学习源码阅读技巧

2904 学习 · 213 问题

查看课程