我在 inheriting bean definitions阅读了Spring 3的参考资料,但我对可能而且不可能的事情感到困惑.

例如,一个bean,它使用一个配置了值12的协作者bean

<bean name="beanService12" class="SomeSevice">
    <constructor-arg index="0" ref="serviceCollaborator1"/>
</bean>

<bean name="serviceCollaborator1" class="SomeCollaborator">
    <constructor-arg index="0" value="12"/> 
    <!-- more cargs,more beans,more flavor -->
</bean>

然后,我希望能够创建类似的bean,配置的协作者略有不同.我可以做些什么吗

<bean name="beanService13" parent="beanService12">
       <constructor-arg index="0">
          <bean>
             <constructor-arg index="0" value="13"/>
          </bean>
       </constructor>
   </bean>

我不知道这是可能的,如果是这样,它感觉有点笨拙.是否有更好的方法来覆盖大型嵌套bean定义的小部分?看起来孩子豆对于父母来说已经知道了很多,例如构造器索引.

这是一个玩具示例 – 在实践中,服务是一个大型bean定义,依赖于许多其他协作者bean,其中还有其他bean依赖关系.例如,创建一个处理程序链,每个bean引用链中的下一个,引用下一个.我想创建一个几乎相同的链条,中间的处理程序有一些小的变化,我该怎么办?

我不想更改结构 – 服务bean使用协作者来执行其功能,但如果有帮助,我可以添加属性并使用属性注入.

这是一个重复的模式,会创建一个自定义模式帮助?

感谢任何建议!

编辑:我的问题的结论是,如果我有一个非常大的bean定义,创建一个复杂的bean的创建(bean具有bean等等),我想创建一个几乎相同的bean几个变化,我该怎么办?请注意,如果您的解决方案必须使用属性,或者可以使用构造函数注入.

嵌套和顶级bean不是问题(实际上,我认为所有的bean都是实践中的顶级).

EDIT2:谢谢你的答复.一个factorybean可能是一个答案,因为这将减少弹簧上下文的复杂性,并允许我仅仅将差异指定为工厂的参数.但是,将一大堆上下文重新编入代码并不正确.我听说过春天可以用脚本,例如groovy – 是否提供了另一种选择?工厂可以在groovy中创建吗?

解决方法

我不完全确定你想要实现的目标.我不认为您可以无需创建自己的自定义模式(这对于嵌套结构来说是不平凡的),但是下面的例子可能非常接近,而不用这样做.

首先,定义一个抽象Bean作为外部bean的模板(我的示例使用一个Car作为外部bean,一个Engine作为内部bean),给出所有其他bean可以继承的默认值:

<bean id="defaultCar" class="Car" abstract="true">
    <property name="make" value="Honda"/>
    <property name="model" value="Civic"/>
    <property name="color" value="Green"/>
    <property name="numberOfWheels" value="4"/>
    <property name="engine" ref="defaultEngine"/>
</bean>

由于所有本田思域都具有相同的引擎(在我的世界,我对车无所知),我给它一个默认的嵌套引擎bean.不幸的是,一个bean不能引用抽象Bean,所以默认引擎不能是抽象的.我为引擎定义了一个具体的bean,但将其标记为lazy-init,因此除非另有一个bean使用它,否则实际上不会实例化它:

<bean id="defaultEngine" class="Engine" lazy-init="true">
    <property name="numberOfCylinders" value="4"/>
    <property name="volume" value="400"/>
    <property name="weight" value="475"/>
</bean>

现在我可以定义我的特定车,通过引用通过父级定义的bean来获取所有默认值:

<bean id="myCar" parent="defaultCar"/>

我的妻子有一辆像我的车,除了它的一个不同的模型(再一次,我不知道汽车 – 让我们假设发动机是一样的,即使在现实生活中,他们可能不是).而不是重新定义一堆bean /属性,我只是再次扩展默认的汽车定义,但是覆盖其一个属性:

<bean id="myWifesCar" parent="defaultCar">
    <property name="model" value="Odyssey"/>
</bean>

我妹妹和我妻子有同样的车(真的),但它有不同的颜色.我可以扩展一个具体的bean并覆盖其上的一个或多个属性:

<bean id="mySistersCar" parent="myWifesCar">
    <property name="color" value="Silver"/>
</bean>

如果我喜欢赛车小型货车,我可能会考虑用一个更大的发动机.在这里我扩展一个小型货车,用一个新的引擎覆盖它的默认引擎.这个新引擎扩展了默认引擎,覆盖了一些属性:

<bean id="supedUpMiniVan" parent="myWifesCar">
    <property name="engine">
        <bean parent="defaultEngine">
            <property name="volume" value="600"/>
            <property name="weight" value="750"/>
        </bean>
    </property>
</bean>

您也可以使用nested properties更简洁地做到这一点:

<bean id="supedUpMiniVan" parent="myWifesCar">
    <property name="engine.volume" value="600"/>
    <property name="engine.weight" value="750"/>
</bean>

这将使用“defaultEngine”.但是,如果您以这种方式创建两个车,每个车辆具有不同的属性值,行为将不正确.这是因为两辆汽车将共享相同的引擎实例,第二辆汽车覆盖了第一辆车上设置的属性设置.这可以通过将defaultEngine标记为“原型”来进行补救,每次引用时都会实例化一个新引擎:

<bean id="defaultEngine" class="Engine" scope="prototype">
    <property name="numberOfCylinders" value="4"/>
    <property name="volume" value="400"/>
    <property name="weight" value="475"/>
</bean>

我想这个例子给出了基本的想法.如果您的数据结构很复杂,您可以定义多个抽象Bean,或者创建几个不同的抽象层次结构,尤其是如果您的bean层次结构比两个bean更深.

旁注:我的示例使用属性,我相信在Spring xml和Java代码中都更清楚了解.然而,完全相同的技术适用于构造函数,工厂方法等.

java – spring – 构造函数注入和覆盖嵌套bean的父定义的更多相关文章

  1. ios – Xcode只看到一些嵌套类的类似扩展,这些扩展是用不同的文件编写的

    解决方法我遇到过类似的问题,似乎编译器正在尝试处理扩展嵌套类的文件,在嵌套类定义之前.因此,您有此错误说该Space没有成员SomeClass.我发现的解决方案是转到目标设置,打开BuildPhases.在“编译源”部分中,您应该将用于定义嵌套类的文件放在扩展它的文件上.这个解决方案似乎甚至可以很好地与您的观察结果一致,当您重新创建文件时,它有时会编译,因为当您重新创建文件时,它在编译源中的位置会发生变化.

  2. Xcode C开发,需要澄清

    我非常喜欢Xcode提供对该语言可能的成员函数的深入了解的方式,并且更喜欢相对于文本伙伴使用它,如果不是因为我今天注意到的奇怪.当strings=“Teststring”时;唯一可用的substr签名如图所示但据我所知,签名应该是什么iseeonline确实s.substr(1,2);既被理解也适用于Xcode.当我尝试方法完成时为什么不显示?

  3. xamarin.ios – 没有找到ViewController ::.ctor(System.IntPtr)的构造函数

    我有一个问题,我的Monotouch应用程序有时在收到内存警告后才会崩溃.请参见下面的堆栈跟踪.堆栈跟踪是正确的,因为指定的类缺少构造函数获取IntPtr参数.但是这是有意的,因为我在应用程序中根本不使用InterfaceBuilder.那为什么会这样呢?

  4. ios – 嵌套递归函数

    我试图做一个嵌套递归函数,但是当我编译时,编译器崩溃.这是我的代码:编译器记录arehere解决方法有趣的…它似乎也许在尝试在定义之前捕获到内部的引用时,它是bailing?以下修复它为我们:当然没有嵌套,我们根本没有任何问题,例如以下工作完全如预期:我会说:报告!

  5. ios – 在swift中将捕获列表正确放置在嵌套闭包中

    在Swift中为哪些嵌套闭包定义捕获的引用?如果[weakself]被捕获在只有内部最后面的闭包,GCD将保留ExampleDataSource,直到块完成执行,这就解释了为什么调试看起来像这样:同样的事情会发生,如果没有捕获列表被包括,我们从来没有可选地解开自己,尽管编译器,确实试图警告你!

  6. ios – 无效的软件包 – 嵌套软件包没有在CFBundleSupportedPlatforms Info.plist键中列出的正确平台

    我上传了一个应用程序到iOSAppStoretestflight.iOSAppStore收到以下电子邮件:InvalidBundle–Anestedbundledoesn’thavetherightplatformslistedinCFBundleSupportedplatformsInfo.plistkey.Oncetheseissueshavebeencorrected,youcanthenr

  7. ios – 如何在使用嵌套上下文时自动设置Core Data关系

    解决方法想到的第一个想法是,虽然姓名的人际关系是不可选的,但你并没有说Person的姓名关系也是不可选的.创建一个没有名字的人,可以用您的代码处理,然后在实际需要时创建名称吗?当然不用打扰自定义awakeFromInsert…

  8. ios – Swift – NSURL错误

    尝试使用下面的NSURL类时出错,下面的代码实际上是试图将我从Facebook拉入的图像存储到imageView中.错误如下:不知道为什么会这样,帮忙!解决方法你正在调用的NSURL构造函数有这个签名:?表示构造函数可能不返回值,因此它被视为可选.NSData构造函数也是如此:快速解决方法是:最好的解决方案是检查(解包)这些选项,即使您确定它们包含值!

  9. cocoa-touch – Interface Builder:如何选择嵌套元素?

    在界面构建器中是否有一种方法可以看到我的元素树,以便我可以选择它们.在实际视图中选择内容非常困难,特别是当我有很多元素和嵌套视图等时.谢谢解决方法尝试按住shift并右键单击元素.它应该显示该元素下的视图层次结构的菜单.实际上,等一下,在层次结构中显示出这个元素之上的元素.你想要做的是使用Nib窗口,选择’Window’然后设置它的列视图,这样你就可以更轻松地导航.

  10. 如何在Xcode中追踪“libc abi.dylib:纯虚函数!”

    我有一个多线程OSX应用程序,它使用C,Objective-C和Swift的混合.当我的应用程序关闭时,我在Xcode调试器窗口中看到了这一点:我知道这个错误通常是由对C类构造函数或析构函数中的虚函数的调用引起的.有没有一种简单的方法可以找到它的位置?

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部