Spring 有很多不同的创建 Bean 的方法,但是是否可以通过反序列化资源来创建 Bean?
我的应用程序有许多组件,每个组件都操作某种类型的数据。在测试过程中,数据对象被直接实例化并直接在组件上设置,例如组件.setData(someDataObject)。在运行时,数据可作为序列化对象使用,并由组件从序列化流中读取(该流作为 Spring 上下文中的资源传入。)
与让每个组件显式地从流中反序列化其数据相比,让 Spring 从资源中反序列化数据对象并将其设置在目标组件上会更加一致和灵活。这样,组件就可以与其数据的来源隔离。
是否有 DeserializerFactoryBean 或类似的东西?
编辑:
这里有一些示例代码,希望能够澄清:
public class ComponentData implements Externalizable
{
// a complex data structure, behind a simpler interface
}
public class Component
{
private ComponenttData componentData;
public Component(ComponentData data)
{
componentData = data;
}
// other methods that operate using the data
// factory method to create from serialized data
static Component createFromResource(Resource resource)
{
return new Component(deserialize(resource));
}
}
组件有很多种类型,每种组件类型都会使用不同的数据实例实例化多次。
在测试中,组件及其 ComponentData 实例是在代码中构造的。在生产中,具有“factory-method”属性的 spring-bean 用于调用静态 Componnet.createFromResource 方法,该方法反序列化资源中的数据。组件有很多种类型,每种组件都有相同的静态方法来从反序列化数据构造。由于重复,这本身看起来很糟糕。对我来说,测试和生产中的组件构建并不相同也很奇怪。如果可以将反序列化移到 Spring 上下文中,则可以删除组件上的静态方法,然后所有依赖注入(inject)都由 Spring 完成,而不必将其作为特殊情况进行编码。
例如我想象类似
<bean name="componentData" class="DeserializingFactoryBean">
<constructor-arg value="/data/componentData1.dat"/> <!-- resource -->
</bean>
<bean name="component" class="Component">
<constructor-arg ref="componentData"/>
</bean>
当我最初发布时,我认为这可能存在,但我可能在巨大的 spring javadocs 中错过了。从最初的响应来看,Spring 似乎没有反序列化工厂 bean。
如果 DeserializingFactoryBean 不是正确的方法,还有哪些替代方案?
最佳答案
Is there a
DeserializerBeanFactory
or something similar?
从来没有听说过,坦率地说,我不希望我的初始化由不透明(对人类来说)序列化对象控制。
但是,如果您确实认为这是一个好主意(咳咳),那么创建一个以这种方式工作的自定义 BeanFactory
应该不难。
关于java - 通过反序列化创建 Spring bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2720929/