Spring后处理器-BeanPostProcessor,InitializingBean接口的使用

**

Spring后处理器-BeanPostProcessor

**
Bean被实例化后,到最终缓存到singletonObjects单例池之前,中间会经常Bean的初始化过程,例如:属性的填充、初使方法init的执行等,其中有一个对外进行扩展的点BeanPostProcessor,我们称为Bean后处理。跟Bean工厂后处理器相似,它也是一个接口,实现了该接口并被容器管理的BeanPostProcessor,会在流程节点上被Spring自动调用。

步骤如下:
1.准备好一个接口实现类

public class UserDaoImpl implements UserDao {
    private String username;

    public void setUsername(String username) {
        this.username = username;
    }

    public String getUsername() {
        return username;
    }

    public UserDaoImpl(){
        System.out.println("userDao实例化");
    }
}

2.配置

<bean id="userDao" name="aaa,bbb" class="com.itheima.dao.impl.UserDaoImpl"></bean>

3.定义一个类实现接口BeanPostProcessor及其方法

public class MyBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof UserDaoImpl){
            UserDaoImpl userDao= (UserDaoImpl) bean;
            userDao.setUsername("哈哈");
        }
        System.out.println(beanName+":postProcessBeforeInitialization");
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println(beanName+":postProcessAfterInitialization");
        return bean;
    }
}

4.配置实现接口的类

<bean class="com.itheima.processor.MyBeanPostProcessor"/>

5.测试

ClassPathXmlApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDaoImpl userDao = (UserDaoImpl) applicationContext.getBean("userDao");
        System.out.println(userDao.getUsername());

打印结果如下:
在这里插入图片描述
InitializingBean接口的使用与bean的生命周期
6.改进UserDaoImpl类,增加实现InitializingBean接口

@Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("属性设置之后执行");
    }

7.UserDaoImpl类增加init的初始化方法

public void init(){
        System.out.println("init初始化方法执行");
    }

8.配置文件指定初始化方法

<bean id="userDao" name="aaa,bbb" class="com.itheima.dao.impl.UserDaoImpl" init-method="init"></bean>

9.测试
main方法中代码不变直接运行,打印如下,可知接口的方法其运行顺序先于配置的初始化方法
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Bean 的生命周期可以分为以下几个阶段: 1. 实例化:当 Spring 容器接收到创建 Bean 的请求时,容器根据 Bean 的定义信息创建 Bean 实例。这个阶段是使用构造方法来创建 Bean 实例的。 2. 属性赋值:在实例化 Bean 之后Spring 容器使用 setter 方法或构造方法将 Bean 的属性赋值。 3. Aware 接口回调:在 Bean 的属性赋值完成之后Spring 容器调用实现了 Aware 接口Bean 的相应方法,例如 BeanNameAware、BeanFactoryAware、ApplicationContextAware 等。 4. BeanPostProcessor 前置处理器Spring 容器调用注册的 BeanPostProcessorpostProcessBeforeInitialization() 方法,对 Bean 进行修改或增强。 5. 初始化:初始化阶段是 BeanPostProcessor 后置处理器postProcessBeforeInitialization() 方法和 postProcessAfterInitialization() 方法之间的阶段。在这个阶段中,Spring 容器检查是否实现了 InitializingBean 接口,如果实现了,就调用 afterPropertiesSet() 方法。 6. 自定义初始化方法:如果没有实现 InitializingBean 接口Spring 容器查找是否配置了自定义的初始化方法,如果配置了,就调用该方法。 7. BeanPostProcessor 后置处理器Spring 容器调用注册的 BeanPostProcessorpostProcessAfterInitialization() 方法,对 Bean 进行修改或增强。 8. 使用Bean 初始化完成后,就可以使用了。 9. 销毁:当 Spring 容器关闭时,调用实现了 DisposableBean 接口Bean 的 destroy() 方法。如果没有实现该接口Spring 容器查找是否配置了自定义的销毁方法,如果配置了,就调用该方法。 总之,Spring Bean 的生命周期是:实例化 -> 属性赋值 -> Aware 接口回调 -> BeanPostProcessor 前置处理器 -> 初始化 -> 自定义初始化方法 -> BeanPostProcessor 后置处理器 -> 使用 -> 销毁。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值