手写Spring-ioc 注入 jdk反射实现 绝对满足你的好奇心哦 解决怎么我写了一个注解就可以直接注入了?
Spring-Ioc原理 解析
我们学完Spring后,大都就直接接着学习之后的内容啦,但是我想偶尔回过头来看一看,才能走的更远啊。
温故而知新。
关于Spring是怎么实现的?怎么我写了一个注解就可以直接注入了?
这种问题,我开始学的时候就好奇了,当时懂的比较少,查完也就给忘记了。
随着学的越来越多,就越来越感觉到基础的重要性,所以就想再抽空来复习一遍。
本文写的是一个小demo,并不是从Spring的架构去谈Spring。
只对Spring的ioc的注入用java的反射做了一个简单的理解。
我想可以满足许多同我一样产生过好奇心的同学一个满足。
全部代码都可以直接copy测试,仅仅导入了junit。其余都是使用jdk反射实现的。
代码
首先写一个类 UserService
/*** @Author: crush* @Date: 2021-05-27 10:36* version 1.0*/
public class UserService {public void test(){System.out.println("这是一个测试!!!");}
}
再像Spring一样 来写个注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** @Author: crush* @Date: 2021-05-27 10:36* version 1.0*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface AutoWired {}
接着 写一个UserController
/*** @Author: crush* @Date: 2021-05-27 10:36* version 1.0*/
public class UserController {@AutoWiredprivate UserService userService;public UserService getUserService() {return userService;}public void test(){userService.test();}}
最后的就是测试
import org.junit.Test;
import java.util.stream.Stream;/*** @Author: crush* @Date: 2021-05-27 10:40* version 1.0*/
public class MyTest {@Testpublic void iocTest() {UserController userController = new UserController();Class<? extends UserController> clazz = userController.getClass();// 获取所有属性值 Stream.of(clazz.getDeclaredFields()).forEach(field -> {String name = field.getName();AutoWired annotation = field.getAnnotation(AutoWired.class);if (annotation != null) {// 防止私有属性 也称暴力反射field.setAccessible(true);// 获取属性的类型Class<?> type = field.getType();try {//创建此Class对象表示的类的新实例。 就像通过带有空参数列表的new表达式实例化该类一样。// 如果尚未初始化该类,则将其初始化。Object o = type.newInstance();field.set(userController,o);} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}});// 这里是测试System.out.println(userController.getUserService());userController.test();}
}
自言自语
我觉得Spring真的很多,看到都会产生一种恐惧,最近在对Spring进行深一步的了解,会接着发博客。
可是就是因为人对世间事物的好奇,才能走的更远吧,我已经感觉对Spring产生极大的兴趣啦。
大家一起加油哦
手写Spring-ioc 注入 jdk反射实现 绝对满足你的好奇心哦 解决怎么我写了一个注解就可以直接注入了?相关推荐
- 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程)
相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...
- 一步一步手绘Spring IOC运行时序图三(基于Annotation的IOC容器初始化)
相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...
- 一步一步手绘Spring IOC运行时序图二(基于XML的IOC容器初始化)
相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...
- JAVA工厂模式(手写Spring IOC案例)
通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 源码地址:https://gitee.com/yang-kairui/design-pattern 通过简单模拟sprin ...
- 打怪上分! 手写Spring ioc 框架,狠狠的“撸撸”Spring 源码
估计很多朋友使用 spring 很长时间,对于 spring 使用非常频繁,实际上对于源码一直没有静下心来学习过. 你是不是有这样的感觉呢? 但是 spring 源码存在一个问题,那就是过于抽象,导致 ...
- spring根据名称获取bean_带你从零开始手写 spring ioc 框架,深入学习 spring 源码
IoC Ioc 是一款 spring ioc 核心功能简化实现版本,便于学习和理解原理. 创作目的 使用 spring 很长时间,对于 spring 使用非常频繁,实际上对于源码一直没有静下心来学习过 ...
- 21.手绘Spring IOC运行时序图
1.再谈IOC与 DI IOC(lnversion of Control)控制反转:所谓控制反转,就是把原先我们代码里面需要实现的对象创 建.依赖的代码,反转给容器来帮忙实现.那么必然的我们需要创建一 ...
- IOC操作Bean管理注解方式(注入属性@Autowired和Qualifier)
目录 IOC操作Bean管理注解方式(注入属性@Autowired.@Qualifier和@Resource) 1.基于注解方式实现 属性注入 (1)@Autowired:根据属性类型进行自动装配 第 ...
- 手写 Spring 事务、IOC、DI 和 MVC
Spring AOP 原理 什么是 AOP? AOP 即面向切面编程,利用 AOP 可以对业务进行解耦,提高重用性,提高开发效率 应用场景:日志记录,性能统计,安全控制,事务处理,异常处理 AOP 底 ...
最新文章
- 【UR #4】元旦三侠的游戏(博弈论+记忆化)
- c#生成随机位数的汉字字符串
- spring-mybatis.xml 访问html5,Spring mvc无xml配置及利用JdbcTemplate访问数据库
- spring boot: 查看ApplicationContext中有哪些Bean
- 支持在iPad中播放的HTML5视频网站推荐
- 服务器新手装备无限拿指令,【新手指南】服务器指令大全
- Cookiecutter
- day1 java基础回顾-多线程
- 谁设计python_如果你有设计师朋友,请对TA好一些...
- 安装Oracle 11.2.0
- TCPUDP调试工具 Linux 版
- 怎样修改电脑时间同步北京时间
- MongoDB索引原理
- 构建可伸缩系统:垂直伸缩、水平伸缩、应用无状态、一致性哈希、分布式文件系统、分布式计算框架、应用垂直拆分、数据库读写分离-《分布式Java应用》读书笔记
- Linux命令——finger
- MySQL安装教程包含所有平台(图解),MySQL下载步骤详解(带安装教程)
- 浏览器主页被2345劫持简单处理方法
- 如何让键盘支持自动输入
- 魔法师与麻瓜,只隔一个大数据的距离
- oracle mrp mps mds 的table关联,生产管理系统中的MRP与MPS