IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> @ComponentScan -> 正文阅读

[Java知识库]@ComponentScan

背景介绍

到目前为止,介绍了2种注册bean的方式:

  1. xml中bean元素的方式
  2. @Bean注解标注方法的方式
    通常情况下,项目中大部分类都需要交给spring去管理,按照上面这2种方式,代码量还是挺大的。
    为了更方便bean的注册,Spring提供了批量的方式注册bean,方便大量bean批量注册,spring中的
    @ComponentScan就是干这个事情的。
    顺便把@Component、@Repository、@Service、@Controller一起讲了

@ComponentScan

@ComponentScan用于批量注册bean。
这个注解会让spring去扫描某些包及其子包中所有的类,然后将满足一定条件的类作为bean注册到
spring容器容器中。
具体需要扫描哪些包?以及这些包中的类满足什么条件时被注册到容器中,这些都可以通过这个注解中
的参数动态配置

@ComponentScan工作的过程:

  1. Spring会扫描指定的包,且会递归下面子包,得到一批类的数组
  2. 然后这些类会经过上面的各种过滤器,最后剩下的类会被注册到容器中
    所以玩这个注解,主要关注2个问题:
    第一个:需要扫描哪些包?通过value、backPackages、basePackageClasses 这3个参数来控制
    第二:过滤器有哪些?通过useDefaultFilters、includeFilters、excludeFilters 这3个参数来控制过滤器
    这两个问题搞清楚了,就可以确定哪些类会被注册到容器中。

默认情况下,任何参数都不设置的情况下,此时,会将@ComponentScan修饰的类所在的包作为扫描
包;默认情况下useDefaultFilters为true,这个为true的时候,spring容器内部会使用默认过滤器,
规则是:凡是类上有@Repository、@Service、@Controller、@Component 这几个注解中的任何一
个的,那么这个类就会被作为bean注册到spring容器中,所以默认情况下,只需在类上加上这几个注
解中的任何一个,这些类就会自动交给spring容器来管理了。

@Component、@Repository、@Service、@Controller

先说一下@Component 这个注解,看一下其定义

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface Component {
String value() default "";
}

从定义中可以看出,这个注解可以用在任何类型上面。
通常情况下将这个注解用在类上面,标注这个类为一个组件,默认情况下,被扫描的时候会被作
为bean注册到容器中。
value参数:被注册为bean的时候,用来指定bean的名称,如果不指定,默认为类名首字母小
写。如:类UserService对应的beanname为userService

再来看看@Repository 源码如下:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Repository {
@AliasFor(annotation = Component.class)
String value() default "";
}

Repository上面有@Component注解。
value参数上面有@AliasFor(annotation = Component.class) ,设置value参数的时候,也相
当于给@Component 注解中的value设置值。

其他两个注解**@Service、@Controller 源码和@Repository** 源码类似。
这4个注解本质上是没有任何差别,都可以用在类上面,表示这个类被spring容器扫描的时候,可以作
为一个bean组件注册到spring容器中。

spring容器中对这4个注解的解析并没有进行区分,统一采用@Component 注解的方式进行解析,所以
这几个注解之间可以相互替换。
spring提供这4个注解,是为了让系统更清晰,通常情况下,系统是分层结构的,多数系统一般分为
controller层、service层、dao层。
@controller通常用来标注controller层组件,@service注解标注service层的组件,@Repository标注
dao层的组件,这样可以让整个系统的结构更清晰,当看到这些注解的时候,会和清晰的知道属于哪个
层,对于spring来说,将这3个注解替换成@Component注解,对系统没有任何影响,产生的效果是一
样的。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 23:11:18  更:2022-04-01 23:13:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:50:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码