2017-09-27 1 views
1

Mon projet fournit un nombre (un nuuuuumbeeeeer) de classes de base que les développeurs peuvent étendre à leur confort et doivent déclarer en tant que beans Spring en configuration XML.Comment auto-vérifier la portée du haricot de printemps?

Je suis déjà au courant que config d'annotation est héritée de la classe de base, mais nous utilisons principalement XML

@SpringAnnotation 
public abstract class Parent{} 

//Will apply any @SpringAnnotation 
public class Child{} 

Ce que je veux faire est un auto-contrôle dans la classe de base. Si un développeur oublie de définir la portée d'un bean sur la valeur documentée (par exemple, "request", pour l'exemple actuel), j'aimerais que le bean hérité lève une exception rappelant au développeur de changer la portée.

E.g.

public void afterPropertiesSet() 
{ 
    if (!thisBean.getScope().equals("request")) 
     throw new BeansException("Sorry but this bean works only when it is a request bean"); 
} 

J'ai vu que le printemps ne définit aucun type de BeanDefinitionAware qui pourrait injecter propre définition du haricot (ainsi que la portée et beaucoup de choses) dans la fève elle-même.

Une idée? Je peux venir avec une solution self-made bientôt.

Répondre

1

Vous pouvez définir un bean implémentant l'interface BeanFactoryPostProcessor.

Comme indiqué dans le BeanFactoryPostProcessor Spring doc, un bean implémentant BeanFactoryPostProcessor est appelé lorsque toutes les définitions de beans auront été chargées, mais aucun beans n'aura encore été instancié. De cette façon, vous serez capable de lire toutes les définitions de beans et de vérifier si les beans sont correctement configurés.

Voici un exemple:

public class CustomBeanFactory implements BeanFactoryPostProcessor { 

    @Override 
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { 
     for (String beanName : beanFactory.getBeanDefinitionNames()) { 

      BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanName); 

      // Analyze the bean definition 

     } 
    } 
} 

Last but not least, rappelez-vous qu'un BeanFactoryPostProcessor peut interagir avec et modifier les définitions de haricots, mais jamais des cas de haricots. Cela pourrait provoquer une instanciation prématurée des fèves, violer le conteneur et provoquer des effets secondaires involontaires. Si une interaction d'instance de bean est requise, envisagez d'implémenter BeanPostProcessor à la place.

+0

C'est cool. Je pourrais analyser les haricots pour les classes qui étendent ma classe de base. Je pensais aussi à implémenter (via 'BeanPostProcessor') mon propre' BeanDefinitionAware'. En effet, il semble y avoir plusieurs façons –