繁体   English   中英

在JPA实体监听器中注入spring bean

[英]Injecting spring bean in a JPA Entity Listener

我试图让JPA Entity Listener通过将其标记为@Configurable来了解spring上下文。 但是注入的spring bean是null。 能够使用相同的技术使JPA实体了解Spring上下文。 我使用Spring(core和data-jpa)作为基础设施。 有关如何使用JPA Entity Listeners或spring data-jpa实现此目的的任何想法?

@Configurable
@Scope("singleton")
public class AggregateRootListener {
    private static Logger log = LoggerFactory.getLogger(AggregateRootListener.class);

    @Autowired
    private EventHandlerHelper eventHandlerHelper;

    @PostPersist
    @PostUpdate
    public void publishEvents(BaseAggregateRoot aggregateRoot){
        log.info(aggregateRoot.getEvents().toString());
        aggregateRoot.getEvents().stream()
            .forEach(event -> {
                eventHandlerHelper.notify(event, aggregateRoot);
                log.info("Publishing " + event + " " + aggregateRoot.toString());
            });
    }
}

和BaseAggregateRoot代码

@Configurable
@Scope("prototype")
@MappedSuperclass
@EntityListeners(AggregateRootListener.class)
public abstract class  BaseAggregateRoot extends BaseDomain{
    public static enum AggregateStatus {
        ACTIVE, ARCHIVE
    }

    @EmbeddedId
    @AttributeOverrides({
          @AttributeOverride(name = "aggregateId", column = @Column(name = "ID", nullable = false))})
    protected AggregateId aggregateId;



    @Version
    private Long version;
}

事件监听器机制是JPA概念,由JPA提供程序实现。 我不认为Spring会创建事件监听器类实例 - 它们是由JPA提供程序(Hibernate,EclipseLink等)创建的。 因此,常规Spring注入不适用于事件侦听器类实例。 这篇文章的作者似乎得出了同样的结论。


也就是说,我在JPA事件监听器中使用Spring托管bean。 我使用的解决方案是为了在所有不由Spring管理的类中获取Spring bean实例而开发的。 它涉及创建以下类:

@Component
public class SpringApplicationContext implements ApplicationContextAware {
  private static ApplicationContext CONTEXT;

  public void setApplicationContext(final ApplicationContext context)
              throws BeansException {
    CONTEXT = context;
  }

  public static <T> T getBean(Class<T> clazz) { return CONTEXT.getBean(clazz); }
}

此类在初始加载时缓存Spring应用程序上下文。 然后使用上下文查找Spring托管bean。

然后使用该类就像SpringApplicationContext.getBean(FooService.class)一样简单。

所有常见的Spring语义,例如bean生命周期,bean范围和传递依赖关系都得到了解决。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM