当前位置: 首页 > 面试题库 >

获取所有在Spring中实现通用接口的bean

许曦
2023-03-14
问题内容

如何获得<TestEvent在Spring中实现特定通用接口(例如Filter >)的所有bean的引用?

这是我希望以最少的行数实现的目标:

public interface Filter<T extends Event> {

    boolean approve(T event);

}


public class TestEventFilter implements Filter<TestEvent> {

    public boolean approve(TestEvent event){
        return false;
    }

}

public class EventHandler{
    private ApplicationContext context;

    public void Eventhandler(DomainEvent event) {
        // I want to do something like following, but this is not valid code
        Map<String, Filter> filters = context.getBeansOfType(Filter<event.getClass()>.class);
        for(Filter filter: filters.values()){
            if (!filter.approve(event)) {
                return;  // abort if a filter does not approve the event
            }
        }
        //...
    }

}

我当前的实现使用反射来确定filter.approve在调用事件之前是否确实接受该事件。例如

        Map<String, Filter> filters = context.getBeansOfType(Filter.class);
        for(Filter filter: filters.values()){
            if (doesFilterAcceptEventAsArgument(filter, event)) {
                if (!filter.approve(event)) {
                    return;  // abort if a filter does not approve the event
                }
            }
        }

dosFilterAcceptEventAsArgument在哪里做所有我想摆脱的丑陋工作。有什么建议?


问题答案:

如果您的问题是“
Spring是否有更好的方法来做到这一点”,那么答案是“否”。因此,您的方法看起来是实现此目的的普遍方法(获取原始类的所有bean,然后使用反射查找泛型边界并将其与目标类进行比较)。

通常,如果可能的话,在运行时使用通用信息非常棘手。在这种情况下,您可以获得通用范围,但是除了使用通用定义本身作为手动检查的批注形式之外,您实际上并没有从通用定义本身中获得太多好处。

无论如何,您都必须对返回的对象执行 某种
检查,因此原始代码块将无法正常工作。唯一的变化是的实现doesFilterAcceptEventAsArgument。经典的OO方法是使用以下两种方法添加抽象超类(并将后者添加到Filter接口):

protected abstract Class<E> getEventClass();

public boolean acceptsEvent(Object event) // or an appropriate class for event
{
    return getEventClass().isAssignableFrom(event.getClass());
}

这很痛苦,因为您必须getEventClass()在每个实现中都实现一些琐碎的方法才能返回适当的类文字,但这是泛型的已知限制。在语言的范围内,这可能是最干净的方法。

但您的价值无所谓。



 类似资料:
  • 我有个小问题。这可能微不足道,但我以前从未面对过。 我有一个通用接口和它的通用实现。我想自动连线,但发生了错误。以下是详细情况: 接口 实施 自动布线尝试 错误 我想让它尽可能简单。我已经检查了网络,但是我只发现了在配置中定义我的确切bean。如果可能的话,我更喜欢避免它。

  • 问题内容: 我正在实现一个接口,现在我想在classpath中获得该接口的所有实现。这可能还是我应该做些其他的事情? 问题答案: 充其量,这将是昂贵的。在最坏的情况下(取决于类加载器),这可能是不可能的。 我强烈建议您寻找一种替代方法来解决您要解决的基本问题。

  • 问题内容: 我有这个界面: 并实现该类: 在此案例中,parameter是,这是的具体实现。如何使用反射获得此效果? 问题答案: 通过通用接口解析类型。例如 PS:请记住acutalTypeArguments是type 。他们一定不是一个。在您的情况下,它是一个Class,因为您的类型定义是。

  • 本文向大家介绍Java动态获取实现某个接口下所有的实现类对象集合,包括了Java动态获取实现某个接口下所有的实现类对象集合的使用技巧和注意事项,需要的朋友参考一下 最近有个需求,我需要获取所有同一类型的定时任务的对象,并自动执行。 我想的方案是:直接获取某个接口下面所有的实现类的对象集合,方便以后只需要 实现这个接口,就能自动被加载执行。话不多说,说说我的实现方案。 开始想着用反射自己写一个工具类

  • 问题内容: 我可以用反射之类的方法做到吗? 问题答案: 我已经搜索了一段时间,似乎有不同的方法,这里是一个摘要: 如果你不介意添加依赖项,则反射库非常受欢迎。它看起来像这样: 请注意,要使其正常工作,你需要定义为并声明其实现。你这样做,通过创建一个文件的名称和声明的所有实现Pet它 包级注释。这是一个例子: 和注释定义: 并且你必须在该包内名为的文件中声明包级注释。以下是示例内容: 请注意,只有那

  • 问题内容: 返回所有直接实现的接口,即不遍历类树以获取所有父类型的所有接口。例如,层次结构 对于我想得到,但对于任何任意的树深度。 我可以自己写这个,但是我确定必须有一个已经存在的库,有什么想法吗? 问题答案: Apache Commons Lang 具有您需要的方法: