我正在编写一个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
答案 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"/>