在 Spring 容器初始化 Bean 时,通过反射机制处理带有自定义 注解的字段,并将其注入相应的 Spring 管理的 Bean

ops/2024/10/15 17:23:02/

背景:我们之前项目用的自己研发的框架,后来又要重构,但是有些功能还依赖于之前的框架,万不得已的情况下,我就把之前的框架当成三方的依赖给引入,引入以后就发现,很多类上用了@Inject这个注解,再一看包名竟然是自定义的,这几个类就是无法注入到spring中,用了好多种方法,使用的时候永远null,

话不多说,直接上代码

package com.pj.atomarrowSy.config;import net.atomarrow.controllers.converter.TypeConverter;
import net.atomarrow.db.executor.JdbcExecutor;
import net.atomarrow.db.orm.listener.OrmListenerKeeper;
import net.atomarrow.db.parser.JdbcParser;
import net.atomarrow.services.JdbcService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class JdbcConfig {@Beanpublic JdbcService jdbcService() {return new JdbcService();}@Beanpublic JdbcParser jdbcParser() {return new JdbcParser();}@Beanpublic JdbcExecutor jdbcExecutor() {return new JdbcExecutor();}@Beanpublic TypeConverter typeConverter() {return new TypeConverter();}@Beanpublic OrmListenerKeeper ormListenerKeeper() {return new OrmListenerKeeper();}}
package com.pj.atomarrowSy.processor;import net.atomarrow.annotation.Inject;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;import java.lang.reflect.Field;/*** 处理器的作用:* 在 Spring 容器初始化 Bean 时,* 通过反射机制处理带有自定义注解 @Inject 的字段,* 并将这些字段注入相应的 Spring 管理的 Bean。* implements BeanPostProcessor:实现 BeanPostProcessor 接口,允许在 Bean 初始化前后进行自定义处理* implements ApplicationContextAware:实现 ApplicationContextAware 接口,使得该类可以获取到当前的 ApplicationContext,从而能够访问 Spring 容器中的其他 Bean。*/
@Component
public class CustomInjectAnnotationBeanPostProcessor implements BeanPostProcessor, ApplicationContextAware{private ApplicationContext applicationContext;//在 Bean 初始化之前调用的方法。@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {// 遍历 Bean 中的所有字段
//        System.out.println("Processing bean: " + beanName);for (Field field : bean.getClass().getDeclaredFields()) {if (field.isAnnotationPresent(Inject.class)) { //检查字段是否有 @Inject 注解System.out.println("Found @Inject annotation on field: " + field.getName() + " in class: " + bean.getClass().getName());try {field.setAccessible(true);// 设置字段可访问Object fieldValue = applicationContext.getBean(field.getType()); // 从 Spring 容器中获取相应类型的 Beanif (fieldValue == null) {System.err.println("Bean not found in context for type: " + field.getType().getName() + " in class: " + bean.getClass().getName());} else {field.set(bean, fieldValue);// 将获取到的 Bean 注入到字段中System.out.println("Injected field: " + field.getName() + " with value: " + fieldValue + " in class: " + bean.getClass().getName());}} catch (IllegalAccessException e) {throw new RuntimeException("Failed to inject field: " + field.getName() + " in class: " + bean.getClass().getName(), e);}}}return bean; // 返回处理后的 Bean}//在 Bean 初始化之后调用的方法。这里没有做任何额外处理,直接返回 Bean。@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {// 这里不需要做额外的处理return bean;}//实现 ApplicationContextAware 接口的方法,// 用于设置 ApplicationContext,使 CustomInjectAnnotationBeanPostProcessor 能够访问 Spring 容器中的 Bean。@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}}


http://www.ppmy.cn/ops/126031.html

相关文章

Unity3D XML与Properties配置文件读取详解

在游戏开发过程中,配置文件是一个非常重要的部分,它可以用来存储游戏中的各种参数、设置、文本等信息。Unity3D 支持多种配置文件格式,比如 XML 和 Properties。 对惹,这里有一个游戏开发交流小组,大家可以点击进来一…

K8s-资源管理

一、资源管理介绍 在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes。 kubernetes的本质上就是一个集群系统,用户可以在集群中部署各种服务,所谓的部署服务,其实就是在kubernetes集群中…

RabbitMQ原理剖析

目录 RabbitMQ原理剖析 RabbitMQ的消息持久化存储在哪里? 存储位置 存储机制 持久化设置 RabbitMQ的消息消费者怎么知道消费到哪了?消费过程是什么样的?消费后的消息会被删除吗?后续还能再次消费吗? 1. 消费者如何知道消费…

使用Uniapp开发微信小程序实现一个自定义的首页顶部轮播图效果?

在Uniapp中开发微信小程序,并实现自定义首页顶部轮播图的效果,可以通过使用Uniapp的组件如swiper和swiper-item来完成。这是一个常见的需求,下面是一个完整的示例代码,展示如何实现一个简单的自定义轮播图效果。 创建页面结构 首…

鸿蒙--WaterFlow 实现商城首页

目录结构 ├──entry/src/main/ets // 代码区 │ ├──common │ │ ├──constants │ │ │ └──CommonConstants.ets // 公共常量类 │ │ └──utils │ │ └──Logger.ets // 日志打印类 │ ├──entryability │ │ └──EntryAbility.ets // 程序入口…

24年9月最新大众点评

24年最新大众点评数据 全国全品类均有 单买一个城市,看数据量和城市体量评估价格,拍前请私聊 大众点评数据采集成本很高,请带着充足预算来!!!拒绝无效沟通! 爬虫为大众点评页面商家数据&#xf…

2025选题推荐|基于微信小程序的高校就业招聘系统

作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参与学生毕业答辩指导,…

李德仁院士携实验室及大势文旅团队参加“湖北旅游、武当突破”名家谈,分享数智文旅发展新经验

10月12日上午,2024世界武当太极大会在湖北省十堰市武当山盛大开幕。 2023年国家科学技术最高奖获得者、中国科学院、中国工程院院士、武汉大学李德仁教授携测绘遥感信息工程国家重点实验室(后简称“实验室”)团队以及大势智慧文旅团队&#…