【发布时间】:2010-01-21 00:14:10
【问题描述】:
我有一个使用 spring 项目的现有 Java 域类的 grails 项目,我需要配置 typeDefinitions。在 spring 项目中,可以配置 LocalSessionFactoryBean 的这个属性 - 但是在 grails 项目中如何做到这一点?
【问题讨论】:
我有一个使用 spring 项目的现有 Java 域类的 grails 项目,我需要配置 typeDefinitions。在 spring 项目中,可以配置 LocalSessionFactoryBean 的这个属性 - 但是在 grails 项目中如何做到这一点?
【问题讨论】:
LocalSessionFactoryBean 的 Grails 版本是一个子类 org.codehaus.groovy.grails.orm.hibernate.ConfigurableLocalSessionFactoryBean。它在 org.codehaus.groovy.grails.plugins.orm.hibernate.HibernatePluginSupport 中注册为 Spring bean
sessionFactory(ConfigurableLocalSessionFactoryBean) {
...
}
所以你有几个选择。一种是在 resources.groovy 中重新定义 bean,维护 Grails 配置的内容以及您的更改,即
sessionFactory(MyCustomConfigurableLocalSessionFactoryBean) {
...
typeDefinitions = ...
}
或者如果可能的话,您可以引用 bean 并在 BootStrap 中对其进行修改:
class BootStrap {
def sessionFactory
def init = { servletContext ->
sessionFactory.foo = bar
}
def destroy = {}
}
看起来 typeDefinitions 需要尽早配置,而工厂 bean 正在构建 SessionFactory,所以选项 1 可能是您最好的选择。
【讨论】:
另一种选择是使用 spring 的生命周期回调,例如实现一个 BeanPostProcessor
public class CustomBeanPostProcessor implements BeanPostProcessor {
// simply return the instantiated bean as-is
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean; // we could potentially return any object reference here...
}
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if ("sessionFactory".equals(beanName) && bean instanceof ConfigurableLocalSessionFactoryBean) {
ConfigurableLocalSessionFactoryBean sessionFactory = (ConfigurableLocalSessionFactoryBean) bean;
sessionFactory.setTypeDefinitions(...);
}
return bean;
}
}
并把它扔到你的 resources.groovy
customProcessor(CustomBeanPostProcessor)
这样您就不必重新定义已经连接到 GORM 动态查找器等的 sessionFactory bean。
【讨论】: