A primavera fornece muitos pós -processadores para os desenvolvedores se expandirem, como o BeanPostProcessor, o BeanFactoryPostProcessor, o beanValidationPostorProcessor e outros pós -processadores. A maioria de seus métodos de uso é semelhante. Entenda um deles e domine seus métodos de uso, e os outros podem ser entendidos por analogia.
Aqui usamos o BEANPOSTProcessor como um exemplo para mostrar como ele é usado.
A interface BeanPostProcessor fornece dois métodos para os desenvolvedores personalizarem: pós -processamentoForeInitialização e pós -processáteronitialização.
pós -processamentoForeinitialização: Este método é principalmente para a primavera para personalizar o processo antes de chamar o método de inicialização quando o feijão é inicializado.
pós -processadosfterinitialização: esse método é principalmente para a primavera para personalizar o processo após chamar o método de inicialização quando a inicialização do feijão.
Código de exemplo:
/** * Test Bean */public class Cat {private String Name; private Int Age; public void Say () {System.out.println ("nome:" + nome); System.out.println ("idade:" + idade); } public string getName () {return name; } public void setName (nome da string) {this.name = name; } public int getage () {Age de retorno; } public void setage (int Age) {this.age = Age; }} /*** Postprocessador personalizado*/public class CatBeanPostProcessor implementa beanpostProcessor {@Nullable @Override public Object PostprocessBeLeinitialization (objeto Bean, string beanname) lança o Beansexception {if (beanof cat) {//tibert attret Cat = Cat = (Cat); Cat.Say (); Retornar Bean; } retornar Bean; } @Nullable @Override Public Object PostprocessaFterinitialization (objeto Bean, String beanname) lança Beansexception {if (bean instância do gato) {// modifica o valor do atributo e retorne o gato gato = (gato) bean; cat.setName ("Hello maomi"); Cat.setage (3); gato de retorno; } retornar Bean; }} /** * RUN */public class Run {public static void main (string [] args) {ApplicationContext ApplicationContext = new ClassPathXMLApplicationContext ("spring-bean.xml"); Gato gato = (gato) applicationContext.getBean ("gato"); Cat.Say (); }}Informações de configuração XML
<!-Configurar Bean e Inicialize-> <Bean id = "CAT"> <propriedade name = "name" value = "hellokitty" /> <propriedade name = "idade" value = "1" /> </i bean> <bean id = "catbeanPostProcessor" />
Resultado da saída:
Nome: Hellokitty
Idade: 1
Nome: Olá Maomi
Idade: 3
Você pode ver que as informações de feijão processadas através do pós -processador mudaram. Por fim, vamos dar uma olhada em como chamar implementações personalizadas no código -fonte.
No método do feijão de inicialização: AbstractAUTOWIRECAPABLEBeanFactory.java
/** * Bean de inicialização */objeto protegido InitializeBean (Final String Beanname, Final Objeto Bean, @Nullable RootBeandEfinition mbd) {// omita parte do objeto de código irrelevante embrulhadoBean = Bean; // Antes da inicialização if (mbd == null ||! Mbd.issynthetic ()) {wrappenBean = ApplyBeanPostProcessorsBeLeInitialization (WAPPEDBEAN, nome de bean); } tente {// chamando o método de inicialização para inicializar o feijão InvokeInitMethods (Beanname, WrappapBean, MBD); } catch (throwable ex) {tiro o novo beaRCreationException ((mbd! = null? mbd.getResourceDescription (): null), beanname, "invocação do método init falhou", ex); } // if (mbd == null ||! Mbd.issynthetic ()) {wrappenBean = AplicaçãoBeanPostProcesSorsAfterinitialization (WAPPEDBEAN, nome de bean); } retornar embrulhado; } // O método PostProcessBeforeInitialization chama @Override Public Object ApplBeanPostProcessorsBeLeInitialization (Object existingBean, String beanname) lança beansexception {resultado do objeto = existingBean; para (BeanPostProcessor BeanProcessor: getBeanPostProcessors ()) {// chamando o objeto de objeto PostProcessBeForeForeSforeInização personalizado = BEANProcessor.PostprocessBeEnitialization (resultado, beanname); if (atual == null) {return resultado; } resultado = atual; } resultado de retorno; } // PostprocessaFterinitialization Call @Override Public Object ApplBeanPostProcesSorsAfterinitialization (Object existingBean, String beanname) lança beansexception {objeto resultado = existingBean; para (BeanPostProcessor BeanProcessor: getBeanPostProcessors ()) {// PostprocessAfterinitialization método personalizado CHAMANCIA OBJETO = BEANPROCESSOR.POSTPROCESSAFTERINITALIZAÇÃO (resultado, beanname); if (atual == null) {return resultado; } resultado = atual; } resultado de retorno; }O exposto acima é o processo de chamada do Spring para implementar métodos personalizados. Espero que seja útil para o aprendizado de todos, e espero que todos apoiem mais o wulin.com.