繁体   English   中英

春季:在持久性上下文加载之前运行代码

[英]Spring: run code before a persistence context is loaded

我有基于Spring的多模块应用程序。 在我的DAO模块中,数据库(嵌入式derby)由实现ApplicationListener的类启动和创建。

问题是在日志中有来自Spring的巨大堆栈跟踪,其中说没有db(无法获得连接)。

尽管如此,我的应用程序仍然可以正常工作。 该堆栈跟踪出现在调用ApplicationListener并创建数据库之前。 实际上,只有在我第一次在计算机上启动应用程序时,我才能看到它,因为该数据库仅是这次创建的,而不是刚刚使用的。

所以我的问题是谁应该避免在日志中出现此异常? 也许在应用程序上下文完全加载之前,没有spring或hibenate安装程序连接到db吗? 还是调用其他侦听器创建db的代码?

我想您是从正在创建的Spring bean内部从数据库中获取一些数据的。 也许通过@PostConstruct或其他方式。 请记住,在Spring上下文完全加载之前,某些Bean可以注入未初始化的Bean。

因此,在确定Spring上下文已完全初始化之前 ,请不要使用DB,也不要调用任何DAO。

要对DAO进行此类初始调用,请尝试以下这样的模式,以确保Spring上下文的完整性:

@Component
public class SpringContextMonitor implements ApplicationListener<ApplicationEvent> {

  @Autowired
  private SomeDao dao;

  ...

  @Override
    public void onApplicationEvent(ApplicationEvent event) {
        if (event instanceof ContextRefreshedEvent) {
            onStart((ContextRefreshedEvent) event);
        }
    }

  private void onStart(ContextRefreshedEvent event) {

    // do your initialization here
    dao.getSomething();
    dao2.getSomething();
    ...

  }

  ...
}

上面示例中的onStart方法是确保所有bean都已完全初始化的地方

好吧,这就是我的方法:ROOT上下文包含数据源,Dao,服务和事务管理器。 在XML config中,数据库的声明为:

<bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"
      p:url="jdbc:derby:/path/to/database;create=TRUE" 
      p:username="user" p:password="pwd"
      p:driverClassName="org.apache.derby.jdbc.EmbeddedDriver"/>

然后可以将其用于声明休眠的会话工厂和关联的DAO为:

<bean class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"
      id="sessionFactory" p:dataSource-ref="datasource">
    <!-- hibernate config -->
    ...
</bean>
<bean class="org.springframework.orm.hibernate4.HibernateTransactionManager"
      name="transactionManager" p:sessionFactory-ref="sessionFactory"/>
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="myDao" class="... .myDaoImpl" p:sessionFactory-ref="sessionFactory" .../>

这样一来,所有内容都会在spring之前创建,从而确保创建顺序正确。 当然,在Java配置中使用相同的逻辑也可以做到这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM