我有一个Hibernate Search ClassBridge
,我希望使用@Inject
注入一个Spring 4.1托管的DAO / Service类。我已使用ClassBridge
对@Configurable
进行了注释。我注意到Spring 4.2添加了一些额外的生命周期方法,可以解决这个问题,但是我在Spring 4.1
这样做的目的是根据查询结果将自定义字段存储到索引文档中。
但是,由于DAO取决于SessionFactory
被初始化,因此它不会被注入,因为它在处理@Configurable
bean时尚不存在。
有关如何实现这一目标的任何建议吗?
答案 0 :(得分:0)
您可能尝试创建自定义field bridge provider,它可以通过一些静态方法获取Spring应用程序上下文。当调用provideFieldBridge()
时,您可以从应用程序上下文返回一个Spring-ified实例,假设时间更好并且到那时DAO bean可用。
不确定它是否会飞,但可能值得尝试。
答案 1 :(得分:0)
Hibernate Search 5.8.0包括对bean注入的支持。您可以看到问题https://hibernate.atlassian.net/browse/HSEARCH-1316。
但是我无法在我的应用程序中使用它并且我已经实现了一种解决方法。
我已经创建了一个应用程序上下文提供程序来获取Spring应用程序上下文。
public class ApplicationContextProvider implements ApplicationContextAware {
private static ApplicationContext context;
public static ApplicationContext getApplicationContext() {
return context;
}
@Override
public void setApplicationContext(ApplicationContext context) throws BeansException {
ApplicationContextProvider.context = context;
}
}
我已将其添加到配置类中。
@Configuration
public class RootConfig {
@Bean
public ApplicationContextProvider applicationContextProvider() {
return new ApplicationContextProvider();
}
}
最后我在桥上用它来检索弹簧豆。
public class AttachmentTikaBridge extends TikaBridge {
@Override
public void set(String name, Object value, Document document, LuceneOptions luceneOptions) {
// get service bean from the application context provider (to be replaced when HS bridges support beans injection)
ApplicationContext applicationContext = ApplicationContextProvider.getApplicationContext();
ExampleService exampleService = applicationContext.getBean(ExampleService .class);
// use exampleService ...
super.set(name, content, document, luceneOptions);
}
}
我认为这种解决方法与其他解决方案相比非常简单,除了在运行时进行bean注入外,它没有任何大的副作用。