【问题标题】:Spring autowiring with bean scope of prototypeSpring自动装配与原型的bean范围
【发布时间】:2013-01-29 21:18:08
【问题描述】:

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

@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..

如果有人能回答我的问题,我将不胜感激。

谢谢, 斯瓦提

【问题讨论】:

    标签: spring


    【解决方案1】:

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

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

    【讨论】:

    • 我不能使用@PersistenceContet 作为我们创建实体管理器的方式不同。这是我们公司遵循的规则...... Dbonfigloader 是我们加载实体管理器和将其自动连接到 dao 层....DAO lyer 对象在 bizz 层中自动连接...因此创建了 dao 的单格顿对象..我只想要一个应该有多个实体管理器的 dao 对象...
    • 所以基本上我在 dao (即 singelton )上调用了多少次方法,必须创建实体管理器很多次......这是我的目标......
    • 如果你只是“有点”遵守规则,那么我建议现在是打破它的时候了。这正是@PersistenceContext 存在的要解决的问题,而且它做得非常好,而且工作量很小。否则,据我所知,管理 EntityManager 生命周期完全取决于您。这样做的困难方法是使用 EntityManager 工厂注入您的 DAO,然后为每个方法调用打开/关闭 EntityManager。如果您正在使用它,我不知道这将如何与 Spring 的事务管理一起使用。
    【解决方案2】:
    @Inject // or @Autowire
    Provider<EntityManager> entityManagerProvider;
    

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

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

    【讨论】:

      猜你喜欢
      • 2013-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-06
      • 2014-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多