本文将帮助您了解Spring中最重要的概念 - 组件扫描。Spring Boot在组件扫描方面做了一些魔术

@ComponentScan

如果你了解组件扫描,你就会理解Spring。Spring是一个依赖注入框架。它完全是关于依赖的bean和wiring。

定义Spring Beans的第一步是添加正确的注释 - @Component或@Service或@Repository。但是,Spring不知道bean在哪个包下面,除非你告诉它去哪里搜索包。

这部分“告诉Spring到哪里搜索”称为组件扫描。

你必须定义了需要扫描的包,为包定义组件扫描后,Spring将搜索包及其所有子包以获取组件/ bean。

下面展示了如何进行组件扫描的定义:

Spring Boot项目中的组件扫描

  • 如果你的其他包层次结构位于使用@SpringBootApplication标注主应用程序下方,则隐式组件扫描将自动涵盖。也就是说,不要明确标注@ComponentScan,Spring Boot会自动搜索当前应用主入口目录及其下方子目录。
  • 如果其他包中的bean /组件不在当前主包路径下面,,则应手动使用@ComponentScan 添加
  • 如果使用了@ComponentScan ,那么Spring Boot就全部依赖你的定义,如果定义出错,会出现autowired时出错,报a bean of type that could not be found错误,让你很恼火哦。

#######详细示例

考虑下面:

package com.jdon.springboot@SpringBootApplication
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}

@SpringBootApplication定义在MyApplication这个类上面,而这个类在包com.jdon.springboot下面。

@SpringBootApplication定义了对包com.jdon.springboot进行自动组件扫描。

如果所有组件都在上述包或其子包中定义,则一切正常。

但是,假设其中一个组件是在包中定义的 com.jdon.springboot2下,在这种情况下,需要将新包添加到组件扫描中。

两个选项

  • 定义@ComponentScan(“com.jdon.springboot2”)

    • 这将扫描com.jdon.springboot2的整个父树。
  • 或者使用数组定义两个特定的组件扫描。
    • @ComponentScan({“com.jdon.springboot2.abc”,”com.jdon.springboot2.efg”})

与组件扫描相关的错误

#### No qualifying bean of type found

No qualifying bean of type [com.jdon.springboot.jpa.UserRepository] found for dependency [com.jdon.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)}

或在Intellij Idea中显示 incorrectly saying no beans of type found for autowired repository

```

上述两个问题的根本原因相同 - 组件未被Spring boot发现。

你需要检查三种可能的情况。尚未添加正确的注释 - @ Controller,@ Repository或@Controller ;尚未添加组件扫描;组件包中未定义所需要的组件包名。

有两个解决选项:1)添加注释或组件扫描2)将组件移动到已在组件扫描下的包中

@Component和@ComponentScan有什么区别?

@Component和@ComponentScan用于不同目的。

  • @Component表示一个类可能是创建bean的候选者。就像举手一样。
  • @ComponentScan正在搜索组件包。试图找出谁都举起手来。

springboot 扫描jar包中bean_详解Spring Boot的Component Scan原理相关推荐

  1. springboot基于mybatis扫描jar包中的controller、service、dao、xml

    springboot基于mybatis扫描jar包中的controller.service.dao.xml 最近有这样的需求,是将某个业务模块接口,比如新闻的接口模块 作为一个公共固定的模块,整个包括 ...

  2. 解决springboot读取jar包中文件的问题

    解决springboot读取jar包中文件的问题 参考文章: (1)解决springboot读取jar包中文件的问题 (2)https://www.cnblogs.com/songxiaotong/p ...

  3. java原生和SpringBoot读取jar包中MANIFEST.MF的方式

    我们经常看到java的一些jar包META-INF目录下包含一个MANIFEST.MF文件,里面包含一些版本信息,标题,实现组织,很多第三方的jar包还会自定义一个属性. 本文讲解如何读取jar包中M ...

  4. cmd打包jar包并运行详解

    今天搜索了很多关于cmd打包jar包并运行的文章,但是感觉都不是太清楚,现在弄明白了一些(至少能用了),在这里记录一下: 主要用到以下3条指令 1.编译java文件 javac -d ./ xxx.j ...

  5. java如何转成jar包,修改及反编译可运行Jar包实现过程详解

    将可运行Jar包,反编译成项目,修改代码,再次编译,打包. 需要工具:jd-gui.myeclipse 具体步骤: 1.使用jd-gui打开原始的Jar包,选择File-->Save All S ...

  6. Struts2不扫描jar包中的action

    今天在做一个二开的项目,将struts打成jar包放在WEB-INF的目录下却扫描不到指定的路径,也就是http访问访问不到我们指定的action,其他代码可以正常使用,就是访问不到action.st ...

  7. nslookup 包含在那个包中_nslookup详解(name server lookup)( 域名查询)

    一.总结 1.爬虫倒是很方便拿到页面数据:a.网页的页面源码我们可以轻松获得  b.比如cnsd博客,文章的正文内容全部放在当中,所以非常好获取,此时我们获取的是html的页面 c.html的数据自带 ...

  8. Springboot读取jar包中的MANIFEST.MF文件内容

    Springboot打包成可执行jar包后,包结构如下所示: 工程编译后的文件都在BOOT-INF/classes目录下,如果需要读取并显示META-INF/MANIFEST.MF文件内容,那么可以用 ...

  9. android.mk 编译jar包,Androidmk 使用详解

    和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点:一.Android.mk 简介二.Android.mk 的基本格式三.Android.mk 深入学习一四. ...

最新文章

  1. SCLS:巴斯德所崔杰组揭示海洋无脊椎动物RNA病毒的遗传多样
  2. 物联网(IoT—Internet of Things)
  3. (转) Android生成签名文件并用其对apk文件进行签名
  4. HDU 2444 The Accomodation of Students 二分图匹配
  5. 简单计算机面试题库及答案_试讲可以看教案吗?必看的面试考前问题解答
  6. [LeetCode]--3. Longest Substring Without Repeating Characters
  7. 机器学习——One-Hot编码
  8. c语言程序下三子棋,C语言实现三子棋游戏(初级版)
  9. graphpad做饼图_3D 饼环图初步完成
  10. Access数据库解密方法大盘点
  11. PSP??? 生产者与消费者框架,还是线程模型?
  12. 七:如何实现代理与日志清除技术
  13. 使用树莓派3开发板,基于android things 物联网系统来运行TensorFlow解析图像
  14. PHP+SQL考勤系统安全性的设计与实现
  15. Spring Cloud简单笔记
  16. 汇编工具DOSBOX安装使用
  17. 【UI设计No7】单页
  18. ant-design-vue 中标签页tab上额外的元素(tabBarExtraContent) , tab选项卡头增加文字
  19. 【Python】Pandas 表格样式设置指南,看这一篇就够了!
  20. Linux系统安装Chrome浏览器、CentOS安装google浏览器简单教程

热门文章

  1. 优化更新语句中的标量子查询
  2. 大数据建模,eBay的一个牛人
  3. C# winform 按钮 响应鼠标经过变换图片,如何处理?
  4. 电脑桌面出现透明条图标“复制”“刷新”解决方法
  5. 5 个用于在 Linux 终端中查找域名 IP 地址的命令
  6. bat shell 命令行中 21 的含义
  7. Linux中的 【 find 】 命令
  8. flume存储到mysql_flume_实现自定义MysqlSink,写入mysql表
  9. 某台机器上IE8抛“Invalid procedure call or argument”异常
  10. Spring velocity 中文乱码 解决方案