为什么我喜欢Spring bean别名

Spring框架被广泛用作依赖项注入容器,这是有充分理由的。 首先,它促进了集成测试,并赋予了我们自定义Bean创建和初始化功能的能力(例如@Autowired用于List类型 )。

但是还有一个非常有用的功能,可能会被忽略,因此让我们讨论一下bean别名

Bean别名使我们可以覆盖已配置的Bean,并用不同的对象定义替换它们。 当bean定义是从我们无法控制的外部资源继承时,这非常有用。

在下面的示例中,我将向您展示bean别名的工作方式。 让我们从src / main / resources / spring / applicationContext-tx.xml配置文件中的以下bean定义开始。

此上下文文件包含许多我们想在集成测试中使用的与事务/ JPA相关的功能。

<bean id="dataSource" class="bitronix.tm.resource.jdbc.PoolingDataSource" init-method="init" destroy-method="close">
	<property name="className" value="${jdbc.driverClassName}"/>
	<property name="uniqueName" value="dataSource"/>
	<property name="minPoolSize" value="0"/>
	<property name="maxPoolSize" value="5"/>
	<property name="allowLocalTransactions" value="false" />
	<property name="driverProperties">
		<props>
			<prop key="user">${jdbc.username}</prop>
			<prop key="password">${jdbc.password}</prop>
			<prop key="url">${jdbc.url}</prop>
		</props>
	</property>
</bean>

<bean id="jtaTransactionManager" factory-method="getTransactionManager"
	class="bitronix.tm.TransactionManagerServices" depends-on="btmConfig, dataSource"
	destroy-method="shutdown"/>

dataSource bean定义期望使用XA数据源,但是由于HSQLDB不提供XA数据源,因此我必须依靠LrcXADataSource来克服此限制。 但这意味着将dataSource更改为使用不同的className和driverProperties,但我们不能这样做,因为上下文定义来自外部工件。

幸运的是,这就是抢救bean别名的地方。 这就是我们的集成测试上下文src / test / resources / spring / applicationContext-test.xml如何利用此便捷功能的方式:

<import resource="classpath:spring/applicationContext-tx.xml" />

<bean id="testDataSource" class="bitronix.tm.resource.jdbc.PoolingDataSource" init-method="init" destroy-method="close">
	<property name="className" value="bitronix.tm.resource.jdbc.lrc.LrcXADataSource"/>
	<property name="uniqueName" value="testDataSource"/>
	<property name="minPoolSize" value="0"/>
	<property name="maxPoolSize" value="5"/>
	<property name="allowLocalTransactions" value="false" />
	<property name="driverProperties">
		<props>
			<prop key="user">${jdbc.username}</prop>
			<prop key="password">${jdbc.password}</prop>
			<prop key="url">${jdbc.url}</prop>
			<prop key="driverClassName">${jdbc.driverClassName}</prop>
		</props>
	</property>
</bean>

<alias name="testDataSource" alias="dataSource"/>

testDataSource与继承的dataSource具有相同的Class类型,但是它带有不同的对象配置。 这是我们每次需要dataSource依赖项时都要使用的数据源,而不是原始变体。 这可以通过别名关键字来实现,该关键字指示依赖项注入容器将原始数据源定义替换为新版本。

参考: 为什么我喜欢 Vlad Mihalcea博客博客中的JCG合作伙伴 Vlad Mihalcea提供的Spring bean别名

翻译自: https://www.javacodegeeks.com/2013/12/why-i-like-spring-bean-aliasing.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值