【问题标题】:Component scanning filter types in SpringSpring中的组件扫描过滤器类型
【发布时间】:2013-12-31 11:48:10
【问题描述】:

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

这里是可用的列表:

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

assignable - 过滤扫描类,寻找可分配给表达式属性中指定类型的类。

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

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

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

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

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

【问题讨论】:

    标签: java spring


    【解决方案1】:

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

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

    • 您可能只想考虑具有特定注释的类,例如@Component,你会为此使用 annotation 过滤器。
    • 您可能需要考虑实现特定接口的类,例如Dao,您会为此使用 assignable
    • 您可能想按名称挑选一些类,例如com.foo.**.service.*,你会为此使用 regex
    • 您可能希望使用表达式来挑选复杂的类子集,例如com.foo..service.* && !com.foo..MockService,你会为此使用 aspectj
    • 您可能极少希望通过元数据来挑选类,例如如果该类有一个名为 Foo 的封闭类,则创建一个 bean,并且您将编写一个 custom TypeFilter 来执行此操作,这样您就可以访问该元数据。

    我根据我的个人经验按受欢迎程度排列了这些,我猜annotationassignable 是迄今为止最受欢迎的。

    更新:所有过滤器都实现为TypeFilters,它们在match 方法中查看不同的类元数据。比如RegexPatternTypeFilter实现了regex过滤器,它的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带有一些特定的元数据。

    【讨论】:

    • 感谢艾默生,您能否提供一个自定义过滤器类型的示例,我很难理解什么是元数据以及什么是封闭类。
    • 更新了更多细节。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-12
      • 2017-07-29
      • 2021-05-19
      • 1970-01-01
      相关资源
      最近更新 更多