الربيع + entityManagerFactory + مستمعين السبات + الحقن
-
30-09-2019 - |
سؤال
لدي سؤال بسيط. من الممكن إضافة حقن التبعية عبر @ @ @autowired إلى Hibernate EventListener؟
سأريكم تكوين entityManagerFactory الخاص بي:
<bean id="entityManagerFactory" class="org.hibernate.ejb.EntityManagerFactoryImpl">
<qualifier value="entityManagerFactory" />
<constructor-arg>
<bean
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitManager">
<bean
class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManagerr">
<property name="defaultDataSource" ref="dataSource" />
</bean>
</property>
<property name="dataSource" ref="dataSource" />
<property name="persistenceUnitName" value="mis" />
<property name="persistenceProviderClass" value="org.hibernate.ejb.HibernatePersistence" />
<property name="jpaProperties" ref="jpa.properties" />
<property name="jpaDialect" ref="jpaDialect" />
<property name="jpaVendorAdapter">
<bean
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="generateDdl" value="true" />
<property name="database">
<util:constant
static-field="org.springframework.orm.jpa.vendor.Database.POSTGRESQL" />
</property>
<property name="showSql" value="true" />
</bean>
</property>
</bean>
</constructor-arg>
</bean>
في الوقت الحالي ، أقوم بتسجيل مستمعي عبر jpa.properties ،
hibernate.ejb.event.load=com.example.hibernate.events.LoadEvent
لكن في هذه الحالة ، ليس لدي حقن في الربيع في مستمعي. لقد وجدت حلاً ، لكن هذا يستخدم SessionFactory وليس ContityManager Oder هل يمكنني تعديل SessionFactory في سياقتي؟ نأمل أن يكون لدى شخص ما فكرة لطيفة أو حل للتعامل مع هذه المشكلة!
شكرا جزيلا!
المحلول
إذا استخدمت 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(){
}
}
قم بتوصيله بتكوين حبوب الربيع مثل هذا:
<bean class="com.mycompany.ContextHelper" factory-method="getInstance" />
لا تنتمي إلى StackOverflow