有没有人尝试根据条件将不同的bean自动连接到Spring管理的bean中?例如,如果满足某些条件,则注入A类,否则注入B类?我在一个Google搜索结果中看到,使用SpEL(Spring表达式语言)是可能的,但找不到有效的示例。
有多种方法可以实现此目的。通常,这取决于你要执行的条件。
Factory bean
你可以实现简单的工厂bean来进行条件连接。这样的工厂bean可以包含复杂的条件逻辑:
public MyBeanFactoryBean implements FactoryBean<MyBean> {
// Using app context instead of bean references so that the unused
// dependency can be left uninitialized if it is lazily initialized
@Autowired
private ApplicationContext applicationContext;
public MyBean getObject() {
MyBean myBean = new MyBean();
if (true /* some condition */) {
myBean.setDependency(applicationContext.getBean(DependencyX.class));
} else {
myBean.setDependency(applicationContext.getBean(DependencyY.class));
}
return myBean;
}
// Implementation of isSingleton => false and getObjectType
}
也许更好的方法是,如果你希望在应用程序上下文中仅包含一个这样的bean,则使用工厂bean创建依赖关系bean:
public MyDependencyFactoryBean implements FactoryBean<MyDependency> {
public MyDependency getObject() {
if (true /* some condition */) {
return new MyDependencyX();
} else {
return new MyDependencyY();
}
}
// Implementation of isSingleton => false and getObjectType
}
SpEL
使用SpEL,有很多可能性。最常见的是基于系统属性的条件:
<bean class="com.example.MyBean">
<property name="dependency" value="#{systemProperties['foo'] == 'bar' ? dependencyX : dependencyY}" />
</bean>
Property placeholder
你可以让属性占位符解析你的bean引用。依赖项名称可以是应用程序配置的一部分。
<bean class="com.example.MyBean">
<property name="dependency" ref="${dependencyName}" />
</bean>
Spring profiles
通常,要评估的条件意味着应注册或不应该注册整套bean。Spring配置文件可用于此目的:
<!-- Default dependency which is referred by myBean -->
<bean id="dependency" class="com.example.DependencyX" />
<beans profile="myProfile">
<!-- Override `dependency` definition if myProfile is active -->
<bean id="dependency" class="com.example.DependencyY" />
</beans>
其他方法可以将Bean定义标记为lazy-init=”true”,但是该定义仍将在应用程序上下文中注册(并且在使用不合格的自动装配时会使你的生活更加艰难)。你也可以@Component
通过@Profile
注释将概要文件与基于bean的文件一起使用。
检查ApplicationContextInitialier(或此示例)以查看如何以编程方式(即根据你的状况)激活配置文件。
Java config
这就是为什么基于Java的配置如此受欢迎的原因:
@Bean
public MyBean myBean() {
MyBean myBean = new MyBean();
if (true /* some condition */) {
myBean.setDependency(dependencyX());
} else {
myBean.setDependency(dependencyY());
}
return myBean;
}
当然,你可以在基于Java的配置,以及(通过使用更多或更少的所有配置的方法@Profile
,@Value或@Qualifier+ @Autowired
)。
Post processor
Spring
提供了许多挂钩点和SPI,你可以在其中参与应用程序上下文生命周期。本节需要更多有关Spring内部工作的知识。
BeanFactoryPostProcessor
可以读取和更改bean定义(例如,以${}
这种方式实现属性占位符解析)。
BeanPostProcessor
可以处理bean实例。可以检查新创建的bean并使用它(例如,以@Scheduled
这种方式实现注释处理)。
MergedBeanDefinitionPostProcessor
是bean后处理器的扩展,可以在实例化bean之前更改bean的定义(以@Autowired
这种方式实现注释处理)。
Spring 4添加了一种新方法,该方法如何通过注释进行条件Bean注册@Conditional。这也值得检查。
当然,通过Spring Boot单独使用Spring Boot还有许多其他方法@ConditionalOn*。
另请注意,@Import
和和@ComponentScan
(及其XML对应项)都经过属性解析(即可以使用${}
)。
SQL Server 2000 使用20多个视图,所有视图都与table1(id和value1以及value2)进行内部连接 表1 或 表2 从表1中,value1或value2应始终为null。现在的问题是,如果value1或value2列为null,则输出显示为null,因为所有视图都是id为value1、value2的内部联接 我想使用条件进行内部联接,如果value1不为null,则使用v
问题内容: 我正在尝试捕获/自动执行Selenium IDE中的鼠标滚动事件。像在Facebook朋友列表页面中一样,我们必须滚动到末尾以列出所有朋友。 我想使用Selenium IDE自动化该功能。 我做了什么 : 使用我当前的脚本,我可以登录Facebook。 然后点击标题中的我的名字,我可以进入我的个人资料页面。 在我的个人资料页面上,我存储的是朋友数量的值,然后单击“朋友”链接,可以转到朋
问题内容: 由于某些原因,当我运行“ brew link python”时,它不是符号链接。我收到以下错误,并且按提示操作去做,但是没有用。我已经尝试执行它告诉我的操作,但是也许我没有正确设置Formula_name。另外,当我执行“哪个python”时,它并不指向Homebrew python,我也需要帮助修复它。 问题答案: 你尝试了吗?
我正在开发一个应用程序,我想在其中显示一个,但我想替换默认的Android。 那么如何自定义呢? 我需要一些图形和动画吗? 我读了下面的帖子,但没能成功: 自定义进度条Android
问题内容: 在eclipse中,您可以单击任意行上的+ ,它将根据您在设置中选择的缩进方案自动缩进一行或一组行。 我真的在Netbeans中缺少此功能。有任何等效功能吗? 我所知道的+ + ,但它不够好。我想缩进一组线,而不是所有文件。 问题答案: 打开“工具” ->“ 选项” ->“ 键盘映射” ,然后查找名为“重新缩进当前行或所选内容”的操作,并设置所需的任何快捷方式。
问题:当我的spring应用程序运行时,同时数据库服务器停止/重新启动,然后db连接丢失并且从未恢复。 com.mysql.jdbc.exceptions.jdbc4.mysqlnontransientConnectionException:连接关闭后不允许任何操作。 服务mysql启动 问题:如何告诉spring在连接丢失后自动重新连接? 这是我的配置: