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反射实现 绝对满足你的好奇心哦 解决怎么我写了一个注解就可以直接注入了?相关推荐

  1. 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程)

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...

  2. 一步一步手绘Spring IOC运行时序图三(基于Annotation的IOC容器初始化)

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...

  3. 一步一步手绘Spring IOC运行时序图二(基于XML的IOC容器初始化)

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...

  4. JAVA工厂模式(手写Spring IOC案例)

    通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 源码地址:https://gitee.com/yang-kairui/design-pattern 通过简单模拟sprin ...

  5. 打怪上分! 手写Spring ioc 框架,狠狠的“撸撸”Spring 源码

    估计很多朋友使用 spring 很长时间,对于 spring 使用非常频繁,实际上对于源码一直没有静下心来学习过. 你是不是有这样的感觉呢? 但是 spring 源码存在一个问题,那就是过于抽象,导致 ...

  6. spring根据名称获取bean_带你从零开始手写 spring ioc 框架,深入学习 spring 源码

    IoC Ioc 是一款 spring ioc 核心功能简化实现版本,便于学习和理解原理. 创作目的 使用 spring 很长时间,对于 spring 使用非常频繁,实际上对于源码一直没有静下心来学习过 ...

  7. 21.手绘Spring IOC运行时序图

    1.再谈IOC与 DI IOC(lnversion of Control)控制反转:所谓控制反转,就是把原先我们代码里面需要实现的对象创 建.依赖的代码,反转给容器来帮忙实现.那么必然的我们需要创建一 ...

  8. IOC操作Bean管理注解方式(注入属性@Autowired和Qualifier)

    目录 IOC操作Bean管理注解方式(注入属性@Autowired.@Qualifier和@Resource) 1.基于注解方式实现 属性注入 (1)@Autowired:根据属性类型进行自动装配 第 ...

  9. 手写 Spring 事务、IOC、DI 和 MVC

    Spring AOP 原理 什么是 AOP? AOP 即面向切面编程,利用 AOP 可以对业务进行解耦,提高重用性,提高开发效率 应用场景:日志记录,性能统计,安全控制,事务处理,异常处理 AOP 底 ...

最新文章

  1. 【UR #4】元旦三侠的游戏(博弈论+记忆化)
  2. c#生成随机位数的汉字字符串
  3. spring-mybatis.xml 访问html5,Spring mvc无xml配置及利用JdbcTemplate访问数据库
  4. spring boot: 查看ApplicationContext中有哪些Bean
  5. 支持在iPad中播放的HTML5视频网站推荐
  6. 服务器新手装备无限拿指令,【新手指南】服务器指令大全
  7. Cookiecutter
  8. day1 java基础回顾-多线程
  9. 谁设计python_如果你有设计师朋友,请对TA好一些...
  10. 安装Oracle 11.2.0
  11. TCPUDP调试工具 Linux 版
  12. 怎样修改电脑时间同步北京时间
  13. MongoDB索引原理
  14. 构建可伸缩系统:垂直伸缩、水平伸缩、应用无状态、一致性哈希、分布式文件系统、分布式计算框架、应用垂直拆分、数据库读写分离-《分布式Java应用》读书笔记
  15. Linux命令——finger
  16. MySQL安装教程包含所有平台(图解),MySQL下载步骤详解(带安装教程)
  17. 浏览器主页被2345劫持简单处理方法
  18. 如何让键盘支持自动输入
  19. 魔法师与麻瓜,只隔一个大数据的距离
  20. oracle mrp mps mds 的table关联,生产管理系统中的MRP与MPS

热门文章

  1. SAP的client概念
  2. SAP: ALV的布局管理
  3. excel公式中更正错误 #N/A
  4. 高压线下,恶俗短视频为何仍在批量生产?
  5. 这届年轻人连穷都不怕,还会怕冷?
  6. oracle 批量修改表结构,关于Oracle批量修改表结构相关内容的整理
  7. 定义一个列表存储n个整数,求列表的长度,最大值,最小值和平均值
  8. 青海大学计算机专业在全国排名,青海大学专业排名
  9. 加速安装LibcSeacher
  10. pwntools语句的简单使用,包含例子