@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注解,对系统没有任何影响,产生的效果是一
样的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值