【问题标题】:Spring - Do all beans get processed?春天——所有的豆子都被加工了吗?
【发布时间】:2011-01-26 02:11:52
【问题描述】:

我有一个 beans.xml 文件,用于我正在编写的 LDAP 应用程序。我允许用户选择几个 LdapContextSource(s)。对于每一个我都有不同的豆子,例如

<bean id="ldapTemplate" class="yyy.LdapTemplate">
      <constructor-arg ref="contextSource1" />
</bean>
<bean id="contextSource1" class="xxx.LdapContextSource">
      ...
</bean>
<bean id="contextSource2" class="xxx.LdapContextSource">
      ...
</bean>
<bean id="contextSource3" class="xxx.LdapContextSource">
      ...
</bean>

您可以看到这些上下文源 bean 中只有一个被实例化,因为 ldapTemplate bean 只引用了一个。但是,当我运行我的应用程序时,stdout 中的 Spring 日志消息会提供有关每个上下文源的信息,即使只有一个依赖。

2011 年 1 月 25 日上午 11:56:36 org.springframework.ldap.core.support.AbstractContextSource afterPropertiesSet 信息:未设置属性 'userDn' - 匿名上下文将用于读写操作 2011 年 1 月 25 日上午 11:56:37 org.springframework.ldap.core.support.AbstractContextSource afterPropertiesSet 信息:未设置属性 'userDn' - 匿名上下文将用于读写操作 2011 年 1 月 25 日上午 11:56:37 org.springframework.ldap.core.support.AbstractContextSource afterPropertiesSet 信息:未设置属性 'userDn' - 匿名上下文将用于读写操作

我的问题是:

(1) Spring 对未引用/不依赖的上下文源做了什么?它们永远不应该在我的应用程序中实例化,我担心 Spring 正在为这些 bean 中的每一个提供日志信息。

(2) 我应该注释掉应用程序中没有使用的上下文源bean吗?不评论它们会有什么后果?标准做法是什么?

谢谢,
公里

【问题讨论】:

    标签: java spring ldap spring-ldap


    【解决方案1】:

    也许您可以查看Lazy Loading of Beans。这是 Spring 2.5.x 文档中的相关解释...

    默认行为 ApplicationContext 实现是 急切地预先实例化所有 启动时的单例 bean。 预实例化意味着一个 ApplicationContext 将热切地创建 并配置其所有单例 bean 作为其初始化的一部分 过程。一般来说这是一个很好的 事情,因为这意味着任何 配置错误或 周边环境会 立即发现(而不是 可能几个小时甚至几天 行)。

    但是,有时这 行为不是我们想要的。 如果你 不希望单例 bean 使用时预实例化 ApplicationContext,你可以 通过标记一个选择性地控制它 bean 定义为惰性初始化。一个 延迟初始化的 bean 表示 IoC 容器是否 bean 实例应该创建在 启动或首次请求时。

    为了完整起见,这里是一个例子......

    <bean id="contextSource1" class="xxx.LdapContextSource" lazy-init="true"/>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      相关资源
      最近更新 更多