2012-05-18 62 views
0

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

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

回答

1

有几种可能性。

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

  • 您可以使用抽象bean定义并将其用作其他sessionFactory bean中的父项,然后您可以基于EnviromentPropertySource导入它们。

注意,Hibernate对SessionFactory是建设它,SessionFactoryBean构建SessionFactoryafterPropertiesSet方法,以便设置要必须通过一些BeanFactoryPostProcessor

编辑要做的SessionFactoryBean工作后inmutable

在阅读您的评论之后,我认为您可以声明一个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豆definied实体类进行配置,当你加载其中一个。

+0

感谢何塞的投入。我能够通过父母扩展机制来实现SessionFactory扩展。但是,这会创建多个会话工厂。我可以使用相同的sessionfactory吗?以及如何添加额外的实体bean引用?我不确定多个会话工厂是否会导致问题。 –

+0

这个想法是加载一个SessionFactory,通过配置选择其中的哪一个。 –

+0

但是,我有几个独立的模块,必须动态加载。要加载的模块本身就是一个运行时配置。我需要减少创建的会话工厂总数,以便系统的整体性能不会下降。另外,是否有可能将我链接到一些关于如何通过引用Hibernate Bean包含实现PropertySource的示例?我找不到任何东西 –