首页 > 其他分享 >InstantiationAwareBeanPostProcessor 接口实现

InstantiationAwareBeanPostProcessor 接口实现

时间:2024-03-18 09:03:44浏览次数:14  
标签:beanName 实现 Object 接口 bean org import public InstantiationAwareBeanPostProcessor

BeanPostProcessor 结构图

BeanPostProcessor

1 code 如下:

package com.gientech.resolveBeforeInstantiation;

public class BeforeInstantiation {

    public void doSomething(){
        System.out.println("do some thing ......");
    }
}
package com.gientech.resolveBeforeInstantiation;


import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class MyMethodInterceptor implements MethodInterceptor {

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("目标方法执行之前: " + method);
        Object o1 = methodProxy.invokeSuper(o, objects);
        System.out.println("目标方法执行之后: " + method);
        return o1;
    }
}

BeanPostProcessor 接口中有postProcessBeforeInitialization,postProcessAfterInitialization 两个方法,
InstantiationAwareBeanPostProcessor 接口中有postProcessBeforeInstantiation,postProcessAfterInstantiation,postProcessProperties 方法
MyInstantiationAwareBeanPostProcessor 继承了InstantiationAwareBeanPostProcessor 接口,所以 在MyInstantiationAwareBeanPostProcessor 中需要实现5个方法。

package com.gientech.resolveBeforeInstantiation;

import org.springframework.beans.BeansException;
import org.springframework.beans.PropertyValues;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor;
import org.springframework.cglib.proxy.Enhancer;

public class MyInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("beanName:"+beanName+"----执行postProcessBeforeInitialization方法");
        return bean;
    }

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

    @Override
    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
        System.out.println("beanName:"+beanName+"----执行postProcessBeforeInstantiation方法");
        if (beanClass == BeforeInstantiation.class){
            Enhancer enhancer = new Enhancer();
            enhancer.setSuperclass(beanClass);
            enhancer.setCallback(new MyMethodInterceptor());
            BeforeInstantiation beforeInstantiation = (BeforeInstantiation) enhancer.create();
            System.out.println("创建代理对象: " + beforeInstantiation);
            return beforeInstantiation;
        }
        return beanClass;
    }

    @Override
    public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
        return false;
    }


    @Override
    public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {
        return pvs;
    }
}

配置文件如下:

<?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.xsd">
    
    <bean id="beforeInstantiation" class="com.gientech.resolveBeforeInstantiation.BeforeInstantiation"></bean>
    <bean id="myInstantiationAwareBeanPostProcessor" class="com.gientech.resolveBeforeInstantiation.MyInstantiationAwareBeanPostProcessor"></bean>
    
</beans>
package com.gientech.resolveBeforeInstantiation;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class BeforeInstantiationTest {

    public static void main(String[] args) {
        ApplicationContext ac = new ClassPathXmlApplicationContext("BeforeInstantiation.xml");
        BeforeInstantiation bean = ac.getBean(BeforeInstantiation.class);
        bean.doSomething();
    }
}

运行结果如下
BeforeInstantiationResult

创建完成后Bean在内存中的名称如下
BeforeInstantiation

标签:beanName,实现,Object,接口,bean,org,import,public,InstantiationAwareBeanPostProcessor
From: https://www.cnblogs.com/zgcy123456/p/18074424

相关文章

  • LVM实现将2块磁盘总空间“合二为一”并挂载到同一目录
     需求场景将MySQL主机的2块18T的数据盘空间全部“合并”后挂载到/mysql_data目录下,要求文件系统格式化为xfs;已有关键信息梳理如下:需要挂载的数据盘/dev/sdb:18T/dev/sdc:18T文件系统:ext4挂载目录:/mysql_data操作系统环境OS版本:CentOS7.5lvm版本:lvm2实现方法......
  • 递归组件实现子向父传值
    业务逻辑:通过自己调用自己的方式生成树,再点击子菜单时,需要将点击子菜单的菜单名传值给父组件(使用总线bus) 新建bus.js文件import{ref}from'vue'classBus{constructor(){//收集订阅信息,调度中心this.eventList={},//事件列表,这项是必须的//......
  • 【华为OD】C卷真题 100分:Wonderland游乐园 C语言代码实现[思路+代码]
      C++、java、python代码:【华为OD】C卷真题100分:Wonderland游乐园C/C++代码实现[思路+代码]-CSDN博客【华为OD】C卷真题100分:Wonderland游乐园Java代码实现[思路+代码]-CSDN博客【华为OD】C卷真题100分:Wonderland游乐园python代码实现[思路+代码]-CSDN博客  题......
  • Arduino RP2040 + SSD1306 I2C OLED +LittleFS存储GBK字库实现中文显示
    ArduinoRP2040+SSD1306I2COLED+LittleFS存储GBK字库实现中文显示......
  • 诚意满满之MySQL实现事务隔离的秘诀:锁与MVCC
    如果对事务没有太多理解,可以看前面三篇:诚意满满之讲透事务诚意满满之讲透事务隔离级别诚意满满之MySQL如何实现原子性、持久性不看前三篇也没有关系,知识点是独立的。MySQL的四个事务隔离级别:读未提交、读已提交、可重复读、串行读。其中,读未提交即是不加任何限制,串行读则......
  • 可编辑表格中的两个列分别是用react-hook-form 和antd的inputNumber实现的,需要在开始
    可编辑表格中的两个列分别是用react-hook-form和antd的inputNumber实现的,需要在开始时间的列输入后失焦时,或者按enter键,鼠标聚焦到下一列,即结束时间,该如何设置在React项目中,要实现在一个可编辑表格中,当开始时间列输入后失焦或按下Enter键时,自动将焦点切换至结束时间列,你可以结合......
  • go语言请求http接口示例 并解析json
    本例请求了天气api接口对接流程注册一个账号,对接免费实况天气接口阅读接口文档http://tianqiapi.com/index/doc?version=day请求接口解析json开发流程创建一个json.go文件需要引入的包import( "encoding/json" "fmt" "io/ioutil" "net/http")定义Wea......
  • 最详细的Keycloak教程(建议收藏):Keycloak实现手机号、验证码登陆——(三)基于springboot&k
    在前面两节分别介绍了Keycloak的下载与使用和keycloak与springboot的集成。接下来第三节让我们一步步的去完成一个简单的前后端分离项目,并且可以扩展实现sso。一、简介本文将介绍如何使用SpringBoot、Keycloak和Vue构建一个具有前后端分离架构的Web应用程序。通过将前......
  • java商场会员停车场管理系统的实现
    本系统(程序+源码)带文档lw万字以上 文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:随着城市化进程的加速和汽车保有量的持续增长,停车难已经成为城市中普遍存在的问题。特别是在商场等人流密集区域,如何高效管理会员停车场,提供便捷的停车服......
  • ffmpeg实现视频的加密解密
    刚打开一个视频,发现居然是加密的,感觉这个还挺有意思的:然后店家还给了这样一个播放的软件,打开是这样的:看来是需要密码的,从potplayer的打印来看就是这个视频的一些类型不对了,因此设备无法识别,就没法打开,我发现ffmpeg也可以实现:加密方式:#使用AES-128-CBC算法对视频文件进行加......