Spring - 所有bean都被处理了吗?

时间:2011-01-25 18:09:34

标签: java spring ldap spring-ldap

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

<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   INFO:未设置属性“userDn” - 匿名上下文将用于读写操作   2011年1月25日上午11:56:37 org.springframework.ldap.core.support.AbstractContextSource afterPropertiesSet   INFO:未设置属性“userDn” - 匿名上下文将用于读写操作   2011年1月25日上午11:56:37 org.springframework.ldap.core.support.AbstractContextSource afterPropertiesSet   INFO:未设置属性'userDn' - 匿名上下文将用于读写操作

我的问题是:

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

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

谢谢,
KTM

1 个答案:

答案 0 :(得分:9)

也许你可以查看Lazy Loading of Beans。以下是Spring 2.5.x docs中的相关说明......

  

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

     

然而,有时候这个   行为不是想要的。 如果你   不想要一个单独的bean   使用时预先实例化   ApplicationContext,你可以   通过标记a来选择性地控制它   bean定义为lazy-initialized 。一个   lazily-initialized bean表示   无论是否是IoC容器   应该创建bean实例   启动或首次请求时。

为了完整性,这里有一个例子......

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