BeanPostProcessor (Bean-Postprozessor) wird häufig verwendet, um die internen Werte von Beans zu ändern.
BeanFactoryPostProcessor und BeanPostProcessor sind Erweiterungspunkte, die verfügbar gemacht werden, wenn Spring Beans initialisiert. Aber was ist der Unterschied?
Wie aus dem Bild in „Bean-Lebenszyklus verstehen“ ersichtlich ist, wird BeanFactoryPostProcessor am frühesten im Lebenszyklus aufgerufen, viel früher als BeanPostProcessor. Es wird ausgeführt, nachdem der Spring-Container die Bean-Definitionsdatei geladen hat und bevor die Bean instanziiert wird. Mit anderen Worten: Spring ermöglicht es BeanFactoryPostProcessor, Metadaten der Bean-Konfiguration zu lesen und zu ändern, bevor der Container die Bean erstellt. Fügen Sie beispielsweise die Eigenschaften und Werte der Bean hinzu, setzen Sie zurück, ob die Bean ein Kandidat für die automatische Verdrahtung ist, setzen Sie die Abhängigkeiten der Bean zurück usw.
In der Srping-Konfigurationsdatei können mehrere BeanFactoryPostProcessors gleichzeitig konfiguriert werden, und die Ausführungsreihenfolge jedes BeanFactoryPostProcessors kann durch Festlegen des Attributs „order“ bei der Registrierung in XML gesteuert werden. Die
BeanFactoryPostProcessor-Schnittstelle ist wie folgt definiert:
public interface BeanFactoryPostProcessor { void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException; }
Die Schnittstelle hat nur eine Methode postProcessBeanFactory. Der Parameter dieser Methode ist vom Typ ConfigurableListableBeanFactory. In der tatsächlichen Entwicklung verwenden wir häufig die Methode getBeanDefinition(), um die Metadatendefinition einer bestimmten Bean abzurufen: BeanDefinition. Es verfügt über diese Methoden:
Sehen Sie sich ein Beispiel an:
Eine Bean ist in der Konfigurationsdatei definiert:
<bean id="messi" class="twm.spring.LifecycleTest.footballPlayer"> <property name="name" value="Messi"></property> <property name="team" value="Barcelona"></property> </bean>
Erstellen Sie die Klasse beanFactoryPostProcessorImpl und implementieren Sie die Schnittstelle 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); } }
Aufrufende Klasse:
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()); }
Ausgabe:
PropertyValues: length=2; Bean-Eigenschaft 'team'
Agenyan
Die in „PropertyPlaceholderConfigurer-Anwendung“ erwähnte PropertyPlaceholderConfigurer-Klasse ist eine Implementierung der BeanFactoryPostProcessor-Schnittstelle. Es ersetzt die Platzhalter in der Klassendefinition (z. B. ${jdbc.url}) durch den entsprechenden Inhalt der Eigenschaftendatei, bevor der Container die Bean erstellt.
Verwandte Empfehlungen:
Einführung in die Methoden der Spring Bean-Erweiterungsschnittstelle
ResourceLoaderAware-Schnittstelle – [Spring Chinese Manual]
Das obige ist der detaillierte Inhalt vonSpring-Container-Erweiterungspunkt: Bean-Postprozessor. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!