本文共 3636 字,大约阅读时间需要 12 分钟。
以下内容引用自:
Bean后置处理器
BeanPostProcessor接口定义回调方法,你可以实现该方法来提供自己的实例化逻辑,依赖解析逻辑等。你也可以在Spring容器通过插入一个或多个BeanPostProcessor的实现来完成实例化,配置和初始化一个bean之后实现一些自定义逻辑回调方法。
你可以配置多个BeanPostProcessor接口,通过设置BeanPostProcessor实现的Ordered接口提供的order属性来控制这些BeanPostProcessor接口的执行顺序。
BeanPostProcessor可以对bean(或对象)实例进行操作,这意味着Spring IoC容器实例化一个bean实例,然后BeanPostProcessor接口进行它们的工作。
ApplicationContext会自动检测由BeanPostProcessor接口的实现定义的bean,注册这些bean为后置处理器,然后通过在容器中创建bean,在适当的时候调用它。
例子:
pom.xml:
4.0.0 com.jsoft.testspring testbeanpostprocessor 0.0.1-SNAPSHOT jar testbeanpostprocessor http://maven.apache.org UTF-8 junit junit 3.8.1 test org.springframework spring-core 4.1.4.RELEASE org.springframework spring-context 4.1.4.RELEASE
HelloWorld.java:
package com.jsoft.testspring.testbeanpostprocessor;public class HelloWorld { private String messageString; public void setMessage(String message){ this.messageString = message; } public void getMessage(){ System.out.println(this.messageString); } public void initCustom(){ System.out.println("初始化"); } public void destroyCustom(){ System.out.println("销毁"); } }
InitHelloWorld.java:
package com.jsoft.testspring.testbeanpostprocessor;import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.BeanPostProcessor;public class InitHelloWorld implements BeanPostProcessor { public Object postProcessAfterInitialization(Object arg0, String arg1) throws BeansException { // TODO Auto-generated method stub System.out.println("After HelloWorld"); return arg0; } public Object postProcessBeforeInitialization(Object arg0, String arg1) throws BeansException { // TODO Auto-generated method stub System.out.println("Before HelloWorld"); return arg0; }}
这是实现BeanPostProcessor非常简单的例子,它在任何bean的初始化的之前和之后输入该bean的名称。你可以在初始化bean的之前和之后实现更复杂的逻辑,因为你有两个访问内置bean对象的后置处理程序的方法。
beans.xml:
App.java:
package com.jsoft.testspring.testbeanpostprocessor;import org.springframework.context.support.AbstractApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;/** * Hello world! * */public class App { public static void main( String[] args ) { AbstractApplicationContext abstractApplicationContext = new ClassPathXmlApplicationContext("beans.xml"); HelloWorld helloWorld = (HelloWorld)abstractApplicationContext.getBean("helloWorld"); helloWorld.getMessage(); abstractApplicationContext.registerShutdownHook(); }}
在这里,你需要注册一个在AbstractApplicationContext类中声明的关闭hook的registerShutdownHook()方法。它将确保正常关闭,并且调用相关的destroy方法。
测试结果:
总结:
InitHelloWorld类集成自BeanPostProcessor,然后在bean中指定class为InitHelloWorld即可,这里分开写主要是为了展示两个方法的效果,当然这个类的两个方法可以直接写在HelloWorld中,直接在HelloWorld类中集成BeanPostProcessor,然后去实现两个方法。
测试工程:
==>如有问题,请联系我:easonjim#163.com,或者下方发表评论。<==转载地址:http://dcvfm.baihongyu.com/