手写Spring

传送门

SpringMVC的源码解析(精品)
Spring6的源码解析(精品)
SpringBoot3框架(精品)
MyBatis框架(精品)
MyBatis-Plus
SpringDataJPA
SpringCloudNetflix
SpringCloudAlibaba(精品)
Shiro
SpringSecurity
java的LOG日志框架
Activiti(敬请期待)
JDK8新特性
JDK9新特性
JDK10新特性
JDK11新特性
JDK12新特性
JDK13新特性
JDK14新特性
JDK15新特性
JDK16新特性
JDK17新特性
JDK18新特性
JDK19新特性
JDK20新特性
JDK21新特性
其他技术文章传送门入口

前言

手写Spring
手写SpringBoot
手写Mybatis

一、获取bean代码

1、获取bean代码1

pom为空,因为手写spring,所以什么都不引入
在这里插入图片描述
配置文件在这一步不需要写什么
在这里插入图片描述
模拟学习spring的时候,基本用法(以这个为主思路开展)
在这里插入图片描述
核心上下文类
在这里插入图片描述
核心上下文类
在这里插入图片描述
核心上下文类
在这里插入图片描述

2、获取bean代码2

自定义扫描注解,放到配置类上面
在这里插入图片描述

标记bean,代表了Controller、Service、Mapper等注解
在这里插入图片描述
单例和多例的自定义注解
在这里插入图片描述
bean的定义对象
在这里插入图片描述
spring的配置类
在这里插入图片描述
一个具体的userService
在这里插入图片描述

3、引入Autowired依赖注入代码3(在代码1和2上面增加了代码)

自定义依赖注解
在这里插入图片描述
依赖注入给主bean设置属性的值
在这里插入图片描述
依赖注入
在这里插入图片描述
测试成功
在这里插入图片描述

4、小总结

FeApplicationContext feApplicationContext = new FeApplicationContext(AppContext.class);
        UserService userService = (UserService)feApplicationContext.getBean("userService", UserService.class);
        userService.test();

全程围绕上面的代码,做了手写框架。
1、核心一:在上下文类FeApplicationContext的构造方法中实现主要代码逻辑。AppContext配置类上面有ComponentScan核心注解,可以拿到注解上的文件路径。(FeApplicationContext为上下文 类也是spring的容器也是bean工厂,原Spring框架中这个是个上下文接口,继承了BeanFactory接口,做了主要的核心逻辑代码,主要两个方法,构造方法和getBean方法,上下文就是  在spring初始化后获取bean实例的。AppContext为配置类,就是加了个ComponentScan注解,其他没干什么,目的应该是利用扫描路径引入  类加载器找想要的类=就是那些加了Component或者Service等的类。)
2、核心二:AppContext配置类通过文件路径以及类加载器拿到了所有文件目录资源,目录资源可以通过代码转化为包名+类名
3、核心三:类加载器通过包名+类名循环加载每个类,找标记了Component的类
4、核心四:将标记了Component的类存放到bean定义的map中(ConcurrentHashMap<String, BeanDefinition> beanDefinitionHashMap,这个map就是存放所有带Component注解的bean定义。这个BeanDefinition就个class和scope属性,scope用来标记是 原型=多例 还是单例)
5、核心五:在上下文类的getBean方法中,参数beanDefinition可以直接拿到class属性,并通过反射拿到主bean的实例对象
6、核心六:在拿到主bean的实例对象后,给主bean的各个字段赋值;也是在getBean方法中根据Autowired依赖注入找出对应的字段,并且通过字段名称获取到具体的字段实例,然后给当前的主实例的字段赋值

二、引入前置和后置处理器(BeanPostProcessor)

1、后置处理器

实现类实现定义好的接口,下面用了jdk的动态代理。打印的代理逻辑为程序员自己想加的逻辑,这个逻辑完成后,才是调用UserServiceImpl里面的方法。切面aop的逻辑可以在这里面做
在这里插入图片描述
处理。这边直接循环list而不是判断一个是因为AOP可以多层。比如事务和日志就会有两个BeanPostProcessor的实现类,一个事务实现类,一个日志实现类。
在这里插入图片描述
扫描加到list中
在这里插入图片描述
定义好的接口
在这里插入图片描述
jdk的动态代理,修改接口实现类
在这里插入图片描述
jdk动态代理,增加接口
在这里插入图片描述

2、小总结

1Spring首先从配置类标记的路径,获取类加载器的目录资源,类加载器可以一个一个加载目录资源中的类,并找出那些带有ComponentServiceControllerAutowired等等的注解类或者字段;
2、找出的这些注解或者字段,会存到到一个bean定义对象组成的map中,比如(ConcurrentHashMap<String, BeanDefinition> beanDefinitionHashMap;还有一些单例bean会放到单例组成的map中,比如ConcurrentHashMap<String, Object> singletonHashMap;还有一些前置后置处理器会放到前后置处理器组成的list中,比如List<BeanPostProcessor> beanPostProcessorList。因为这些代码逻辑主要在上下文类的  构造器中,所以spring也叫做容器。存了很多东西。其中注解反射用的非常多。
3、上下文类中的构造器中创建了bean对象,直接先从bean定义对象组成的map中取出定义再创建实例,然后设置Autowired注解后的字段值,  然后是前置处理器的执行,然后是初始化的执行,然后是后置处理器的执行。前后置处理器是同一个BeanPostProcessor接口,实现类实现里面的两个方法,在创建bean对象的时候可以在初始化方法的上下去执行一些逻辑,实现AOP
  • 13
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝影铁哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值