0

我是 Spring Hibernate 的新手,所以我遇到了由在静态块中初始化的函数引起的这个问题。

这是我的 DAO 课程:

private static HibernateTemplate hibernateTemplate;
public void setSessionFactory(SessionFactory sessionFactory) {
    hibernateTemplate = new HibernateTemplate(sessionFactory);
}

static{
    loadAllProvince();
}
public static void loadAllProvince ()  {
    List regionList = hibernateTemplate.find("FROM regions");

    if (regionList.size() > 0 ) {           
       for (int i=0; i<regionList.size(); i++) {                
          Object[] obj = (Object[]) regionList.get(i) ;
          mapRegion.put(obj[1].toString(), obj[0].toString());                  
       }                        
    }   
 }

这是我的 applicationContext.xml 中的 bean 配置:

<bean id="regionDAOBean" class="com.dao.RegionDAO">
   <property name="sessionFactory" ref="sessionFactoryBean"/> 
</bean>

当我运行我的应用程序时,异常说:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'regionDAOBean' defined in class path resource [applicationContext.xml]: 
Instantiation of bean failed; nested exception is java.lang.ExceptionInInitializerError

在我初始化静态块中的函数之前,它一直在工作,那么我应该怎么做才能初始化静态块中的函数?

4

3 回答 3

2

我会简单地利用@PostConstruct(并摆脱该init方法):

@PostConstruct
public void loadAllProvince () {
   ...
}

JSR-250 @PostConstruct 和 @PreDestroy 注释通常被认为是在现代 Spring 应用程序中接收生命周期回调的最佳实践。使用这些注解意味着你的 bean 没有耦合到 Spring 特定的接口。有关详细信息,请参阅第 5.9.6 节,“@PostConstruct 和 @PreDestroy”。

如果您不想使用 JSR-250 注释,但仍希望消除耦合,请考虑使用 init-method 和 destroy-method 对象定义元数据。

http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/beans.html

问题是在 Spring 有机会完成 bean 初始化之前调用了静态块(正如@sodik 指出的那样)。这是@PostConstruct派上用场的时候,因为它告诉 Spring 在 bean 完全初始化后调用此方法。

于 2013-09-18T11:19:43.847 回答
0

我认为您真正想要的是使用 init 方法:

<bean id="regionDAOBean" class="com.dao.RegionDAO" init-method="init">
   <property name="sessionFactory" ref="sessionFactoryBean"/> 
</bean>




private HibernateTemplate hibernateTemplate;
public void setSessionFactory(SessionFactory sessionFactory) {
    hibernateTemplate = new HibernateTemplate(sessionFactory);
}

public void init() throws Exception {
    loadAllProvince();
}

public void loadAllProvince ()  {
    List regionList = hibernateTemplate.find("FROM regions");

    if (regionList.size() > 0 ) {           
       for (int i=0; i<regionList.size(); i++) {                
          Object[] obj = (Object[]) regionList.get(i) ;
          mapRegion.put(obj[1].toString(), obj[0].toString());                  
       }                        
    }   
 }
于 2013-09-18T11:12:45.340 回答
0

loadAllProvince()问题是由于在注入 sessionFactory 之前执行了静态方法(如 jax 建议的那样) 。但是我宁愿制作loadAllProvince()非静态并在填充bean属性后调用它,例如

<bean id="regionDAOBean" class="com.dao.RegionDAO" init-method="loadAllProvince">
   <property name="sessionFactory" ref="sessionFactoryBean"/> 
</bean>

有关更多详细信息,请参见http://www.mkyong.com/spring/spring-init-method-and-destroy-method-example/

于 2013-09-18T11:11:12.147 回答