Bean 扫描
在 Springboot 进行 Bean 扫描的时候,之所以能扫描到 controller、service……就是因为在启动类中有下面这个注解
这个注解是一个组合注解,包含着@ComponentScan 注解
@ComponentScan 并没有指明要扫描的包路径。这个注解,如果没有指明要扫描的包路径,默认是扫描添加了该注解的类所在的包及其子包。
在这里,@ComponentScan注解在启动类中,默认只扫描启动类所在的包及其子包
如果要扫描其他的包,以下面为例:
可以在启动类加上@ComponentScan 并指明扫描的位置,就可以扫描指定的包及其子包
Bean 注册第三方 bean
如果要注册的 bean 对象来自第三方(不是自定义的),是无法用@Component 及衍生注解声明 bean 的
Spring 提供了@Bean 和@Import 两种解决方式
使用@Bean
@Bean
@Bean
注解在Spring框架中非常常见,它用于告诉Spring:“这个方法的返回值应该被注册为一个Bean,并且可以被其他Bean引用”。
使用方法:
- 在配置类(通常带有
@Configuration
注解的类)中定义一个方法。 - 在这个方法上使用
@Bean
注解。 - 当Spring容器启动时,它会调用这个方法,并将返回值注册为一个Bean。
类比理解:
想象你是一家公司的HR,你正在招聘一个产品经理。你需要在招聘网站(Spring容器)上发布一个职位(Bean),并告诉其他部门的同事:“我这里有一个产品经理的职位空缺,你们有需要可以来找我”。
代码示例:
@Configuration
public class MyAppConfig {
@Bean
public ProductManager productManager() {
return new ProductManager();
}
}
在这个例子中,MyAppConfig
是一个配置类,productManager()
方法返回一个ProductManager
对象,并通过@Bean
注解告诉Spring:“这个方法返回的对象应该被注册为一个Bean”。
@Import
@Import
注解用于快速导入其他配置类,使得这些配置类中的Bean也可以被Spring容器管理。
使用方法:
- 在配置类(或任何Spring管理的类)上使用
@Import
注解。 - 指定要导入的配置类的类名。
类比理解:
还是回到公司的例子。假设你是一家大型公司的HR,你负责招聘多个职位。为了分工明确,你可能将招聘不同职位的任务分配给不同的HR。现在,你需要告诉公司其他部门的同事:“我这里有HR1、HR2和HR3,他们分别负责招聘不同的职位,你们可以直接找他们”。
代码示例:
@Configuration
@Import({HR1Config.class, HR2Config.class, HR3Config.class})
public class HRDepartmentConfig {
// ...
}
在这个例子中,HRDepartmentConfig
是一个配置类,它使用@Import
注解导入了HR1Config
、HR2Config
和HR3Config
这三个配置类。这意味着这三个配置类中定义的Bean也会被Spring容器管理。
总结
@Bean
用于在配置类中定义并注册单个Bean。@Import
用于快速导入其他配置类,使得这些配置类中的Bean也可以被Spring容器管理。
这两个注解都是Spring框架中非常重要的特性,它们使得Bean的定义和注册变得更加灵活和方便。通过类比生活中的例子,我们可以更好地理解它们的用途和工作原理。