Spring Boot学习笔记1:Spring, Spring Boot中的@Component 和@ComponentScan注解用法介绍
通过本文你将学到:
- Component Scan是什么?
- 为什么ComponentScan很重要?
- 项目中Spring Boot会对哪些包自动执行扫描(Component Scan)?
- 如何利用Spring Boot定义扫描范围?
- 项目启动时关于Component Scan的常见报错
@ComponentScan
如果你理解了ComponentScan,你就理解了Spring.
Spring是一个依赖注入(dependency injection)框架。所有的内容都是关于bean的定义及其依赖关系。
定义Spring Beans的第一步是使用正确的注解-@Component或@Service或@Repository.
但是,Spring不知道你定义了某个bean除非它知道从哪里可以找到这个bean.
ComponentScan做的事情就是告诉Spring从哪里找到bean
由你来定义哪些包需要被扫描。一旦你指定了,Spring将会将在被指定的包及其下级的包(sub packages)中寻找bean
下面分别介绍在Spring Boot项目和非Spring Boot项目(如简单的JSP/Servlet或者Spring MVC应用)中如何定义Component Scan
Spring Boot项目
总结:
- 如果你的其他包都在使用了@SpringBootApplication注解的main app所在的包及其下级包,则你什么都不用做,SpringBoot会自动帮你把其他包都扫描了
- 如果你有一些bean所在的包,不在main app的包及其下级包,那么你需要手动加上@ComponentScan注解并指定那个bean所在的包
举个栗子,看下面定义的类
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); } } }
类
SpringbootIn10StepsApplication在
com.in28minutes.springboot.basics.springbootin10steps包下,这个类使用了
@SpringBootApplication注解,该注解定义了Spring将自动扫描包
com.in28minutes.springboot.basics.springbootin10steps及其子包下的bean
如果你项目中所有的类都定义在上面的包及其子包下,那你不需要做任何事。
但假如你一个类定义在包
com.in28minutes.springboot.somethingelse下,则你需要将这个新包也纳入扫描的范围,有两个方案可以达到这个目的。
方案1
定义@CoponentScan(“com.in28minutes.springboot”)
这么做扫描的范围扩大到整个父包com.in28minutes.springboot
@ComponentScan(“com.in28minutes.springboot”) @SpringBootApplication public class SpringbootIn10StepsApplication {
方案2
定义分别扫描两个包
@ComponentScan({“com.in28minutes.springboot.basics.springbootin10steps”,”com.in28minutes.springboot.somethingelse”})
@ComponentScan({"com.in28minutes.springboot.basics.springbootin10steps","com.in28minutes.springboot.somethingelse"}) @SpringBootApplication public class SpringbootIn10StepsApplication {
非Spring Boot项目
在非Spring Boot项目中,我们必须显式地使用@ComponentScan注解定义被扫描的包,可以通过XML文件在应用上下文中定义或在Java代码中对应用上下文定义
Java代码方式
@ComponentScan({"com.in28minutes.package1","com.in28minutes.package2"}) @Configuration public class SpringConfiguration {
XML文件方式
<context:component-scan base-package="com.in28minutes.package1, com.in28minutes.package2" />
项目中常见关于Component Scan的报错
你是否在项目启动中遇到过类似这样的报错:
WARNING: No mapping found for HTTP request with URI [/spring-mvc/login] in DispatcherServlet with name ‘dispatcher’
WARNING: No mapping found for HTTP request with URI [/list-todos] in DispatcherServlet with name ‘dispatcher’
或者:
ERROR:No qualifying bean of type [com.in28minutes.springboot.jpa.UserRepository] found for dependency [com.in28minutes.springboot.jpa.UserRepository]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}…
报错的根因都是bean没有被Spring找到
遇到这些错误你应该检查:
- 你是否给类加了正确的注解@Controller,@Repository,@Service或@Component
- 你是否在应用上下文定义了Component Scan
- 报错类所在的包是否在Component Scan中指定的包的范围
@Component and @ComponentScan 的区别
@Component 和 @ComponentScan的使用目的不一样
- 在某个类上使用@Component注解,表明当需要创建类时,这个被注解的类是一个候选类。就像是举手。
- @ComponentScan 用于扫描指定包下的类。就像看都有哪些举手了。
原文链接
http://www.springboottutorial.com/spring-boot-and-component-scan
阅读更多- Spring 注解方式进行事务管理的用法介绍详解【Java学习笔记】
- Spring boot 学习笔记(05)——各种常用注解
- SpringBoot的注解:@SpringBootApplication注解 vs @EnableAutoConfiguration+@ComponentScan+@Configuration
- springboot 学习之路 2(注解介绍)
- Java框架spring 学习笔记(九):Spring的bean管理(@Required、@Component、@Autowired、@Resource注解)
- springboot @ComponentScan 注解不支持扫描jar包中组件解决办法
- SPRING IN ACTION 第4版笔记-第二章-002-@ComponentScan、@Autowired的用法
- SpringBoot缓存注解学习笔记之Redis
- 《Spring+Mybatis》Mybatis简单注解配置的用法学习笔记与代码
- spring-boot起步介绍Demo,廖师兄springboot学习笔记
- spring boot 学习之路2(注解介绍)
- Spring Boot学习笔记----mybatis注解(一)
- 学习Spring笔记_Annotation(注解)_Component
- spring boot: Annotation 注解之@Target的用法介绍
- 学习Spring boot 注解 @Value @Component @ConfigurationProperties
- Spring学习笔记(15)----使用Spring注解方式管理事务
- spring注解学习笔记
- 基于注解的spring3.0.x MVC学习笔记(二)
- Spring2.5注解(标注)学习笔记
- Spring2.5注解(标注)学习笔记