我有一个带有通用应用程序上下文xml文件的Spring MVC项目。此文件定义了我的applciation的通用配置,例如i18n的基本属性文件和连接数据库的数据源等。虽然我定义了这个上下文文件,但我还想定义会话工厂,它将具有基本配置,例如要使用的数据源,第二级缓存(eh-cache)等。但是这不会包含我的应用程序将加载的实体bean列表。我想将实体bean的映射仅保存在单独的文件中,并根据需要加载它们。
是否有可能扩展我在基本文件中定义的会话工厂并仅添加其他实体bean?我最终将有几个spring配置文件,它们将加载一组单独的实体。这可以实现吗?
答案 0 :(得分:1)
有几个可能性。
您可以使用PropertyPlaceHolderConfigurer
将实体列表外部化为属性文件。 (您可以在属性文件中使用SPEL)。
您可以使用抽象bean定义并将其用作其他sessionFactory bean中的父级,然后您可以根据Enviroment
PropertySource
导入这些内容。
请注意,Hibernate SessionFactory
在构建它之后是不可变的,SessionFactoryBean
在SessionFactory
方法中构建afterPropertiesSet
所以设置SessionFactoryBean
所需的工作必须由某些BeanFactoryPostProcessor
修改强>
在阅读您的评论后,我认为您可以声明一个EntityClassHolder
bean并使用Autowire集合工具来获取EntityClassFactoryBean
中您可以在一个SessionFactoryBean
中注入的所有实体。但我不确定你是否愿意这样做:
public class EntityClassHolder {
List<Class<?>> entityClasses;
public List<Class<?>> getEntityClasses() {
return entityClasses;
}
public void setEntityClasses(List<Class<?>> entityClasses) {
this.entityClasses = entityClasses;
}
}
public class EntityClassFactoryBean extends AbstractFactoryBean<List<Class<?>>> {
@Autowired
List<EntityClassHolder> list;
@Override
public Class<?> getObjectType() {
return List.class;
}
@Override
protected List<Class<?>> createInstance() throws Exception {
ArrayList<Class<?>> classList = new ArrayList<Class<?>>();
for (EntityClassHolder ech : list) {
classList.addAll(ech.getEntityClasses());
}
return classList;
}
}
现在,如果您有几个applicatonContext-xxx.xml,那么当您加载其中一个时,SessionFactory
将配置为EntityClassHolder
bean中定义的实体类。