2012-05-18 2 views
0

J'ai un projet Spring MVC avec un fichier xml de contexte d'application générique. Ce fichier définit la configuration générique de mon application, par exemple le fichier de propriétés de base pour i18n et la source de données pour se connecter à la base de données, etc. Pendant que je définis ce fichier de contexte, je veux aussi définir la fabrique de session qui aura des configurations de base telles que la source de données à utiliser, la mise en cache de second niveau (eh-cache) et ainsi de suite. Mais cela ne contiendra pas la liste des beans entité que mon application chargera. Je veux garder le mappage des beans entité seulement dans un fichier séparé et les charger en fonction des besoins.Spring Bean Extensions

Existe-t-il une possibilité d'étendre la fabrique de session que j'avais définie dans le fichier de base et d'ajouter uniquement les beans entité supplémentaires? Je finirai par avoir plusieurs fichiers de configuration de printemps qui chargeront un ensemble séparé d'entités. cela peut-il être réalisé?

Répondre

1

Il existe plusieurs possibilités.

  • Vous pouvez utiliser PropertyPlaceHolderConfigurer pour extérioriser la liste des entités à un fichier de propriétés. (Vous pouvez utiliser SPEL dans le fichier de propriétés).

  • Vous pouvez utiliser une définition de bean abstraite et l'utiliser comme parent dans d'autres beans sessionFactory, puis vous pouvez les importer en fonction d'un EnviromentPropertySource.

Notez que Hibernate SessionFactory est inmutable après la construction et SessionFactoryBean construction SessionFactory dans afterPropertiesSet méthode de sorte que le travail de mise en place du SessionFactoryBean que vous voulez doit être fait par certains BeanFactoryPostProcessor

EDIT

Après avoir lu votre commentaire, je pense que vous pourriez déclarer un bean EntityClassHolder et utiliser la facilité de collections Autowire pour obtenir toutes les entités dans un EntityClassFactoryBean tha t vous pouvez injecter en un seul SessionFactoryBean. Mais je ne sais pas si c'est que vous voulez faire:

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; 
    } 
} 

Maintenant, si vous avez plusieurs applicatonContext-xxx.xml par exemple, le SessionFactory sera configuré avec les classes d'entités DÉFINIES dans EntityClassHolder haricots lorsque vous charger l'un d'entre eux.

+0

Merci Jose pour les intrants. J'ai été en mesure d'atteindre l'extension SessionFactory via le mécanisme d'extension des parents. Cependant, cela crée plusieurs usines de session. Puis-je utiliser la même sessionfactory et comment ajouter les références de bean entité supplémentaires uniquement? Je ne suis pas sûr si plusieurs usines de session causeront des problèmes. –

+0

L'idée était de charger une seule SessionFactory, en choisissant lequel d'entre eux via la configuration. –

+0

Mais jose, j'ai plusieurs modules indépendants qui doivent être chargés dynamiquement. Les modules à charger lui-même sont une configuration d'exécution. Je devrais réduire le nombre total d'usines de session créées afin que la performance globale du système ne descende pas. Aussi, est-il possible de me relier à quelques exemples sur la façon d'atteindre la propriété PropertySource en référence aux inclusions Hibernate Bean? Je n'ai pas pu trouver –