当前位置: 首页 > 面试题库 >

可选的Spring bean参考

盛承
2023-03-14
问题内容

在我的应用程序中,我正在使用ContextLoaderListener从多个jar中加载上下文文件,方法是:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:META-INF/contextBeans.xml</param-value>
</context-param>

这意味着我无需导入即可引用其他jar中的bean。

在应用程序中,有多个部署选项,在某些部署中,可以排除jar。为了证明这一点,我希望一些bean引用是可选的。例如:

<bean id="mainAppBean" class="com.someapp.MyApplication">
    <constructor-arg index="0" ref="localBean"/>
     <constructor-arg index="1" ref="optionalBeanReference1"/>
    <constructor-arg index="2" ref="optionalBeanReference2"/>
 </bean>

在上面的示例中,如果未找到引用,我想让optionalBeanReference1等于null(以某种方式将其标记为可选)

可以在Spring完成吗?或你建议使用什么方法来处理动态引用?


问题答案:

你建议使用哪种方法来处理动态引用?

我认为@cristian的@Autowired答案是一个很好的答案。如果该类型的bean可用,则将调用setter方法。但是,如果你有多个相同类型的bean,我相信Spring会引发异常。如果由于这个原因或其他原因而无法使用@Autowired,我会看到一些解决方案:

  1. 你可以创建类ApplicationContextAware并自己在上下文中查找Bean:
public void setApplicationContext(ApplicationContext applicationContext) {
    if (applicationContext.containsBean("optionalBeanReference1")) {
        setOptionalBeanReference1(
            (OptionalBeanReference1)applicationContext.bean(
                "optionalBeanReference1");
    }
    ...
}
  1. 你可以反转依赖关系。每个选修课程的可以设置自己的mainAppBean。在某些情况下,当直接依赖会导致循环或其他问题时,我会使用它。
<bean id="optionalBeanReference1" class="com.someapp.SomeClass">
    <constructor-arg index="0" ref="mainAppBean"/>
</bean>

然后在SomeClass中:

public SomeClass(com.someapp.MyApplication mainAppBean) {
    mainAppBean.setOptionalBeanReference1(this);
}
  1. 你可以保持直接依赖关系,然后使用定义的bean导入文件,或者使用工厂bean导入另一个文件,在其中定义bean为空值的文件。


 类似资料:
  • 问题内容: 最近,我与队友讨论了 在方法中使用可选参数的问题。 假设方法是 接受一个和 可选参数 ,它返回该目录中列出的书籍,如果还传递了类别,则仅返回该类别中的书籍。 冲突点是,验证是否为空检查。我认为不应对此进行空检查,因为它是可选参数。函数的调用者可以通过或,并且函数应在实现中处理两种情况。 我的意见是,对于可选参数,只会使方法的约定更加明确。只需查看方法签名即可知道此参数是可选的,不需要读

  • 最近,我和我的队友讨论了在方法中使用作为可选参数。 假设方法是 我的观点是,对于可选参数,只会使方法的契约更加清晰。只要看一下方法签名就可以知道这个参数是可选的,不需要读取JavaDocs。但当他不想使用该可选参数时,不应强制他传递。 我的队友有不同的看法。他希望对其进行空检查,从而强制调用方始终传递。他的观点是为什么我们要通过一个空的可选选项。此外,看起来比更易读。 这个方法在我们的一个库包中,

  • 用户在这个插件的很多方面都可以进行定制,用户通过插件选项来达到这个目的(这些选项会在插件初始化的时候起效)。这些选项包括: 选项 描述 aspectRatio 长宽比,以后在选择时候就会维持不变。例如:"4:3" autoHide 如果设为true,那么在选择完后区域会消失。Default:false classPrefix 预先给插件元素的前缀 Default:imgareaselect dis

  • 英文原文:http://www.phpconcept.net/pclzip/user-guide/5 可选参数(普通参数) PCLZIP_OPT_PATH PCLZIP_OPT_ADD_PATH PCLZIP_OPT_REMOVE_PATH PCLZIP_OPT_REMOVE_ALL_PATH PCLZIP_OPT_SET_CHMOD PCLZIP_OPT_BY_NAME PCLZIP_OPT_B

  • 问题内容: Go可以有可选参数吗?还是可以只定义两个具有相同名称和不同数量参数的函数? 问题答案: Go没有可选参数,也不支持方法重载: 如果方法调度也不需要进行类型匹配,则可以简化该方法。其他语言的经验告诉我们,使用具有相同名称但签名不同的多种方法有时会很有用,但在实践中也可能会造成混淆和脆弱。在Go的类型系统中,仅按名称进行匹配并要求类型一致是简化的主要决定。

  • 问题内容: 我有一个像这样的Django URL: views.py: 问题是我希望参数是可选的。 我希望并且成为同等有效的URL模式,以便如果 通过,那么我可以使用它。 就目前而言,访问不带参数的URL时会得到404 。 问题答案: 有几种方法。 一种是在正则表达式中使用非捕获组:使正则 表达式Django URL令牌为可选 另一种更容易遵循的方法是拥有多个符合你需求的规则,所有规则都指向同一视