Springbean扩展
我有一个SpringMVC项目,其中包含一个通用的应用程序上下文xml文件。该文件定义了我的应用程序的一般配置,例如i18n的基本属性文件和连接到数据库的数据源等。在定义这个上下文文件的同时,我还想定义会话工厂,它将具有基本配置,例如要使用的数据源、二级缓存(eh-cache)等等。但这不会包含我的应用程序将加载的实体bean列表。我只想将实体bean的映射保存在单独的文件中,并根据需要加载它们Springbean扩展,spring,spring-mvc,hibernate-mapping,Spring,Spring Mvc,Hibernate Mapping,我有一个SpringMVC项目,其中包含一个通用的应用程序上下文xml文件。该文件定义了我的应用程序的一般配置,例如i18n的基本属性文件和连接到数据库的数据源等。在定义这个上下文文件的同时,我还想定义会话工厂,它将具有基本配置,例如要使用的数据源、二级缓存(eh-cache)等等。但这不会包含我的应用程序将加载的实体bean列表。我只想将实体bean的映射保存在单独的文件中,并根据需要加载它们 是否有可能扩展我在基本文件中定义的会话工厂,只添加额外的实体bean?我最终将有几个spring配置
是否有可能扩展我在基本文件中定义的会话工厂,只添加额外的实体bean?我最终将有几个spring配置文件,这些文件将加载一组单独的实体。这能实现吗?有几种可能性
- 可以使用
将实体列表外部化为属性文件。(可以在属性文件中使用SPEL)PropertyPlaceHolderConfigure
- 您可以使用抽象bean定义并将其用作其他sessionFactory bean中的父项,然后可以基于
环境导入它们
SessionFactory
在构建之后是不可变的,而SessionFactoryBean
buildSessionFactory
在afterPropertiesSet
方法中是不可变的,因此必须由一些BeanFactoryPostProcessor
编辑
在阅读了您的评论之后,我认为您可以声明一个EntityClassHolder
bean,并使用Autowire collections工具获取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;
}
}
公共类EntityClassHolder{
列表>GetEntityClass(){
返回实体类;
}
公共void setEntityClass(列表)感谢Jose提供的输入。我能够通过父bean扩展机制实现SessionFactory扩展。但是,这会创建多个会话工厂。我可以使用同一个SessionFactory以及如何仅添加其他实体bean引用吗?我不确定多个会话工厂是否会导致问题。我的想法是ad是一个单一的会话工厂,通过配置来选择它们中的哪一个。但是jose,我有几个独立的模块需要动态加载。要加载的模块本身是一个运行时配置。我需要减少创建的会话工厂的总数,这样系统的整体性能就不会下降o、 有没有可能将我链接到一些关于如何参考Hibernate Bean包含实现PropertySource的示例?我找不到任何示例