我喜欢回答面试问题。阅读下文...
@ComponentScan
如果你了解组件扫描,你就了解 Spring。
Spring 是一个依赖注入框架。这完全是关于 bean 和依赖关系的布线。
定义 Spring Beans 的第一步是添加正确的注解——@Component 或 @Service 或 @Repository。
但是,Spring 不知道 bean,除非它知道在哪里搜索它。
“告诉 Spring 在哪里搜索”的这一部分称为组件扫描。
您定义必须扫描的包。
一旦你为一个包定义了一个组件扫描,Spring 就会在这个包及其所有子包中搜索组件/bean。
定义组件扫描
- 如果您使用的是 Spring Boot,请检查方法 1 中的配置。
- 如果您正在执行 JSP/Servlet 或 Spring MVC 应用程序而没有
使用 Spring Boot,使用方法 2。
方法一:Spring Boot 项目中的组件扫描
如果您的其他包层次结构位于带有 @SpringBootApplication 注释的主应用程序下方,则隐式组件扫描将覆盖您。
如果其他包中存在非主包子包的bean/组件,则应手动添加为@ComponentScan
考虑下面的类
package com.in28minutes.springboot.basics.springbootin10steps;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class SpringbootIn10StepsApplication {
public static void main(String[] args) {
ApplicationContext applicationContext =
SpringApplication.run(SpringbootIn10StepsApplication.class, args);
for (String name: applicationContext.getBeanDefinitionNames()) {
System.out.println(name);
}
}
}
@SpringBootApplication 定义在 SpringbootIn10StepsApplication 类中,该类位于 com.in28minutes.springboot.basics.springbootin10steps 包中
@SpringBootApplication 定义了对包com.in28minutes.springboot.basics.springbootin10steps 的自动组件扫描。
如果你的所有组件都定义在上述包或它的子包中,你就可以了。
但是,假设其中一个组件在包 com.in28minutes.springboot.somethingelse 中定义
在这种情况下,您需要将新包添加到组件扫描中。
你有两个选择:
选项 1:
@ComponentScan(“com.in28minutes.springboot”)
@SpringBootApplication
public class SpringbootIn10StepsApplication {...}
选项2::定义为数组
@ComponentScan({"com.in28minutes.springboot.basics.springbootin10steps","com.in28minutes.springboot.somethingelse"})
@SpringBootApplication
public class SpringbootIn10StepsApplication {...}
方法 2:非 Spring Boot 项目
选项 1:
@ComponentScan(“com.in28minutes)
@Configuration
public class SpringConfiguration {...}
选项 2:
@ComponentScan({"com.in28minutes.package1","com.in28minutes.package2"})
@Configuration
public class SpringConfiguration {...}
XML 应用程序上下文:
<context:component-scan base-package="com.in28minutes" />
具体的多个包:
<context:component-scan base-package="com.in28minutes.package1, com.in28minutes.package2" />