springboot 扫描jar包中bean_详解Spring Boot的Component Scan原理
本文将帮助您了解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原理相关推荐
- springboot基于mybatis扫描jar包中的controller、service、dao、xml
springboot基于mybatis扫描jar包中的controller.service.dao.xml 最近有这样的需求,是将某个业务模块接口,比如新闻的接口模块 作为一个公共固定的模块,整个包括 ...
- 解决springboot读取jar包中文件的问题
解决springboot读取jar包中文件的问题 参考文章: (1)解决springboot读取jar包中文件的问题 (2)https://www.cnblogs.com/songxiaotong/p ...
- java原生和SpringBoot读取jar包中MANIFEST.MF的方式
我们经常看到java的一些jar包META-INF目录下包含一个MANIFEST.MF文件,里面包含一些版本信息,标题,实现组织,很多第三方的jar包还会自定义一个属性. 本文讲解如何读取jar包中M ...
- cmd打包jar包并运行详解
今天搜索了很多关于cmd打包jar包并运行的文章,但是感觉都不是太清楚,现在弄明白了一些(至少能用了),在这里记录一下: 主要用到以下3条指令 1.编译java文件 javac -d ./ xxx.j ...
- java如何转成jar包,修改及反编译可运行Jar包实现过程详解
将可运行Jar包,反编译成项目,修改代码,再次编译,打包. 需要工具:jd-gui.myeclipse 具体步骤: 1.使用jd-gui打开原始的Jar包,选择File-->Save All S ...
- Struts2不扫描jar包中的action
今天在做一个二开的项目,将struts打成jar包放在WEB-INF的目录下却扫描不到指定的路径,也就是http访问访问不到我们指定的action,其他代码可以正常使用,就是访问不到action.st ...
- nslookup 包含在那个包中_nslookup详解(name server lookup)( 域名查询)
一.总结 1.爬虫倒是很方便拿到页面数据:a.网页的页面源码我们可以轻松获得 b.比如cnsd博客,文章的正文内容全部放在当中,所以非常好获取,此时我们获取的是html的页面 c.html的数据自带 ...
- Springboot读取jar包中的MANIFEST.MF文件内容
Springboot打包成可执行jar包后,包结构如下所示: 工程编译后的文件都在BOOT-INF/classes目录下,如果需要读取并显示META-INF/MANIFEST.MF文件内容,那么可以用 ...
- android.mk 编译jar包,Androidmk 使用详解
和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点:一.Android.mk 简介二.Android.mk 的基本格式三.Android.mk 深入学习一四. ...
最新文章
- SCLS:巴斯德所崔杰组揭示海洋无脊椎动物RNA病毒的遗传多样
- 物联网(IoT—Internet of Things)
- (转) Android生成签名文件并用其对apk文件进行签名
- HDU 2444 The Accomodation of Students 二分图匹配
- 简单计算机面试题库及答案_试讲可以看教案吗?必看的面试考前问题解答
- [LeetCode]--3. Longest Substring Without Repeating Characters
- 机器学习——One-Hot编码
- c语言程序下三子棋,C语言实现三子棋游戏(初级版)
- graphpad做饼图_3D 饼环图初步完成
- Access数据库解密方法大盘点
- PSP??? 生产者与消费者框架,还是线程模型?
- 七:如何实现代理与日志清除技术
- 使用树莓派3开发板,基于android things 物联网系统来运行TensorFlow解析图像
- PHP+SQL考勤系统安全性的设计与实现
- Spring Cloud简单笔记
- 汇编工具DOSBOX安装使用
- 【UI设计No7】单页
- ant-design-vue 中标签页tab上额外的元素(tabBarExtraContent) , tab选项卡头增加文字
- 【Python】Pandas 表格样式设置指南,看这一篇就够了!
- Linux系统安装Chrome浏览器、CentOS安装google浏览器简单教程
热门文章
- 优化更新语句中的标量子查询
- 大数据建模,eBay的一个牛人
- C# winform 按钮 响应鼠标经过变换图片,如何处理?
- 电脑桌面出现透明条图标“复制”“刷新”解决方法
- 5 个用于在 Linux 终端中查找域名 IP 地址的命令
- bat shell 命令行中 21 的含义
- Linux中的 【 find 】 命令
- flume存储到mysql_flume_实现自定义MysqlSink,写入mysql表
- 某台机器上IE8抛“Invalid procedure call or argument”异常
- Spring velocity 中文乱码 解决方案