[英]Component scanning filter types in Spring
我正在使用Spring In Action第3版学习Spring,我在Spring的component scanning
中遇到了不同的filter types
。
这是可用的列表:
注释 - 过滤扫描类,查找在类型级别使用给定注释进行注释的扫描类。 在expression属性中指定要扫描的注释。
assignable - 过滤扫描类,查找可分配给expression属性中指定类型的类。
aspectj - 过滤扫描类,查找与expression属性中指定的AspectJ类型表达式匹配的扫描类。
custom - 使用org.springframework.core.type.TypeFilter的自定义实现,如expression属性中指定的那样。
regex - 过滤扫描类,查找其类名与expression属性中指定的正则表达式匹配的类。
根据书中给出的示例,我对过滤器类型的使用有了一些想法,可用于可分配和注释。
但对于剩余的过滤器类型,我无法理解这些类型的使用方式以及何时需要使用其中一种类型。 能帮助我理解这里的概念吗?
组件扫描告诉Spring以递归方式查找包中的类,为找到的每个类实例化一个对象,并管理这些对象的生命周期。 这些对象称为bean。 (这是一个非常粗略的解释; Spring检查范围,创建代理,并执行大量其他工作,但这些细节与讨论过滤器无关。)
组件扫描过滤器缩小了实例化bean的类的范围。
@Component
,例如@Component
,并且您将使用注释过滤器。 Dao
,并且您可以使用assignable 。 com.foo.**.service.*
,并且您将使用正则表达式 。 com.foo..service.* && !com.foo..MockService
,并且您将为此使用aspectj 。 Foo
的封闭类,则创建一个bean,然后编写一个自定义 TypeFilter
即可,从而可以访问该元数据。 我从个人经验中按顺序列出了这些,我猜这个annotation
, assignable
是迄今为止最受欢迎的。
更新:所有筛选器都实现为TypeFilter
,并且它们在其match
方法中查看类元数据的不同部分。 例如, RegexPatternTypeFilter
实现了正则表达式过滤器,其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。
AspectJ类型表达式是指AspectJ框架使用的切入点表达式。 AspectJ是面向方面的编程的框架。 此处的更多信息http://www.eclipse.org/aspectj/doc/next/progguide/semantics-pointcuts.html
“自定义”意味着您可以提供自己的类来查找弹簧组件,而不必使用spring默认值
正则表达式表示正则表达式。 基本上,此过滤器类型的工作方式与Aspectj过滤器类似,但不是使用Aspectj类型的表达式来查找组件,而是使用常规的正则表达式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.