@ComponentScan 作用


@ComponentScan用于批量注册bean。

这个注解会让spring扫描指定包及其子包中所有的类,得到一批类的数组,然后将满足过滤器条件的类作为bean注册到spring容器中。

常用参数

  • value:指定需要扫描的包
    @ComponentScan({ “xxx.xxx.xxx.controller”, “xxx.xxx.xxx.service”})
  • basePackages:作用同value;value和basePackages不能同时存在设置,二选一
    @ComponentScan(basePackages = { “xxx.xxx.xxx”})
  • basePackageClasses:指定一些类,spring容器会扫描这些类所在的包及其子包中的类
    @ComponentScan(basePackageClasses = xxx.class)
  • nameGenerator:自定义bean名称生成器
  • resourcePattern:扫描包中的那些资源
    默认是:*/.class,即会扫描指定包中所有的class文件
  • useDefaultFilters:对扫描的类是否启用默认过滤器,默认为true
  • includeFilters:过滤器
    用来配置被扫描出来的那些类会被作为组件注册到容器中
  • excludeFilters:过滤器
    和includeFilters作用刚好相反,用来对扫描的类进行排除的,被排除的类不 会被注册到容器中
  • lazyInit:是否延迟初始化被注册的bean

通过value、backPackages、basePackageClasses这3个参数来控制扫描哪些包

通过useDefaultFilters、includeFilters、excludeFilters这3个参数来控制过滤器

默认情况下,任何参数都不设置的情况下,会将@ComponentScan修饰的类(一般是程序启动类)所在的包作为扫描包;默认情况下useDefaultFilters为true,这个为true的时候,spring容器内部会使用默认过滤器,即类上有@Repository、@Service、@Controller、@Component这几个注解中的任何一个,这个类就会被作为bean注册到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对应的名称为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注解,对系统没有任何影响。

参考文章

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐