自定义迷你版Spring框架

2023-10-10 12:20

本文主要是介绍自定义迷你版Spring框架,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

自定义迷你版Spring框架

一、需求概述

​ 自定义@Service、@Autowired、@Transactional注解类,完成基于注解的IOC容器(Bean对象创建及依赖注入维护)和声明式事务控制,写到转账工程中,并且可以实现转账成功和转账异常时事务回滚

二、实现思路分析

根据需求的描述,我们可以参考spring框架的xml文件启动方式简单实现

1.创建配置文件beans.xml 配置一个包扫描路径

2.根据包扫描路径我们可以得到包以及子包下的所有类全限定名

3.根据反射对带有@Service注解的类进行实例化存到缓存并把有实例对象的bean以及beanDefinition放入缓存

4.对带有Autowired注解的属性注入对象实例并赋值

三、主要代码实现展示

public class DefaultAnnotationHandler {private Map<Class<?>, BeanDefinition> hasInstanceBeanCache = new HashMap<>();public void processAnnotations(List<String> allClassName) {if (allClassName != null) {for (String className : allClassName) {//根据类名对bean做加载注册到缓存map对象processAnnotations(className);}}}public void processAnnotations(String className) {Class<?> clazz = null;try {clazz = Class.forName(className);} catch (ClassNotFoundException e) {e.printStackTrace();}if (clazz == null) {return;}//如果反射获取到的类不为空且不是接口且不是注解的话做处理if (clazz != null && !clazz.isInterface() && !clazz.isAnnotation()) {// AAA.处理对象实例化Service service = clazz.getAnnotation(Service.class);//如果类上有@Service注解做处理if (service != null) {// 0.根据当前类名称注入 把beanDefinition(当前类的代理对象和bean实例)注入mapBeanDefinition beanDefinition = BeanFactory.registryBeanByInterface(clazz.getName(), clazz);// 1.service注解有指定idString id = service.value();if (!StringUtils.isEmpty(id)) {//如果在注解上加上了命名id则根据id注入beanDefinitionBeanFactory.registryBean(id, beanDefinition);}// 2.未指定ID,则根据父接口名注入beanDefinitionClass<?>[] interfaces = clazz.getInterfaces();if (interfaces != null) {for (Class<?> anInterface : interfaces) {BeanFactory.registryBeanByInterface(anInterface.getName(), beanDefinition);}}//把有实例对象的bean以及beanDefinition放入缓存hasInstanceBeanCache.put(clazz, beanDefinition);}}}//对带有Autowired注解的属性注入对象实例public void doProcessPropertiesBeanAutowired() {for (Map.Entry<Class<?>, BeanDefinition> entry : hasInstanceBeanCache.entrySet()) {Class<?> aClass = entry.getKey();//获取有实例对象bean的所有属性Field[] fields = aClass.getDeclaredFields();for (Field field : fields) {Autowired autowired = field.getAnnotation(Autowired.class);//如果属性带有Autowired注解且required=true那么就给属性依赖注入if (autowired != null && autowired.required()) {field.setAccessible(true);//根据属性类名获取对象Object   bean = BeanFactory.getBean(field.getType());try {//获取BeanDefinitionBeanDefinition needInjected = entry.getValue();//把对象实例赋值给对象field.set(needInjected.getInstance(), bean);} catch (IllegalAccessException e) {e.printStackTrace();}}}}hasInstanceBeanCache.clear();}
}

四、效果演示

在工程中能拿到注解对应的bean说明我们的IOC容器管理是没有问题的
然后在转账中故意制造了一个异常测试事务的效果
在这里插入图片描述
在这里插入图片描述
工程结构
在这里插入图片描述

五、总结

通过以上需求那么我们对基本的自定义Spring框架是有了一定的了解,那么我们可以更好的理解spring的思想,对于看spring源码

也可以有一定的思路,希望大家有兴趣的哥们之间多探讨技术,有助于彼此的提升,不好的地方欢迎指出。

注意:数据源需要换成自己的本地数据库信息,工程中附带demo的sql脚本

代码地址:https://gitee.com/xiangaiya/csdn/tree/master/lagou-transfer

这篇关于自定义迷你版Spring框架的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/180403

相关文章

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

Java 实用工具类Spring 的 AnnotationUtils详解

《Java实用工具类Spring的AnnotationUtils详解》Spring框架提供了一个强大的注解工具类org.springframework.core.annotation.Annot... 目录前言一、AnnotationUtils 的常用方法二、常见应用场景三、与 JDK 原生注解 API 的

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

Spring Security自定义身份认证的实现方法

《SpringSecurity自定义身份认证的实现方法》:本文主要介绍SpringSecurity自定义身份认证的实现方法,下面对SpringSecurity的这三种自定义身份认证进行详细讲解,... 目录1.内存身份认证(1)创建配置类(2)验证内存身份认证2.JDBC身份认证(1)数据准备 (2)配置依

SpringBoot整合OpenFeign的完整指南

《SpringBoot整合OpenFeign的完整指南》OpenFeign是由Netflix开发的一个声明式Web服务客户端,它使得编写HTTP客户端变得更加简单,本文为大家介绍了SpringBoot... 目录什么是OpenFeign环境准备创建 Spring Boot 项目添加依赖启用 OpenFeig

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删