背景介绍
到目前为止,介绍了2种注册bean的方式:
- xml中bean元素的方式
- @Bean注解标注方法的方式
通常情况下,项目中大部分类都需要交给spring去管理,按照上面这2种方式,代码量还是挺大的。 为了更方便bean的注册,Spring提供了批量的方式注册bean,方便大量bean批量注册,spring中的 @ComponentScan就是干这个事情的。 顺便把@Component、@Repository、@Service、@Controller一起讲了
@ComponentScan
@ComponentScan用于批量注册bean。 这个注解会让spring去扫描某些包及其子包中所有的类,然后将满足一定条件的类作为bean注册到 spring容器容器中。 具体需要扫描哪些包?以及这些包中的类满足什么条件时被注册到容器中,这些都可以通过这个注解中 的参数动态配置
@ComponentScan工作的过程:
- Spring会扫描指定的包,且会递归下面子包,得到一批类的数组
- 然后这些类会经过上面的各种过滤器,最后剩下的类会被注册到容器中
所以玩这个注解,主要关注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注解,对系统没有任何影响,产生的效果是一 样的。
|