0

我有一个带有通用应用程序上下文 xml 文件的 Spring MVC 项目。该文件定义了我的应用程序的通用配置,例如 i18n 的基本属性文件和连接到数据库的数据源等。当我定义这个上下文文件时,我还想定义会话工厂,它将具有基本配置,例如要使用的数据源、二级缓存(eh-cache)等等。但这不会包含我的应用程序将加载的实体 bean 的列表。我只想将实体 bean 的映射保留在单独的文件中,并根据需要加载它们。

是否有可能扩展我在基本文件中定义的会话工厂并且只添加额外的实体 bean?我最终会有几个 spring 配置文件,它们将加载一组单独的实体。这可以实现吗?

4

1 回答 1

1

有几种可能性。

  • 您可以使用PropertyPlaceHolderConfigurer将实体列表外部化到属性文件。(您可以在属性文件中使用 SPEL)。

  • 您可以使用抽象 bean 定义并将其用作其他 sessionFactory bean 中的父级,然后您可以基于Enviroment PropertySource.

请注意,HibernateSessionFactory在构建它并SessionFactoryBean内置方法之后是不可变的SessionFactoryafterPropertiesSet因此设置SessionFactoryBean您想要的工作必须由某些人完成BeanFactoryPostProcessor

编辑

阅读您的评论后,我认为您可以声明一个EntityClassHolderbean 并使用 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将使用 bean 中定义的实体类进行配置。EntityClassHolder

于 2012-05-18T12:17:23.763 回答