Java Spring中的组件扫描过滤器类型

Java Spring中的组件扫描过滤器类型,java,spring,Java,Spring,我正在学习Spring的使用,我在Spring的组件扫描中遇到了不同的过滤器类型 以下是可用的列表: 注释-过滤器扫描类,查找在类型级别使用给定注释进行注释的类。要扫描的批注在表达式属性中指定 assignable-筛选器扫描类,查找可分配给expression属性中指定类型的类 aspectj-过滤器扫描类,查找与表达式属性中指定的aspectj类型表达式匹配的类 自定义-使用org.springframework.core.type.TypeFilter的自定义实现,如表达式属性中所指定 正

我正在学习Spring的使用,我在Spring的组件扫描中遇到了不同的
过滤器类型

以下是可用的列表:

注释-过滤器扫描类,查找在类型级别使用给定注释进行注释的类。要扫描的批注在表达式属性中指定

assignable-筛选器扫描类,查找可分配给expression属性中指定类型的类

aspectj-过滤器扫描类,查找与表达式属性中指定的aspectj类型表达式匹配的类

自定义-使用org.springframework.core.type.TypeFilter的自定义实现,如表达式属性中所指定

正则表达式-过滤器扫描类,查找类名与表达式属性中指定的正则表达式匹配的类

基于书中给出的示例,我对可赋值和注释的过滤器类型的使用有了一些想法


但对于其余的过滤器类型,我无法理解如何使用这些类型以及何时需要使用其中一种。您能帮助我理解这里的概念吗。

AspectJ类型表达式是指AspectJ框架使用的切入点表达式。AspectJ是面向方面编程的框架。更多信息请点击这里

“自定义”意味着您可以提供自己的类来查找spring组件,而不是使用spring默认值


Regex表示正则表达式。基本上,此筛选器类型的工作方式与aspectj筛选器类似,但它不是使用aspectj类型表达式查找组件,而是使用普通正则表达式。

组件扫描告诉Spring递归查找包中的类,为找到的每个类实例化一个对象,并管理这些对象的生命周期。这些对象称为bean。(这是一个非常粗略的解释;Spring检查作用域、创建代理以及做大量其他工作,但这些细节与谈论过滤器无关。)

组件扫描过滤器缩小了要为哪些类实例化bean的范围

    您可能只想考虑具有特定注释的类,例如“代码> @组件< /代码>,并且您将使用<强>注释< /强>筛选器。<李> 您可能需要考虑实现某个接口的类,例如“代码> DAO <代码>,并且您将使用<强>可赋值< /强>。
  • 您可能需要按名称选择一些类,例如
    com.foo.*.service.*
    ,您可以使用regex
  • 您可能希望使用表达式来选择类的复杂子集,例如,
    com.foo..service.*&!com.foo..MockService
    ,您可以使用aspectj
  • 您可能很少希望根据类的元数据来选择类,例如,如果类有一个名为
    Foo
    的封闭类,则创建一个bean,并且您需要编写一个自定义
    类型过滤器
    ,这样您就可以访问该元数据
根据我个人的经验,我按受欢迎程度的顺序列出了这些,我想,
annotation
assignable
是目前最受欢迎的

更新:所有过滤器都实现为
TypeFilter
s,它们在
match
方法中查看不同的类元数据。例如,
regexpatentypefilter
实现了regex过滤器,其
match
方法如下

@Override
protected boolean match(ClassMetadata metadata) {
    return this.pattern.matcher(metadata.getClassName()).matches();
}

编写自己的自定义
TypeFilter
允许您使用
org.springframework.core.type.ClassMetadata
org.springframework.core.type.AnnotationMetadata
接口中的方法来决定Spring是否应该为具有特定元数据的类创建bean。

谢谢,你能提供一个自定义过滤器类型的例子吗?我发现很难理解什么是元数据,什么是封装类。更新了更多细节。