Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring lazy init是否真的像广告中那样工作?_Spring - Fatal编程技术网

Spring lazy init是否真的像广告中那样工作?

Spring lazy init是否真的像广告中那样工作?,spring,Spring,根据文档,下面的内容不应该安装MyDatabase,但我可以清楚地看到,调试时HibernateDatabase类的afterPropertiesSet方法就是这种情况。如果我删除了MyDatabaseEntityManagerFactory,则不会发生这种情况。但是,考虑到MyDatabaseEntityManagerFactory也是懒惰的,这一点应该无关紧要-它不应该导致MyDatabase初始化 要么我误解了文档中提到的懒豆引用另一个懒豆不应该导致它初始化的部分,要么Spring中存在一

根据文档,下面的内容不应该安装
MyDatabase
,但我可以清楚地看到,调试时
HibernateDatabase
类的
afterPropertiesSet
方法就是这种情况。如果我删除了MyDatabaseEntityManagerFactory,则不会发生这种情况。但是,考虑到
MyDatabaseEntityManagerFactory
也是懒惰的,这一点应该无关紧要-它不应该导致
MyDatabase
初始化

要么我误解了文档中提到的懒豆引用另一个懒豆不应该导致它初始化的部分,要么Spring中存在一个基本问题。有没有人能解释一下这一点,或者提出一个替代我想要实现的目标的方案

谢谢

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd"
    default-lazy-init="false">
    <bean id="HibernateDatabase" class="mypackage.database.HibernateDatabase"
        abstract="true" />

    <bean id="MyDatabase" parent="HibernateDatabase" lazy-init="true">
        <property name="driver" value="com.sybase.jdbc3.jdbc.SybDriver" />
        <property name="dialect" value="org.hibernate.dialect.SybaseDialect" />
        <property name="url" value="${My.dburl}" />
        <property name="user" value="${My.dbuser}" />
        <property name="password" value="${My.dbpassword}" />
    </bean>

    <bean id="EntityManagerFactory" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"
        abstract="true">
        <property name="targetMethod" value="getEntityManagerFactory" />
    </bean>

    <bean id="MyDatabaseEntityManagerFactory" parent="EntityManagerFactory" lazy-init="true">
        <property name="targetObject" ref="MyDatabase" />
    </bean>
</beans>


您是否将
MyDatabaseEntityManagerFactory
用作另一个bean中的引用?不是在这种情况下-这基本上是一个实用工具定义,需要DB引用的应用程序将根据需要引用实体,但导入此XML不会产生任何效果。这是一个事实,它是在一个我不需要数据库的应用程序中安装它们,导致了这个问题。删除定义证明没有引用它(否则Spring会抱怨缺少引用)。看看Spring为什么认为需要实例化bean可能有用。您能否将Spring放入调试日志中,以便我们可以看到它试图满足的依赖关系,从而了解它创建bean的原因?我认为可能是这样的,因为它在调用AfterPropertieSet()之前发生:org.springframework.beans.factory.support.DefaultListableBeanFactory急切地缓存bean“MyDatabase”,以允许解析潜在的循环引用为了确定导入部分不负责,我将上述数据库定义的定义移到了主Spring中。唯一有区别的是我是否定义了MyDatabaseEntityManagerFactory。如果我没有这样做,那么我基本上不会得到关于MkvDatabase的调试日志记录,除了在预实例化单例中列出它之外(尽管从代码中可以看出,它并不关心这些,只列出了所有定义)。