【spring】bean的后处理器

news2025/1/11 12:49:32

目录

      • 一、作用
      • 二、常见的bean后处理器
        • 2.1 AutowiredAnnotationBeanPostProcessor
          • 2.1.1 说明
          • 2.1.2 代码示例
          • 2.1.3 截图示例
        • 2.2 CommonAnnotationBeanPostProcessor
          • 2.2.1 说明
          • 2.2.2 代码示例
          • 2.2.3 截图示例
        • 2.3 ConfigurationPropertiesBindingPostProcessor
          • 2.3.1 说明
          • 2.3.2 代码示例
          • 2.3.3 截图示例

一、作用

  • 1.为bean生命周期的各个阶段提供扩展
  • 2.实例化前、实例化后、依赖注入阶段、初始化前、初始化后、销毁之前提供扩展

二、常见的bean后处理器

2.1 AutowiredAnnotationBeanPostProcessor
2.1.1 说明
  • 1. 用来解析@Autowired @Value注解
2.1.2 代码示例
package com.learning.bean_processor;

public class Dog {
}

package com.learning.bean_processor;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;

public class Person {
	private Dog dog;

	@Autowired
	public void setDog(Dog dog) {
		System.out.println("@Autowired生效:" + dog);
		this.dog = dog;
	}

	private String home;

	@Autowired
	public void setHome(@Value("${JAVA_HOME}") String home){
		System.out.println("@Value生效:" + home);
		this.home = home;
	}

}

package com.learning.bean_processor;

import org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor;
import org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor;
import org.springframework.context.annotation.CommonAnnotationBeanPostProcessor;
import org.springframework.context.annotation.ContextAnnotationAutowireCandidateResolver;
import org.springframework.context.support.GenericApplicationContext;

/**
 * Bean后处理器
 */
public class BeanProcessorTest {
	public static void main(String[] args) {
		GenericApplicationContext genericApplicationContext = new GenericApplicationContext();

		// 用原始方法注册三个Bean
		genericApplicationContext.registerBean("person", Person.class);

		genericApplicationContext.registerBean("dog", Dog.class);


		genericApplicationContext.getDefaultListableBeanFactory().setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());
		// 解析@Autowired @Value注解
		genericApplicationContext.registerBean(AutowiredAnnotationBeanPostProcessor.class);



		// 初始化容器
		// 执行beanFactory后处理器,添加bean后处理器,初始化所有单例
		genericApplicationContext.refresh();

		// 销毁容器
		genericApplicationContext.close();
	}
}

2.1.3 截图示例

在这里插入图片描述

2.2 CommonAnnotationBeanPostProcessor
2.2.1 说明
  • 1. 解析@Resource @PostConstruct @PreDestroy
2.2.2 代码示例
package com.learning.bean_processor;

public class Cat {
}

package com.learning.bean_processor;

import javax.annotation.Resource;

public class Person {

	private Cat cat;

	@Resource
	public void setCat(Cat cat) {
		System.out.println("@Resource:" + cat);
		this.cat = cat;
	}

}

package com.learning.bean_processor;

import org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor;
import org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor;
import org.springframework.context.annotation.CommonAnnotationBeanPostProcessor;
import org.springframework.context.annotation.ContextAnnotationAutowireCandidateResolver;
import org.springframework.context.support.GenericApplicationContext;

/**
 * Bean后处理器
 */
public class BeanProcessorTest {
	public static void main(String[] args) {
		GenericApplicationContext genericApplicationContext = new GenericApplicationContext();

		// 用原始方法注册三个Bean
		genericApplicationContext.registerBean("person", Person.class);

		genericApplicationContext.registerBean("cat", Cat.class);

		// 解析@Resource @PostConstruct @PreDestroy
		genericApplicationContext.registerBean(CommonAnnotationBeanPostProcessor.class);

		// 初始化容器
		// 执行beanFactory后处理器,添加bean后处理器,初始化所有单例
		genericApplicationContext.refresh();
		// 销毁容器
		genericApplicationContext.close();
	}
}

2.2.3 截图示例

在这里插入图片描述

2.3 ConfigurationPropertiesBindingPostProcessor
2.3.1 说明
  • 1. springboot中配置文件属性绑定bean的增强
  • 2. 需要引用springboot的包
2.3.2 代码示例
package com.learning.bean_processor;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

@Data
@ConfigurationProperties(prefix = "java")
public class JavaProperties {
    private String home;

    private String version;

}

package com.learning.bean_processor;

import org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor;
import org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor;
import org.springframework.context.annotation.CommonAnnotationBeanPostProcessor;
import org.springframework.context.annotation.ContextAnnotationAutowireCandidateResolver;
import org.springframework.context.support.GenericApplicationContext;

/**
 * Bean后处理器
 */
public class BeanProcessorTest {
	public static void main(String[] args) {
		GenericApplicationContext genericApplicationContext = new GenericApplicationContext();

		// 把springboot中的ConfigurationPropertiesBindingPostProcessor后处理器加到容器中
		// 解析@ConfigurationProperties
		ConfigurationPropertiesBindingPostProcessor.register(genericApplicationContext.getDefaultListableBeanFactory());
		genericApplicationContext.registerBean("java_home", JavaProperties.class);


		// 初始化容器
		// 执行beanFactory后处理器,添加bean后处理器,初始化所有单例
		genericApplicationContext.refresh();

		System.out.println(genericApplicationContext.getBean(JavaProperties.class));

		// 销毁容器
		genericApplicationContext.close();
	}
}

2.3.3 截图示例

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1274927.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vivado实现分析与收敛技巧3-面向非工程用户的智能设计运行建议

要使用智能设计运行功能特性 , 需要 Vivado 工程。这是因为需要进行运行管理。以下指示信息解释了创建综合后工程的最简单方法。这些信息适用于以下流程的用户: • 非工程实现运行 • 使用较低版本的 Vivado 或第三方综合工具进行综合 访问智能设计…

高压功率放大器的应用领域有哪些

高压功率放大器是一种特殊的电子设备,用于放大低电压信号到较高的功率水平。它在许多应用领域中发挥着重要作用。下面西安安泰将详细介绍高压功率放大器的几个常见应用领域。 声学领域:高压功率放大器在声学领域中广泛应用。例如,在音响系统和…

【SparkSQL】SparkSQL函数定义(重点:定义UDF函数、使用窗口函数)

【大家好,我是爱干饭的猿,本文重点介绍SparkSQL 定义UDF函数、SparkSQL 使用窗口函数。 后续会继续分享其他重要知识点总结,如果喜欢这篇文章,点个赞👍,关注一下吧】 上一篇文章:《【SparkSQL…

Windows 安装redis,设置开机自启动

Windows 安装redis,设置开机自启动 文章目录 Windows 安装redis,设置开机自启动下载, 解压到指定目录设置redis密码启动redis服务端停止redis服务端设置自启动 下载, 解压到指定目录 官网地址: https://redis.io/ 安装包下载地址: https://github.com/tporadowski/redis/relea…

VScode 插件 CodeGeex 使用教程

VScode 插件 CodeGeex 使用教程 不过在笔者看来,和国外的 Copilot 存在不小的差距,Copilot 是基于国外的大模型,能力比国内 AI 大模型要强,但要付费、还可能因为网络原因影响速度,所以国内的胜在免费(不过…

每日一题:LeetCode-1089. 复写零

每日一题系列(day 09) 前言: 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 &#x1f50e…

文心大模型3.5 VS ChatGPT3.5,谁更会写代码 ?

问题:请帮我写一段代码,SAP物料凭证创建接口的代码 ? 文心大模型3.5:写了一段 python ChatGPT3.5 : 写的还可以啊,理解的很到位,而且用的是S/4新语法呀 ! DATA: lt_header TYPE TABLE OF bapi2017_gm_head_…

观《王牌对王牌:国宝回国》有感 —— AI绘画之古画修复对比图

一、前言 上周《王牌对王牌》节目的主题是《国宝回国》,而今天的AI绘画的灵感,就来源于这期节目。 下面这组图,左侧部分因时间的流逝而显现出褪色和损伤的痕迹,色彩变得暗淡,细节也因年代久远而变得模糊不清。 而右…

SA与NSA网络架构的区别

SA与NSA网络架构的区别 1. 三大运营商网络制式:2. 5G组网方式及业务特性3. NSA-3系列4. NSA—4系列5. NSA-7系列6. 5G SA网络架构7. 运营商策略 1. 三大运营商网络制式: 联通:3G(WCDMA)\4G(FDD-LTE/TD-LTE)\5G(SA/NSA)移动:2G(GS…

专注数据采集分析系统研发 做设备与MES系统中转站

数据采集是实现MES系统与设备对接的核心环节。通过采集设备产生的实时数据,将其传输给MES系统进行处理和分析。数据采集可以通过直接连接设备的传感器或者通过设备上安装的采集设备实现。采集的数据可以包括设备的运行状态、产量数据、测量数据、能耗数据等。通过数…

光伏电站卫星测绘的优缺点有哪些?

由于环境保护和能源安全的重要性日益凸显,光伏发电作为一种清洁、可再生、分布式的能源形式,已经成为全球能源领域的热门话题。 光伏电站,是指一种利用太阳光能、采用特殊材料诸如晶硅板、逆变器等电子元件组成的发电体系,与电网相…

管理Windows资产新方式:SSH协议

配置默认shell,需要管理员权限运行powershell执行下面命令: New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -F…

SpringBootWeb案例_03

Web后端开发_06 SpringBootWeb案例_03 登录认证 智能学习辅助系统登录时需要身份验证 1.登录功能 先实现简单的登录功能,在进一步优化。 1.1需求 若账户或密码不存在/密码不正确,则登录失败。 账户密码正确,则登录成功 1.2接口文档 …

Android Studio - 显示配置

1.修改 Code / Split / Design(代码视图 & 效果视图) 路径:Settings→Editor→Design Tools。 2.增加打开文件的数量及展示方式 路径:Settings→Editor→General→Editor Tabs。

BUUCTF [UTCTF2020]docx 1

BUUCTF:https://buuoj.cn/challenges 题目描述: 得到的 flag 请包上 flag{} 提交。 密文: 下载附件,得到一个.docx文件。 解题思路: 1、打开文件,内容如下,没有flag。 使用010 Editor打开.docx文件&…

AdWords 广告字符的限制是多少?

谷歌已经发展到不仅仅是一个简单的网络搜索。谷歌已成为任何组织所希望的最好的广告网络之一,不断有全球观众来到它研究项目和便利设施、数据、新闻、解决方案等等。 手机的变化带来了数字广告形式的初步转变,随后学习算法的发展和接受也给Google AdWor…

Qt基础 QListWidget dragDrop拖拽操作

目录 1.重写 2.本身自带拖拽功能 关于QLisWidget的item拖拽操作,也可以某个控件拖拽思路 1.重写 重写相当于要重写这些事件函数 void mousePressEvent(QMouseEvent *event); //鼠标按下 void mouseMoveEvent(QMouseEvent *event); //鼠标移动 void dragEnterE…

消字笔的正确使用方法?这样做轻松消除图片杂物!

拍摄的照片或者网上保存的图片有时候会有一点小瑕疵,比如拍摄照片的背景有他人出镜、衣服上有污渍点,保存的网图有水印或其他不想留存的元素。那想要收获一张完美照片,就需要使用消除工具进行处理,有需求就会有产品,具…

数据结构-03-栈

1-栈的结构和特点 先进后出,后进先出 是栈的特点; 从图中,我们看到A入栈先放入底部,然后依次B和C;出栈的顺序依次是C-B-A;这种结构只能在一端操作。所以当某个数据集合只涉及在一端插入和删除数据&#xf…

面试问的最多的时候

1:kafuka消息队列不丢数据 2:MVC的流转 3:线程池 4:liunx 5:k8s 6:负载过高 7:索引 8:事务 9:监听 10:动态路由 11:业务模块 12&#x…