2011-03-14 80 views
1

我目前正在研究一个应用程序,其中域对象D的一个实例被注入到应用程序中。域对象可以包含许多不同的组合,并按其bean定义的不同组合和排列组合,从而导致许多不同的最终对象D,我称它们为不同的D版本。对于D的给定版本,我必须填满原始值并将其保存到数据库中。使用JPA和Hibernate将它保存到数据库非常简单。问题是填写D中的值。使用SNMP通过网络获取值,然后填满。对于D的每个版本,都有不同的策略可以遵循,因为D的每个版本都可能有不同的MIB。我目前正在遵循工厂模式。工厂采用D版本并返回一个特定于该D版本的valueRetriever,然后用于获取值并填充D.在Spring中使用依赖注入来替换工厂模式

另一个明显的方法是在D中注入配置检索器,然后用它来检索配置。但是我还需要在运行时使用检索器来重新获取配置,这样就有必要将检索器存储在数据库中,因此为每个检索器创建一个新表,这似乎是目前的开销。

我的问题是:有没有更好的方法来检索配置,即有一个valueRetriever给定了上述使用依赖注入的场景。

编辑:AOP可以在这里使用吗?

回答

2

看来您需要创建的某些对象具有复杂的创建逻辑。您可能不会去查看Spring FactoryBean接口,因为FactoryBean可以通过网络获取所有复杂的细节,同时允许您创建实例并将其注入其他bean。

+0

在定义bean的实例化过程中,这可能是好的,但在将其保存到数据库之后会发生什么?在存储之后,为了在运行时检索值,即在从数据库中加载D之后,将这个基于BeanFactory的Factory仍然能够提供检索器?如果这不是真的,那么我将不得不以某种方式找到一种方法来保持工厂或检索器与D.这将是非常类似于注入与D本身的检索器作为将使用的检索器,但将该检索器保存在那么DB是必要的。 – 2011-03-14 18:33:51

0

Spring的DI 的基础是 Bean Factory/Application Context,因此完全可以替换你正在做的事情。

区别在于您必须能够将所有排列放入Spring配置中并将控制权交给应用程序上下文。如果你不能这样做,也许你的解决方案是首选。

更新:我会开始担心你的Spring解决方案将过多的陌生技术添加到可能过于复杂的情况中。

吸一口气,认为“简单”。

我现在不担心数据库。如果您可以将所需的所有组合放入bean工厂,则Spring应用程序上下文将成为数据库。我假设这些配置是只读的,一旦声明它们就不会改变。如果不是这样,所有投注都关闭。

+0

是的,如果对象总是从应用程序上下文创建,那么BeanFactory可能会非常有用,因为它可以在没有任何额外代码的情况下连线检索器。但是,当我从数据库中加载对象时,这也可以工作吗?这个BeanFactory会为该对象提供检索器吗?在这种情况下,Spring应用程序上下文不会发挥作用,所以我将不得不使用域对象本身保存一些存储在数据库中的实体。 – 2011-03-14 18:59:17

+0

如何从数据库加载它们 - 一个持久存储 - 与从Spring配置初始化它们有什么不同?你坚持认为这是必要的,但我仍然没有看到原因。请解释除“我这么说”或“这是我如何做”之外的其他内容。我很想读一个有说服力的解释。 – duffymo 2011-03-14 19:47:51

+0

我实际上要求澄清一下BeanFactory。我的意思是,当我使用entityManager.load(id)时,BeanFactory如何调用,而不是使用后加载拦截器。 BeanFactory是在第一个实例化过程中定义这个对象的bean中定义的。在这种情况下它是如何发挥作用的?我没有使用BeanFactory,所以我可能会错过很多天真的观点。请多多包涵。 – 2011-03-14 20:03:28