您现在的位置是:首页 >技术教程 >生成bean的注解@Component极其衍生和@ComponentScan@Configuration网站首页技术教程
生成bean的注解@Component极其衍生和@ComponentScan@Configuration
@Component
Spring 2.5 以后,除了提供基本的 @Component 注解之外,还提供了 @Service @Controller @Repository 三个注解。在 Spring 源码中,后面三个注解都在开始部分引入了 @Component 注解,除此以外这四个注解的源码内容没有任何区别,因此后面的这三个注解与 Component 的作用是一样的。之所以要额外的引出这三个注解,是为了更好的与 Web 开发中常用的三层结构相对
@Component是@Service @Controller @Repository三个注解的元注解(见下图),四个都表示创建bean对象.
此外还有@RestController注解,也经常用,也是@Component的延伸。
@Configuration
@Configration也是创建bean对象,元注解也是@Component
表示一个类声明了一个或多个@Bean方法(就是一个方法将返回值作为bean),并可由Spring容器处理,以便在运行时为这些Bean生成Bean定义和服务请求。
@Configuration
public class AppConfig {
@Bean
public MyBean myBean() {
// instantiate, configure and return bean ...
}
}
也就是@Configuration注解的类是用来生成bean的,一个@bean标注的函数对应一个bean,其通常被用来导入组件,就是因为要将组件定义为bean才能发挥作用。
@ComponentScan作用
参考https://www.cnblogs.com/east7/p/14390877.html
@ComponentScan注解主要是从约定的扫描路径中,识别标注了组件注册注解的类(也就是@Component及其延伸注解),并且把这些类自动注册到spring IoC容器中,这些类就是我们通常所言的bean。IoC容器是Spring的特色之一,可以使用它管理bean。当然,@Configration注解修饰的类也会被托管给IoC容器。
组件扫描路径
注解@ComponentScan 如果不设置value属性,默认扫描路径是启动类 XxxApplication.java 所在目录及其子目录(在一个包都不行,必须在同一个目录下),此外,所以最好还是配置value属性,减少加载时间,提高系统启动速度。
经代码验证,如果指定了@ComponentScan,那么默认的组件搜索路径会失效
比如启动类在包 com.eg.wiener 下面,那么项目启动时,会默认扫描wiener包及其子包下的所有类。也就是说,即便不明确标注@ComponentScan,Spring Boot也会自动搜索当前应用主入口目录及其下方子目录。如果其它包中的bean 不在当前主包路径下面,则应使用@ComponentScan设置value属性,配置扫描路径。如果定义了错误的扫描路径,那么在使用注解@Autowired自动装配Bean时会出错,报a bean of type that could not be found错误。
配置扫描路径
@ComponentScan注解既可以扫描包,也可以扫描指定的类。我们只需要指定一个需要扫描的路径,就可以达到更改扫描路径的目的。
- 包路径
通过value属性设置需要扫描的包:
@ComponentScan({"com.company.user","com.company.service"})
- 类路径
通过basePackageClasses属性指定需要扫描的类:
@ComponentScan(basePackageClasses={XxxService.class, YyyService.class})