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依赖项时都要使用的数据源,而不是原始变体。 这可以通过别名关键字来实现,该关键字指示依赖项注入容器将原始数据源定义替换为新版本。
翻译自: https://www.javacodegeeks.com/2013/12/why-i-like-spring-bean-aliasing.html