Maison  >  Article  >  Java  >  Point d'extension du conteneur Spring : post-processeur Bean

Point d'extension du conteneur Spring : post-processeur Bean

php是最好的语言
php是最好的语言original
2018-08-10 15:07:112470parcourir

BeanPostProcessor (post-processeur Bean) est souvent utilisé pour modifier les valeurs internes des beans ; implémenter un proxy dynamique des beans, etc.

BeanFactoryPostProcessor et BeanPostProcessor sont tous deux des points d'extension exposés lorsque Spring initialise les beans. Mais quelle est la différence ?
Comme le montre l'image dans « Comprendre le cycle de vie d'un bean » : BeanFactoryPostProcessor est le premier appelé dans le cycle de vie, bien avant BeanPostProcessor. Il est exécuté après que le conteneur Spring ait chargé le fichier de définition du bean et avant l'instanciation du bean. En d'autres termes, Spring permet à BeanFactoryPostProcessor de lire et de modifier les métadonnées de configuration du bean avant que le conteneur ne crée le bean. Par exemple, ajoutez les propriétés et les valeurs du bean, réinitialisez si le bean est candidat au câblage automatique, réinitialisez les dépendances du bean, etc.

Plusieurs BeanFactoryPostProcessors peuvent être configurés dans le fichier de configuration srping en même temps, et l'ordre d'exécution de chaque BeanFactoryPostProcessor peut être contrôlé en définissant l'attribut 'order' lors de l'enregistrement en XML. L'interface

BeanFactoryPostProcessor est définie comme suit :

public interface BeanFactoryPostProcessor {
    void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}

L'interface n'a qu'une seule méthode postProcessBeanFactory. Le paramètre de cette méthode est de type ConfigurableListableBeanFactory. Dans le développement réel, nous utilisons souvent sa méthode getBeanDefinition() pour obtenir la définition des métadonnées d'un certain bean : BeanDefinition. Il a ces méthodes :
Point dextension du conteneur Spring : post-processeur Bean

Regardez un exemple :
Un bean est défini dans le fichier de configuration :

<bean id="messi" class="twm.spring.LifecycleTest.footballPlayer">
    <property name="name" value="Messi"></property>
    <property name="team" value="Barcelona"></property>
</bean>

Créez la classe beanFactoryPostProcessorImpl et implémentez le interface BeanFactoryPostProcessor :

public class beanFactoryPostProcessorImpl implements BeanFactoryPostProcessor{

    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        System.out.println("beanFactoryPostProcessorImpl");
        BeanDefinition bdefine=beanFactory.getBeanDefinition("messi");
        System.out.println(bdefine.getPropertyValues().toString());
        MutablePropertyValues pv =  bdefine.getPropertyValues();  
            if (pv.contains("team")) {
                PropertyValue ppv= pv.getPropertyValue("name");
                TypedStringValue obj=(TypedStringValue)ppv.getValue();
                if(obj.getValue().equals("Messi")){
                    pv.addPropertyValue("team", "阿根延");  
                }
        }  
            bdefine.setScope(BeanDefinition.SCOPE_PROTOTYPE);
    }
}

Classe appelante :

public static void main(String[] args) throws Exception {
    ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
    footballPlayer obj = ctx.getBean("messi",footballPlayer.class);
    System.out.println(obj.getTeam());
}

Sortie :

PropertyValues : length=2 ; propriété du bean 'nom' ; team'
Agenyan

La classe PropertyPlaceholderConfigurer mentionnée dans « PropertyPlaceholderConfigurer Application » est une implémentation de l'interface BeanFactoryPostProcessor. Il remplacera les espaces réservés dans la définition de classe (tels que ${jdbc.url}) par le contenu correspondant du fichier de propriétés avant que le conteneur ne crée le bean.

Recommandations associées :

Introduction aux méthodes de l'interface d'extension Spring Bean

Interface ResourceLoaderAware - [Spring Chinese Manual]

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn