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中,您必须启用。通过 通天塔。确切