小编EMM*_*ICH的帖子

使用Hibernate 4的Integrator模式和Spring的依赖注入

我习惯使用Spring来执行依赖注入,如下所示:

<context:component-scan base-package="org.emmerich.myapp" />
Run Code Online (Sandbox Code Playgroud)

然后用Autowired这样注释我的依赖类:

public class DependentClass {

    @Autowired
    private Dependency dependency;

}
Run Code Online (Sandbox Code Playgroud)

但是,随着Hibernate 4.0的变化,我们现在建议使用新Integrator接口进行服务发现.这包括添加事件侦听器触发器如postUpdate,postDelete

不幸的是,这与通过注释依赖项的依赖注入不能很好地协作.我有以下设置:

我已经定义了一个集成器来添加我的监听器ServiceFactory.这在文件中引用META-INF/services/org.hibernate.integrator.spi.Integrator.

public class MyIntegrator implements Integrator {

    private MyListener listener;

    public MyIntegrator() {
        listener = new MyListener();
    }

    @Override
    public void integrate(Configuration configuration,
                          SessionFactoryImplementor sessionFactory,
                          SessionFactoryServiceRegistry serviceRegistry) {
    final EventListenerRegistry eventRegistry =
        serviceRegistry.getService(EventListenerRegistry.class);

    eventRegistry.prependListeners(EventType.POST_COMMIT_INSERT, listener);

}
Run Code Online (Sandbox Code Playgroud)

我也定义了类MyListener,它看起来像你典型的事件监听器.

@Component
public class MyListener implements PostInsertEventListener {

    @Autowired
    private Dependent dependent;

    public …
Run Code Online (Sandbox Code Playgroud)

java spring hibernate spring-mvc inversion-of-control

8
推荐指数
1
解决办法
1万
查看次数

Java的ServiceLoader和测试资源

我有一个Web应用程序,它将Hibernate Integrator定义为Java ServiceLoader规范的一部分,如下所示:

SRC /主/资源/ META-INF /服务/ org.hibernate.integrator.spi.Integrator

  # Define integrators that should be instantiated by the ServiceLoader
  org.emmerich.MyIntegrator
Run Code Online (Sandbox Code Playgroud)

这是根据Hibernate的指导做这里.

我的问题是,当我尝试执行单元测试时,主Integrator描述符仍然被解析和实例化.这意味着,因为我在单元测试中嘲笑应用程序的很大一部分,当集成器试图运行时遇到错误导致我的测试失败.

我在测试资源中定义了相同的文件:

SRC /测试/资源/ META-INF /服务/ org.hibernate.integrator.spi.Integrator

  # Empty file to try and overwrite the main deployment description.
Run Code Online (Sandbox Code Playgroud)

但相反,我发现解析了测试和主要集成商文件.

我预计测试资源会覆盖主资源,从而使主要资源成为可能,但事实并非如此.由于这两个文件是在类路径中(我基于Maven与神火-插件,它可以让这运行测试test-classes,并classes在classpath).类似的事情发生在persistence.xml.

在我的单元测试环境中,我不希望实例化任何Integrator,因为我想尽可能手动控制这些bean的构造.假设我正在测试执行单元,我不希望其他bean(例如积分器)可能会影响测试的运行.我认为这是单元测试期间完全合理的要求.但是,虽然主要资源仍由解析ServiceLoader,但这是不可能的.

我要做的persistence.xml解决方案是基于此处发布的解决方案:

如何配置JPA以在Maven中进行测试

我的问题是,在单元测试中是否有更好的方法可以排除主要资源的处理,而不是强制重命名,尤其是在ServiceLoader文件的上下文中?

试着总结一下:

当两个文件都以类路径上的相同服务接口命名时会发生什么?对我来说,似乎两个文件中的所有服务都是实例化的.看起来没有覆盖.

java service hibernate jpa serviceloader

5
推荐指数
1
解决办法
2051
查看次数