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

如何在Spring XML配置中收集和注入给定类型的所有bean

芮立果
2023-03-14
问题内容

Spring框架最重要的特征之一就是依赖注入概念。我理解背后的建议之一是将一般的高级机制与低级细节分开(如Dependency
Inversion
Principle

所宣布)。

从技术上讲,这可以归结为让Bean实现尽可能少地了解作为依赖项注入的Bean,例如

public class PrintOutBean {
    private LogicBean logicBean;
    public void action() {
        System.out.println(logicBean.humanReadableDetails());
    }
    //...
}

<bean class="PrintOutBean">
    <property name="loginBean" ref="ShoppingCartBean"/>
</bean>

但是,如果我想拥有一个在多个从属bean上运行的高级机制,该怎么办?

  public class MenuManagementBean {
       private Collection<Option> options;
       public void printOut() {
            for (Option option:options) {
              // do something for option
            }
            //...
       }
  }

我知道一种解决方案是@Autowired在单例bean中使用批注,即…

  @Autowired
  private Collection<Option> options;

但这不违反分离原则吗?为什么我必须在要使用的依赖项中指定要使用的依赖项(即MenuManagementBean示例中的类)?有没有办法像这样在XML配置中注入bean的集合(在MMB类中没有任何注释)?

<bean class="MenuManagementBean">
    <property name="options">
       <xxx:autowire by-type="MyOptionImpl"/>
    </property>
 </bean>

问题答案:

没有开箱即用的工具可以做到这一点,没有。但是,如果您想要一种无需使用@Autowired列表即可将给定类型的所有bean收集到一个集合中的方法,那么可以很容易地编写一个自定义方法FactoryBean来为您做这件事:

public class BeanListFactoryBean<T> extends AbstractFactoryBean<Collection<T>> {

    private Class<T> beanType;
    private @Autowired ListableBeanFactory beanFactory;

    @Required
    public void setBeanType(Class<T> beanType) {
        this.beanType = beanType;
    }

    @Override
    protected Collection<T> createInstance() throws Exception {
        return beanFactory.getBeansOfType(beanType).values();
    }

    @Override
    public Class<?> getObjectType() {
        return Collection.class;
    }    
}

然后

 <bean class="MenuManagementBean">
    <property name="options">
       <bean class="BeanListFactoryBean">
          <property name="beanType" class="MyOptionImpl.class"/>
       </bean>
    </property>
 </bean>

但是,这一切似乎都需要花很多精力来避免@Autowired进入您的原始课堂。根本就没有违反SoC的情况-
没有编译时依赖性,也不知道SoC的options来源。



 类似资料:
  • 问题内容: 如何去尝试找到Java中给定类的所有子类(或给定接口的所有实现者)?到目前为止,我有一种方法可以执行此操作,但是我发现它效率很低(至少可以这样说)。方法是: 获取类路径上存在的所有类名称的列表 加载每个类并测试以查看它是否是所需类或接口的子类或实现者 在Eclipse中,有一个很好的功能,称为类型层次结构(Type Hierarchy),可以很有效地显示它。如何进行编程? 问题答案:

  • 假设我有一个博客数据集,看起来像 在这里,每个文档代表一篇博客文章。每个博客帖子可以有多个评论,但只有一个我的一个用户。比如说,我必须找到某位作者的所有评论。对此有何疑问? 一种方法是释放评论,然后按comments.author分组,并推送comments.body。 然而,它可以做到没有聚合管道,只是通过使用查找?因为我认为我应该通过寻找来做到这一点。有人能帮我吗?

  • 问题内容: 在自定义的Wicket类中,与下面的类似,我使用的是应由Spring注入的服务bean,如通过SpringBean批注定义的(来自wicket- spring项目)。 但是,这是行不通的:NullPointerException失败,因为由于 某种原因Spring尚未注入该bean 。 奇怪的是,我在Wicket页面上使用了与匿名内部类完全相同的Model代码,并且在那里没有问题。 我

  • 这个 relationship() 函数定义两个类之间的链接。当链接定义了一对多或多对多关系时,当加载和操作对象时,它被表示为一个Python集合。本节介绍有关收集配置和技术的其他信息。 处理大型集合 的默认行为 relationship() 是将完全加载项集合中,根据加载策略的关系。另外, Session 默认情况下,只知道如何删除会话中实际存在的对象。当父实例标记为删除并刷新时, Sessio

  • 我试图在一个方法中使用泛型,在这个方法中,我将一个json反序列化为pojo,这样它就可以返回任何对象类型。 这里我的代码: 问题是

  • 问题内容: 通过将Angular 1.4与ES6 / 7和Babel结合使用,我可以在类块之后使用以下代码将参数成功地注入到名为Controller的类中: 但是,在构造函数上方看到inject参数会更干净。我见过其他人使用静态$ inject,但出现错误。这是我正在尝试的: 为什么会导致此错误?它似乎为其他人工作。 问题答案: 那是实验性提议的语法。在Babel中,您必须启用。通过 通天塔。确切