Spring Bean扩展

时间:2012-05-18 06:36:24

标签: spring spring-mvc hibernate-mapping

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

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

1 个答案:

答案 0 :(得分:1)

有几个可能性。

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

  • 您可以使用抽象bean定义并将其用作其他sessionFactory bean中的父级,然后您可以根据Enviroment PropertySource导入这些内容。

请注意,Hibernate SessionFactory在构建它之后是不可变的,SessionFactoryBeanSessionFactory方法中构建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中定义的实体类。