栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在Spring中如何进行条件自动接线?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在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 ) { 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 ) { return new MyDependencyX();        } else { return new MyDependencyY();        }    }    // Implementation of isSingleton => false and getObjectType}

SpEL

使用SpEL,有很多可能性。最常见的是基于系统属性的条件:

<bean >    <property name="dependency" value="#{systemProperties['foo'] == 'bar' ? dependencyX : dependencyY}" /></bean>

Property placeholder

你可以让属性占位符解析你的bean引用。依赖项名称可以是应用程序配置的一部分。

<bean >    <property name="dependency" ref="${dependencyName}" /></bean>

Spring profiles

通常,要评估的条件意味着应注册或不应该注册整套bean。Spring配置文件可用于此目的:

<!-- Default dependency which is referred by myBean --><bean id="dependency"  /><beans profile="myProfile">    <!-- Override `dependency` definition if myProfile is active -->    <bean id="dependency"  /></beans>

其他方法可以将Bean定义标记为lazy-init=”true”,但是该定义仍将在应用程序上下文中注册(并且在使用不合格的自动装配时会使你的生活更加艰难)。你也可以

@Component
通过
@Profile
注释将概要文件与基于bean的文件一起使用。

检查ApplicationContextInitialier(或此示例)以查看如何以编程方式(即根据你的状况)激活配置文件。

Java config

这就是为什么基于Java的配置如此受欢迎的原因:

@Beanpublic MyBean myBean() {    MyBean myBean = new MyBean();    if (true ) {        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对应项)都经过属性解析(即可以使用
    ${}
    )。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/411253.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号