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

时间:2013-12-31 11:48:10

标签: java spring

我正在使用Spring In Action 3rd Edition学习Spring,我在Spring的filter types中遇到了不同的component scanning

以下是可用的列表:

  

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

     

assignable - 过滤扫描类,查找可分配给expression属性中指定类型的那些。

     

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

     

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

     

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

根据书中给出的示例,我对可分配和注释的过滤器类型的使用有所了解。

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

2 个答案:

答案 0 :(得分:5)

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

组件扫描过滤器缩小了哪些类来实例化bean。

  • 您可能只想考虑具有特定注释的类,例如: @Component,您可以使用注释过滤器。
  • 您可能想要考虑实现某个界面的类,例如Dao,您可以使用可分配
  • 您可能想要按名称挑选一些类,例如com.foo.**.service.*,您可以使用正则表达式
  • 您可能希望使用表达式来挑选一个复杂的类子集,例如com.foo..service.* && !com.foo..MockService,您可以使用 aspectj
  • 您可能极少想要按其元数据选择课程,例如如果类具有名为Foo的封闭类,则创建一个bean,并且您要编写自定义 TypeFilter来执行此操作,这样您就可以访问该元数据。

我已根据个人经验列出了受欢迎程度,并且我认为annotationassignable是目前最受欢迎的。

更新:所有过滤器都实现为TypeFilter,他们会在match方法中查看不同的类元数据。例如,RegexPatternTypeFilter实现正则表达式过滤器,其match方法看起来像

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

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

答案 1 :(得分:1)

AspectJ类型表达式是指AspectJ框架使用的切入点表达式。 AspectJ是面向方面编程的框架。更多信息http://www.eclipse.org/aspectj/doc/next/progguide/semantics-pointcuts.html

“自定义”表示您可以提供自己的类来查找弹簧组件,而不是使用弹簧默认值

正则表达式是指正则表达式。基本上这个过滤器类型的工作方式类似于aspectj过滤器,但它不使用aspectj类型表达式查找组件,而是使用普通的正则表达式。