Spring注解驱动之BeanPostProcessor后置处理器讲解

作者:融极 时间:2023-01-04 17:13:26 

概述

在学习Spring的时候,在了解基本用法的时候,如果有时间一定要深入源码了解Spring的底层原理,这样在做一些适配工作、写一些轮子的时候就会比较容易,否则会很难,甚至一头雾水,无法完成工作。

吃透Spring的原理和源码,往往可以拉开人们之间的差距,当前只要是使用Java技术栈开发的Web项目,几乎都会使用Spring框架。

而且目前各招聘网站上对于Java开发的要求几乎清一色的都是熟悉或者精通Spring,所以,你很有必要学习Spring的细节知识点。

BeanPostProcessor后置处理器概述

首先,看下BeanPostProcessor的源码。

package org.springframework.beans.factory.config;

import org.springframework.beans.BeansException;

public interface BeanPostProcessor {
Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;

Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}

从源码可以看出,BeanPostProcessor是一个接口,其中有两个方法:

postProcessBeforeInitialization和postProcessAfterInitialization这两个方法分别是在Spring容器中的bean初始化前后执行,所以Spring容器中的每个bean对象初始化前后,都会执行BeanPostProcessor接口的两个方法。

也就是说,postProcessBeforeInitialization方法会在bean实例化和属性设置之后,自定义初始化方法之前被调用,而postProcessAfterInitialization方法会在自定义初始化方法之后被调用。当容器中存在多个BeanPostProcessor的实现类时,会按照它们在容器中注册的顺序执行。对于自定义的BeanPostProcessor实现类,还可以让其实现Ordered接口自定义排序。

因此我们可以在每个bean对象初始化前后,加上自己的逻辑。实现方式是自定义一个BeanPostProcessor接口的实现类,例如MyBeanPostProcessor,然后在该类的postProcessBeforeInitialization和postProcessAfterInitialization这两个方法写上自定义逻辑。

BeanPostProcessor后置处理器实例

我们创建一个MyBeanPostProcessor类,实现BeanPostProcessor接口,如下所示。

package com.meimeixia.bean;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;

@Component // 将后置处理器加入到容器中,这样的话,Spring就能让它工作了,否则无法工作
public class MyBeanPostProcessor implements BeanPostProcessor {

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

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

接下来,我们应该是要编写测试用例来进行测试了。

package com.meimeixia.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

import com.meimeixia.bean.Car;

@ComponentScan("com.meimeixia.bean")
@Configuration
public class MainConfigOfLifeCycle {

@Bean(initMethod="init", destroyMethod="destroy")
public Car car() {
return new Car();
}
}

第二处改动是将Cat类上添加的@Scope(“prototype”)注解给注释掉,因为咱们之前做测试的时候,也是将Cat对象设置成多实例bean了。

package com.meimeixia.bean;

import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

// @Scope("prototype")
@Component
public class Cat implements InitializingBean, DisposableBean {

public Cat() {
System.out.println("cat constructor...");
}

/**
* 会在容器关闭的时候进行调用
*/
@Override
public void destroy() throws Exception {
// TODO Auto-generated method stub
System.out.println("cat destroy...");
}

/**
* 会在bean创建完成,并且属性都赋好值以后进行调用
*/
@Override
public void afterPropertiesSet() throws Exception {
// TODO Auto-generated method stub
System.out.println("cat afterPropertiesSet...");
}
}

来源:https://blog.csdn.net/tianzhonghaoqing/article/details/126690711

标签:Spring,BeanPostProcessor,后置处理器
0
投稿

猜你喜欢

  • JavaSE的逻辑控制你了解吗

    2023-01-07 01:32:22
  • Android实现视频播放--腾讯浏览服务(TBS)功能

    2021-09-06 20:13:10
  • mybatis @InsertProvider报错问题及解决

    2023-09-27 15:49:59
  • Java 根据某个 key 加锁的实现方式

    2023-10-27 07:54:20
  • c# 组合模式

    2022-07-07 09:04:09
  • Android编程动态按钮实现方法

    2021-12-31 18:05:17
  • Kotlin开发笔记之委托属性与区间(译)

    2022-07-12 19:14:32
  • 详解JAVA Spring 中的事件机制

    2022-01-13 05:26:33
  • 深入Android SQLite 事务处理详解

    2023-07-17 08:32:17
  • 如何用120行Java代码写一个自己的区块链

    2023-07-17 03:44:33
  • Spring BeanDefinition使用介绍

    2023-11-24 10:29:10
  • java final 和instanceof 关键字的区别

    2021-11-03 13:52:43
  • c#生成随机数示例分享

    2023-10-04 06:54:50
  • java 线程创建多线程详解

    2021-08-06 22:02:22
  • Android下Activity全屏显示实现方法

    2022-12-17 19:57:56
  • Java如何使用spire进行word文档的替换详解

    2022-10-15 09:59:21
  • Android设置PreferenceCategory背景颜色的方法

    2021-09-24 10:13:29
  • Android Studio中使用jni进行opencv开发的环境配置方法

    2021-07-26 00:02:06
  • Java 图片与byte数组互相转换实例

    2023-06-24 03:28:39
  • c#二维码生成的代码分享

    2022-11-28 15:19:37
  • asp之家 软件编程 m.aspxhome.com