Если вы использовали SessionFactory, это была бы конфигурация:
<bean id="mySessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- Stripped other stuff -->
<property name="eventListeners">
<map>
<entry key="pre-load">
<bean class="com.mycompany.MyCustomHibernateEventListener1" />
</entry>
<entry key="pre-persist">
<bean class="com.mycompany.MyCustomHibernateEventListener2" />
</entry>
</map>
</property>
</bean>
Но так как вы используете JPA, я боюсь, что вам нужно использовать AOP, как указано в этой теме
Или вы можете
- сохранить ApplicationContext в ThreadLocal или пользовательском классе-держателе и предоставить его через статический метод
- иметь базовый класс для ваших слушателейкак это:
Базовый класс:
public abstract class ListenerBase{
protected void wireMe(){
ApplicationContext ctx = ContextHelper.getCurrentApplicationContext();
ctx.getAutowireCapableBeanFactory().autowireBean(this);
}
}
Теперь в вашем методе lifycycle сначала вызовите wireMe()
.
Обновление:
Вот пример реализации ContextHelper
:
public final class ContextHelper implements ApplicationContextAware{
private static final ContextHelper INSTANCE = new ContextHelper();
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(final ApplicationContext applicationContext){
this.applicationContext = applicationContext;
}
public static ApplicationContext getCurrentApplicationContext(){
return INSTANCE.applicationContext;
};
public static ContextHelper getInstance(){
return INSTANCE;
}
private ContextHelper(){
}
}
Подключите его в конфигурации Spring Bean следующим образом:
<bean class="com.mycompany.ContextHelper" factory-method="getInstance" />