我正在使用Spring In Action 3rd Edition学习Spring,我在Spring的filter types
中遇到了不同的component scanning
。
以下是可用的列表:
注释 - 过滤扫描类,查找在类型级别使用给定注释进行注释的扫描类。要扫描的注释在表达式属性中指定。
assignable - 过滤扫描类,查找可分配给expression属性中指定类型的那些。
aspectj - 过滤扫描类,查找与表达式属性中指定的AspectJ类型表达式匹配的扫描类。
custom - 使用org.springframework.core.type.TypeFilter的自定义实现,如表达式属性中所指定。
regex - 过滤扫描类,查找其类名与表达式属性中指定的正则表达式匹配的类。
根据书中给出的示例,我对可分配和注释的过滤器类型的使用有所了解。
但对于剩余的过滤器类型,我无法理解这些类型的使用方式以及何时需要使用其中一种类型。能否帮助我理解这里的概念。
答案 0 :(得分:5)
组件扫描告诉Spring以递归方式查找包中的类,为找到的每个类实例化一个对象,并管理这些对象的生命周期。这些对象称为bean。 (这是一个非常粗略的解释; Spring检查范围,创建代理,并执行大量其他工作,但这些细节与讨论过滤器无关。)
组件扫描过滤器缩小了哪些类来实例化bean。
@Component
,您可以使用注释过滤器。 Dao
,您可以使用可分配。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。
答案 1 :(得分:1)
AspectJ类型表达式是指AspectJ框架使用的切入点表达式。 AspectJ是面向方面编程的框架。更多信息http://www.eclipse.org/aspectj/doc/next/progguide/semantics-pointcuts.html
“自定义”表示您可以提供自己的类来查找弹簧组件,而不是使用弹簧默认值
正则表达式是指正则表达式。基本上这个过滤器类型的工作方式类似于aspectj过滤器,但它不使用aspectj类型表达式查找组件,而是使用普通的正则表达式。