当前位置: 首页 > 网络应用技术

春季系列@componentscan,@componentscans详细信息(bean batch注册)

时间:2023-03-09 00:54:11 网络应用技术

  如果这些问题还可以,恭喜,这很好,不知道是否还可以,让我们看看。

  到目前为止,已经引入了两种注册bean的方法:

  在正常情况下,项目中的大多数类别都需要移交给Spring进行管理。根据上述两种方法,代码很大。

  为了使Bean的注册更方便,Spring提供了一种注册BEAN的批次方式,这很方便大量的BEAN批次注册。@componentscan春季正在这样做。

  @componentscan用于分批注册bean。

  该注释将使Spring可以在某些袋子及其子单元中扫描所有课程,然后注册一个符合某些条件的bean中的班级中的bean。

  您需要扫描哪些袋子?当这些软件包中的类中的类注册到容器中时,可以通过本注释中的参数进行动态配置。

  让我们看一下此注释的定义:

  可以看出,该注释可以在任何类型中使用,但是我们通常在课堂上使用它。

  常见参数:

  值:指定需要扫描的软件包,例如:com.javacode2018

  basepackages:功能与值相同;不能同时设置价值和基地。

  basepackageclasses:指定一些类,弹簧容器扫描这些类所在的袋子及其子标签

  名称机器人:自定义bean名称生成器

  Resource Patter:需要扫描扫描软件包中的资源,默认值为:*/。类,也就是说,扫描指定软件包中的所有类文件

  USEDEFAULTFILTERS:扫描类是否启用默认过滤器,默认为true

  Include filters:过滤器:用于配置扫描的类的类将被注册为容器的组件

  排除滤光器:过滤器,与插件相反。如果用于排除扫描类,则排除的类将不会注册到容器中

  lazyinit:是否延迟注册豆的初始化

  @1:@repeatable(ComponentsCans.Class),可以同时使用此注释。

  @componentscan的过程:

  因此,播放此注释主要关注2个问题:

  第一个:您需要扫描哪些包?通过这3个参数控制

  第二:过滤器是什么?通过这3个参数控制过滤器

  如果这两个问题很明确,则可以确定将在容器中注册哪些类别。

  默认情况下,当未设置任何参数时,此时将使用@componentscan修改的类别的包装,将使用用作扫描软件包;默认情况下,UnedeFaultFilters是正确的。规则是:任何在类中具有这些注释的人,然后将将此类注册为BEAN容器,因此默认情况下,这些类都将自动管理到Spring容器以管理的弹簧容器。

  这些注释由春季提供。

  让我们首先谈论此注释,并查看以下定义:

  从以下定义可以看出,可以在任何类型中使用此注释。

  在正常情况下,该注释在类上使用,并且该类被标记为组件。默认情况下,扫描后将其注册为bean。

  值参数:当注册为BEAN时,它用于指定BEAN的名称。如果未指定,则将其默默地识别为类的第一个字母。

  让我们看一下源代码如下:

  存储库具有@component注释。

  有一个值参数。设置值参数时,等于在注释中设置值的值。

  其他两个评论类似于源代码。

  这四个解决方案没有差异,可以在类上使用,表明当该类被弹簧容器扫描时,可以将其注册为弹簧容器的bean组件。

  对春季容器中这四个评论的分析没有区分对这四种注入的分析,并使用注释来统一分析,因此可以互相替换这些注释。

  Spring提供了这四个音符,以使系统更清晰。通常,系统是分层结构。大多数系统通常分为控制器层,服务层和DAO层。

  @controller通常用于标记控制器层组件,@服务注释标记了服务层的组件,@存储库标记了DAO层的组件,因此整个系统的结构可以更清晰。当您看到这些注释时,您将清楚,清晰地知道哪个层属于弹簧,将这三个注释替换为@Component注释,这对系统没有影响,效果是相同的。

  以下案例用于感觉到 @componentscan的各种用法。

  UserController

  用户服务

  USERDAO

  Usermodel

  在上述类别中,使用了4个注释。

  @compontentscan修改类

  上述类的结构图FSDFD

  测试用例

  @1:使用AnnotationConfigapplicationContext作为IOC容器,并将作为参数传递。

  默认情况下扫描类的数据包中的所有类,有@component,@repository,@service,@controller的注释

  运行输出的输出如下:

  请注意,最后4行已成功注册。

  需要扫描哪些软件包,您可以通过值或basepackage进行配置。两者是一个选择。两者均配置和操作以报告错误。下面我们通过值配置。

  Scanbean2

  上面有2个数据包需要扫描。这两个软件包有两类。

  测试案例组件中最新方法中的新方法

  几行运行的输出截距:

  可以看出,只有控制器软件包和服务软件包中的两个类别被注册为bean。

  请注意在指定包装名称的方法中扫描的隐藏危险。如果重复包装,则会导致扫描失败。通常,我们使用basepackageclasses来指定需要扫描的软件包。此参数可以指定某些类型,并扫描默认的Willthis方法可以有效地避免此问题。

  让我们看一下Basepackageclasses的方法。

  我们可以在需要扫描的软件包中定义标签接口或类。他们唯一的角色是充当基地杂货店的价值。其他人没有用。

  下面我们定义了这样的界面

  让我们定义2个类别,使用@component注释标记

  这是标有@compontentscan的类

  测试案例组件中最新方法中的新方法

  运行输出

  让我们看一下include filters参数的定义:

  这是一种数组,多个过滤器是或关系,也就是说,要满足任何一个,请查看代码:

  可以看出,过滤器也是注释,参数:

  类型:过滤器的类型是枚举类型,5种类型

  注释:通过注释过滤候选者,即确定候选人是否具有指定的注释

  agissable_type:通过指定类型筛选候选人,即确定候选人是否为指定类型

  axpectj:axpectj表达方法,即确定候选人是否与axtif the active j expression匹配

  REGEX:正则表达方法,即确定候选人的完整名称是否匹配正则表达式

  自定义:用户自定义过滤到屏幕候选人,以及候选人的筛查留给用户判断自己

  价值:像参数类效果一样,选择第二选择中的一个

  课程:3个案例如下

  当type = filterType.annotion时,您可以通过类参数指定一些注释,以确定是否在扫描类上指定了注释。

  当type = filterType.assignable_type可以通过类参数指定某些类型,以确定扫描类是“类参数”参数指定的类型

  当type = filterType.custom时,这意味着该过滤器是由用户自定义的。类参数用于指定用户定义的过滤器。自定义过滤器需求

  模式:2个案例如下

  当type = filetype.aspectj时,指定需要按模式匹配的axtipj表达式的值

  当type = filterType.regex时,正则表达式的图案值

  我们需要自定义注释,以便将带有这些注释的类自动注册到容器中

  代码实现以下代码在软件包中。

  定义注释

  创建类,使用此注释标签

  让我们在春季使用另一堂课来使用该标签

  让我们上另一个课程,使用@compontentscan

  上面指定了过滤器类型的类型。只要课程上有注释,它们就会被注册为容器的豆子。

  测试用例组件最新添加了新的测试用例

  运行输出,拦截主线

  Service1标记了注释,并已注册到容器中,但没有标记。如何注册到容器?

  原因:注释在Service2上标记,@compontentscan注释中的默认值是还将启用默认过滤器,并且默认过滤器将注册用这些注释标记的类别中的类别中。

  如果我们只想将注释的BEAN注册到容器中,则需要关闭默认过滤器,即,UserFaultFilters = false,让我们修改ScanBean3的代码,如下:

  再次运行输出:

  扩展:自定义注释支持bean名称名称上方的自定义@MyBEAN注释,该注释无法指定BEAN的名称。您可以对此注释进行转换。添加值参数以指定BEAN的名称,如下所示:

  重点是@1和@2的两个位置的代码,并且可以通过上面的参数间接设置@component注释中值的值。

  这篇文章使用@aliasfor不知道这一点。如果您不知道这一点,可以看一下:Java注释详细说明和春季的注释增强

  修改服务守则1:

  运行test3用例输出:

  目前,豆的名称变成了。

  以下代码位于袋中。

  到界面

  让弹簧扫描进行扫描,并且该类型满足了容器的静电。

  参加2个实施课程

  这是标有@compontentscan的类

  @1:扫描类别将在弹簧容器中注册

  让我们在测试案例组件中有一个新的测试用例

  运行输出

  有时,我们需要使用自定义过滤器来使用自定义过滤器的步骤:

  看一下此界面的定义:

  它是一个功能接口,其中包含匹配方法。该方法返回布尔类型。有2个参数,所有参数都是接口类型。下面介绍了两个接口。

  Metadatarer界面-Class元数据读取器可以阅读有关类的任何信息,例如上课的注释信息,类的磁盘路径信息,类类类对象的各种信息,Spring已封装,提供各种各种各种各种各样的信息类型,为使用各种类型的类型。

  看一下此界面的定义:

  MetadatAreaderFactory接口元数据读取器工厂可以通过此类获取任何元数据数据。

  源代码:

  我们需要有一个自定义过滤器来确定扫描类是接口类型,因此已注册到容器中。

  定制类TypeFilter类的代码实现:

  这是标有@compontentscan的类

  @1:类型是FilterType.custom,表明过滤器是由用户自定义的,类是自定义过滤器

  让我们在测试案例组件中有一个新的测试用例

  运行输出

  配置排除过滤器以满足满足这些过滤器的类的过滤器将不会注册到容器中。用法与包含式的使用者相同。我不会证明这一点。你可以玩自己。

  从本注释的定义来看,我们可以看到可以同时使用此注释,例如:

  使用@componentscans的另一种写作方式:

  @compontentscan注释由以下类处理

  此类非常非常重要,由主用户bean注册,@Configuration,@bean Notes前面介绍的@bean Notes也由此类处理。

  以及以下注释:

  这些注释由ConfigurationClassPostProcessor类处理。这些注释将递归处理以完成BEAN的注册。

  对于@compontentscan,在第一次扫描之后,您将获得一批需要注册的类别,然后您将穿越这些需要注册的类,以确定上面是否有任何注释。ConfigurationClassPostProcessor继续进行,直到重新完成该类别所有豆的注册。

  如果您想成为大师,那么此类是必须的。