多次调用@Repository中的Spring @PostConstruct函数

时间:2010-04-09 22:59:09

标签: java spring dependency-injection

我有一个DAO,我试图注入几个不同的地方:

@Repository
public class FooDAO
{
    @Autowired
    private HibernateManager sessionFactory;

    @PostConstruct
    public void doSomeDatabaseStuff() throws DataAccessException
    {
        ...
    }
}

我的application-context.xml是一个相当简单的上下文:component-scan:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
     http://www.springframework.org/schema/context
     http://www.springframework.org/schema/context/spring-context-2.5.xsd" default-init-method="init" default-destroy-method="destroy">

     <context:component-scan base-package="top.level"/>
</beans>

通过@Autowired属性从我的应用程序服务器中的几个servlet访问DAO。据我所知,任何使用@Repository注释的内容都应默认为单例,因此doSomeDatabaseStuff()只应调用一次(我的意图)。问题是我看到多次调用doSomeDatabaseStuff()。

这里发生了什么?我错误地设置了什么吗?我正在使用spring 3.0.0。

感谢您的帮助。

更新:我有一些servlet都具有上面显示的相同的xml配置文件。是否会为每个servlet构建一个新的FooDAO实例?如果是这样,我该如何防止这种情况发生?

1 个答案:

答案 0 :(得分:1)

  

我有一些servlet都具有上面显示的相同的xml配置文件

这意味着你指的是多个spring上下文,这反过来意味着创建了多个实例(对于每个上下文)。

您只需要一个弹簧上下文 - 即只有一个xml配置(applicationContext.xml

阅读this tutorial以了解如何设置Spring MVC。