Spring后置处理器
【摘要】 Spring后置处理器(BeanPostProcessor)后置处理器的作用Spring Bean生命周期中会调用BeanPostProcessor接口,即为后置处理器,通过改接口可以自定义调用初始化前后执行的操作方法。接口中包含两个方法:postProcessBeforeInitialization() :在 Bean 实例化、属性注入后,初始化前调用。postProcessAfterIn...
Spring后置处理器(BeanPostProcessor)
后置处理器的作用
-
Spring Bean生命周期中会调用BeanPostProcessor接口,即为后置处理器,通过改接口可以自定义调用初始化前后执行的操作方法。
-
接口中包含两个方法:
-
postProcessBeforeInitialization() :在 Bean 实例化、属性注入后,初始化前调用。
-
注意:postProcessBeforeInitialization 和 postProcessAfterInitialization 方法返回值不能为 null,否则会报空指针异常或者通过 getBean() 方法获取不到 Bean 实例对象。
-
-
多个后置处理器的调用顺序: 添加多个后置处理器实现类时,默认情况下 Spring 容器会根据后置处理器的定义顺序来依次调用。也可以通过实现 Ordered 接口的 getOrder 方法指定后置处理器的执行顺序。该方法返回值为整数,默认值为 0,取值越大优先级越低。
代码示例
-
Java类
package org.example; public class HelloWorld { private String message; public void init(){ System.out.println("Bean正在初始化"); } public void destroy(){ System.out.println("Bean将要被销毁"); } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
-
后置处理器类1
package org.example; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.core.Ordered; public class InitHelloWorld implements BeanPostProcessor, Ordered { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("A Before:"+beanName); return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("A After:"+beanName); return bean; } @Override public int getOrder() { return 5; } }
-
后置处理器类2
package org.example; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.core.Ordered; public class InitHelloWorld2 implements BeanPostProcessor, Ordered { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("B Before : " + beanName); return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("B After : " + beanName); return bean; } @Override public int getOrder() { return 0; } }
-
XML配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="hello" class="org.example.HelloWorld" init-method="init" destroy-method="destroy"> <property name="message" value="Hello World"/> </bean> <!--注册处理器--> <bean class="org.example.InitHelloWorld"/> <bean class="org.example.InitHelloWorld2"/> </beans>
-
Main方法
package org.example; import org.springframework.context.support.AbstractApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class App { public static void main( String[] args ) { //创建bean工厂 使用ApplicationContext的子类AbstractApplicationContext AbstractApplicationContext context=new ClassPathXmlApplicationContext("Beans.xml"); HelloWorld obj=(HelloWorld)context.getBean("hello"); System.out.println(obj.getMessage()); //在非web应用中关闭IoC容器 context.registerShutdownHook(); } }
-
运行结果
B Before : hello A Before:hello Bean正在初始化 B After : hello A After:hello Hello World 17:20:01.919 [SpringContextShutdownHook] DEBUG org.springframework.context.support.ClassPathXmlApplicationContext - Closing org.springframework.context.support.ClassPathXmlApplicationContext@4cf4d528, started on Wed Mar 30 17:20:01 CST 2022 Bean将要被销毁
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)