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 :
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!