Spring自动装配原型的bean范围

时间:2013-02-14 05:53:27

标签: spring

我在春天有一个问题,带有一个带有原型范围的bean的autowire。 所以基本上我正在编写一个JPA的代码。所以我在我的DAO层自动装配我的实体管理器。我正在使用@configuraion Annotation从类中加载entitymanager。

@Configuration
public class DALConfigurationLoader {


    @Bean
    @Scope("prototype")
    public EntityManager getEntityManager() {
}

当我这样做时,我希望每次请求都能得到一个新的bean。

@Component
public class OfferPriceDomainDAOImpl  {



    @Autowired
    private EntityManager entityManager;
        public OfferPrice getOfferPrice(String offer_Price_Id) throws DataAccessException{
           //use entitymanager here 
        }

   }

在这种情况下,它是所有请求的单个实体管理器,这是错误的。我希望每个方法都应该获得一个新的实体管理器。根据jpa规范,每个新请求都应该处理一个新的实体管理器...我可以使用原型范围自动装配一个bean ..

如果有人能回答我的问题,我真的很感激。

感谢, 斯瓦特

2 个答案:

答案 0 :(得分:2)

使用@PersistenceContext注入EntityManager,而不是@Autowired,如JPA section of the Spring reference guide中所述。它会妥善处理您的生命周期。

至于为什么它没有像你想象的那样工作:无论何时创建DAO实例,都会注入EntityManager。由于EntityManager是scope = prototype,因此将为每个需要为一个DAO注入的DAO创建一个新的。但是,由于您的DAO是单例,因此只创建其中一个,因此只需要一个EntityManager。

答案 1 :(得分:0)

@Inject // or @Autowire
Provider<EntityManager> entityManagerProvider;

然后使用entityManagerProvider.get()获取EntityManager实例。

我使用javax.inject.Inject代替Autowire,因为Provider也在那里定义。这也适用于Guice。