小白看完都会了!javasocket编程聊天室(代码片段)

程序员环西 程序员环西     2022-12-04     210

关键词:

二、Spring生命周期的大胆猜测

这里分享一个阅读源码的小技巧:捉大放小,连蒙带猜!8字真言,我们在阅读源码过程中,因为你要知道,每一个被开源出来的优秀框架,其源码的体系都是极其庞大复杂的,我们不能面面俱到,所以在看源码过程中一定不能被细枝末节缠住,一定要先理清楚整个框架的一个大致思想和大致的框架体系,再去搞那些细枝末节,其效率会好很多,其次在看源码过程中,我们一定要大胆的去想,去猜测,如果这个功能让你自己去写,你会怎么实现!

我们今天学习SpringBean的生命周期也是按照这个8字真言去学习,通过我们之前所学,Spring大致有以下的功能:

  1. 他会帮我们自动的创建对象然后保存起来!
  2. 他会帮我们完成属性的填充!
  3. 如果我们设置了Aop的功能,他会帮我们自动的代理,实现切面功能!

我们从平常的使用中,至少可以得知以上的三点,如果让你自己去实现,必会如何实现呢?

  • 首先他既然能够帮我们自己创建对象,那么他肯定是通过反射来创建的,通过反射来创建,就必定绕不过去要使用Class对象创建,那么我们如何获取Class对象呢? 去扫描项目,将指定的包下的加了注解的类文件切割获取Class名称,通过反射加载Class名称,反射创建java对象!
  • 我们要完成属性的填充,为了方便和性能方面,我肯定会把这些创建好的对象保存起来,无疑Map容器是最合适的!
  • 我们在创建一个对象完成之后,反射拿到里面的属性,如果需要填充,我们先去我们之前保存的容器里面去取,取不出来在反射吧这个依赖的属性创建出来,然后填充进对象再保存在容器里面,从而完成了属性的注入!
  • 填充完成属性之后,我们那当前对象,取与Aop逻辑进行对比,判断是否需要代理,不需要则创建完成,保存进Map容器,需要代理则对当前这个类进行jdk或者cglib的代理然后再保存进容器里面!

于是乎,我们自己实现了一个Spring管理一个Bean的所有过程,画个图,他大概长这样!

自己实现看起来,整个流程就很清晰,扫描、创建、注入、代理、保存一应俱全,但是Spring的实现方式远比我们自己实现的要复杂的多得多!

三、Spring的生命周期流程

Spring作者希望,Spring再着手管理一个Bean的时候,它希望能够让Spring的使用者能够插手,Spring把一个类对象变成一个Java Object的每一步,怎么理解呢?

比如我们买了一栋新房子,这个房子需要取装修,你自己去装修诚然不够专业,不能够面面俱到,所以是我们就找了一个装修公司帮助我们装修新房,于是装修公司就开始预先画好的图纸进行装修,但是在装修的过程中,你为了让自己的新家更加温馨,你想挂一些壁画在墙上,但是图纸上却没有!于是你就找装修公司,要求装修公司在新家的墙上挂上一些壁画!装修公司在接受到你的请求之后,就吩咐装修的工人在图纸之外去给你在墙上挂上壁画之后,然后再接着装修!

上面这个小故事有 这样几个角色,我们把它和Spring对照起来!

  • 你:代表框架的使用者!
  • 新房:代表一个Class文件,你自己也能够装修,但是不够专业,所以交给装修公司! 那么你自己创建对象可能某些使用用起来很麻烦,所以我们交给了Spring容器!
  • 装修公司:代表着Spring容器!
  • 图纸:代表预设步骤,Spring原本就存在的步骤!
  • 工人:Spring提供的各种接口!我们可以通过Spring工厂提供的接口做各种自定义的配置!

上面的小故事,大致可以描述Spring生命周期的核心思想!Spring再对一个Class文件实例化成具体的Spring Bean的时候,它提供了各种接口,由我们自己实现!然后再实例化过程中,不同的时机,去调用不同的接口!从而完成Spring的整个生命周期的创建!

Spring的生命周期大致分为以下部分!

  1. 扫描项目,将项目指定目录下的Class文件转换为Class对象!

  2. 读取Class对象属性包装为BeanDefinition,然后保存再一个Map中!(不难理解,他是为了后续创建或者读取这个类的信息更加方便取而创立的)

  3. 将全部的类转化为 BeanDefinition 并保存之后,开始调用第一个回调接口BeanFactoryPostProcessor#postProcessBeanFactory()!

    • 它的调用时机是将扫描到的Class文件转换为 BeanDefinition 之后调用的,我们可以通过回调的方法获取所有的BeanDefinition ,而后续的所有对Class的操作都是基于BeanDefinition 操作的,所以,我们可以通过修改它,来改变后续的流程!
  4. 先从当前的容器对象取当前要创建的对象,当取出来的对象为null时开始着手创建对象!

  5. 做一系列的验证,比如验证这个类是否被排除、是否正在创建中、是否有依赖Bean【@DependsOn】注解、是否时单例等等!

  6. 验证通过之后,开始通过反射创建这个对象!

  7. 合并BeanDefinition ,这里涉及到Spring之前版本使用的父子容器的概念,属于另外一个知识点不做讲解!

  8. 判断当前对象是不是单例、是不是支持循环引用、是不是正在创建等!

  9. 执行第二个接口回调InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation()方法!

    • 它的执行时机时实例化完成之后,属性填充之前,它的返回值是一个布尔值,当返回false时,不做自动属性填充!
  10. 执行第三个接口回调InstantiationAwareBeanPostProcessor#postProcessProperties()方法!

    • 他的执行时机是,实例化之后,属性填充检查之后,属性填充之前!它会返回一个属性,后续的属性填充会使用这个方法返回的值!我们可以在这个方法里面修改对应Bean的注入的值!
  11. 填充属性到对象!

  12. 调用第四个回调接口BeanNameAware#setBeanName()方法!

    • 调用时机:属性填充给完毕后,调用初始化方法之前;它的功能是能获取bean的Name!
  13. 调用第五个回调接口BeanClassLoaderAware#setBeanClassLoader()

    • 调用时机:BeanNameAware之后,他的功能是传入bean的类加载器;
  14. 调用第六个回调接口BeanFactoryAware#setBeanFactory()!

    • 调用时机:BeanClassLoaderAware之后,用于设置beanFactory!
  15. 调用第七个回调接口BeanPostProcessor#postProcessBeforeInitialization()方法

    • 调用时机是部分Aware之后,初始化方法之前!传入当前实例化好的对象和beanName,再初始化前做修改!
  16. 回调第八个比较重要的生命周期的初始化方法,它可以是一个InitializingBean接口的bean,也可以是xml中配置的类,也可以是被加了@PostConstruct注解的方法!

    • 该方法内部逻辑可以用户自己编写,调用时机为:实例化完成之后调用!
  17. 回调第九个回调接口 BeanPostProcessor#postProcessAfterInitialization()方法!

    • 该方法的调用时机为初始化方法执行之后,这里也是Bean实例化后的最后一步,也是SpringAop实现的重要的一步!
  18. 注册销毁方法,以便Spring容器销毁的时候进行方法的销毁!

整体的方法流程示例图如下:

四、对应源码结构图

写在最后

很多人感叹“学习无用”,实际上之所以产生无用论,是因为自己想要的与自己所学的匹配不上,这也就意味着自己学得远远不够。无论是学习还是工作,都应该有主动性,所以如果拥有大厂梦,那么就要自己努力去实现它。

以上学习资料均免费放送,最后祝愿各位身体健康,顺利拿到心仪的offer!

由于文章的篇幅有限,所以这次的蚂蚁金服和京东面试题答案整理在了PDF文档里

资料获取方式:点赞+评论我的文章,关注我,然后戳这里即可免费领取

蚂蚁、京东Java岗4面:原理+索引+底层+分布式+优化等,已拿offer

蚂蚁、京东Java岗4面:原理+索引+底层+分布式+优化等,已拿offer

蚂蚁、京东Java岗4面:原理+索引+底层+分布式+优化等,已拿offer

g-KzPIaMyU-1625832408977)]

[外链图片转存中…(img-Ch5Eib0y-1625832408979)]

[外链图片转存中…(img-O5793sl8-1625832408980)]

农民工看完都会了!java线程池面试问题(代码片段)

正文模块(Module)、组件(Component)、包(Package),这些概念对于我们技术同学并不陌生,但并不是所有人都能理解其要义。深入理解之后,我才发现,其背后的深意是分类思维。而这种分... 查看详情

深度解析:如何替换掉代码中的ifelse,我女朋友看完都会了!(代码片段)

平时我们在写代码时,需要针对不同情况处理不同的业务逻辑,用得最多的就是if和else。但是如果情况太多,就会出现一大堆的“ifelse”,这就是为什么很多遗留系统中,一个函数可能出现上千行的代码。当然你说可以通过抽取... 查看详情

深度解析:如何替换掉代码中的ifelse,我女朋友看完都会了!(代码片段)

平时我们在写代码时,需要针对不同情况处理不同的业务逻辑,用得最多的就是if和else。但是如果情况太多,就会出现一大堆的“ifelse”,这就是为什么很多遗留系统中,一个函数可能出现上千行的代码。当然你说可以通过抽取... 查看详情

小白看完都学会了!java在线考试系统自动批改

分布式系统特性与衡量标准透明性:使用分布式系统的用户并不关心系统是怎么实现的,也不关心读到的数据来自哪个节点,对用户而言,分布式系统的最高境界是用户根本感知不到这是一个分布式系统可扩展性&... 查看详情

javasocket编程--聊天小案例

  很久以前写过socket聊天室,都快忘完了,心血来潮又重新写一遍。服务器端:packagecom.fancy;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.io.OutputStream;imp 查看详情

retrofit简单使用(小白都会了)(代码片段)

文章目录【1】Retrofit简单使用1.1目的1.2关于API1.3Retrofit的使用1.3.1配置客户端的API接口`WeatherService`1.3.2简单封装一下获取retrofit实例和Service的工具类(单例设计模式)1.3.3写一个javabean接收返回的json数据1.4实现效果&#x... 查看详情

大一女生废话编程爆火!懂不懂编程的看完都拴q了

导读:“中国计算机界没她不行!”作者:杨净丰色来源:量子位(ID:QbitAI)她的日更作业,竟让网友直呼:中国计算机界的神!短短两个星期的时间里,这个女大学生实力吸引了40万&... 查看详情

农民工看完都学会了!学java软件编程

人生转折点去年的时候,几个玩的好的老同学就聊了起来,其中有个考上了西安财大,读了新闻系,毕业后干了不久就想做了,原因很现实,既感觉不到前途,也感受不到任何钱途,索性就去报了... 查看详情

农民工看完都学会了!学java软件编程

人生转折点去年的时候,几个玩的好的老同学就聊了起来,其中有个考上了西安财大,读了新闻系,毕业后干了不久就想做了,原因很现实,既感觉不到前途,也感受不到任何钱途,索性就去报了... 查看详情

2021腾讯java面试题精选,90%的人看完都说好

线程线程的启动实现Runnab1e接口继承Thread类实现Callable接口线程的状态线程的方法线程的优先级守护线程未捕获异常处理器并发编程的问题线程引入开销:上下文切换与内存同步线程安全性(原子性+可见性)死锁线... 查看详情

农民工看完都学会了!学java软件编程

人生转折点去年的时候,几个玩的好的老同学就聊了起来,其中有个考上了西安财大,读了新闻系,毕业后干了不久就想做了,原因很现实,既感觉不到前途,也感受不到任何钱途,索性就去报了... 查看详情

农民工看完都学会了!java二维字符串数组初始化

学习内容大致内容:1、架构师筑基(Linux基础与进阶+Netty框架+Mysql+并发编程+JVM性能调优+Tomcat)2、开源框架(主要涉及SSM框架)3、高性能架构(Mysql高性能存储实战+Redis缓存数据库+Zoo... 查看详情

一个牛逼项目的上线过程,看完都是眼泪!

一个牛逼项目的上线过程,看完都是眼泪!2016-11-2919:27摘自:http://www.sohu.com/a/120218616_467819▽客户需求:造一条船,能过河就好▽产品经理:我们可以提供这样的方案▽首席架构师:按照需求规划蓝图▽高级研发经理:进行项目... 查看详情

大一女生废话编程爆火!懂不懂编程的看完都拴q了

杨净丰色发自凹非寺量子位|公众号QbitAI她的日更作业,竟让网友直呼:中国计算机界的神!短短两个星期的时间里,这个女大学生实力吸引了40万+粉丝,超260万的点赞。而平日里底下的评论画风都是这样&#x... 查看详情

关于java开发的面试经验总结,90%的人看完都说好

工厂方法模式Spring框架使用工厂模式来实现Spring容器的BeanFactory和ApplicationContext接口。Spring容器基于工厂模式为Spring应用程序创建bean,并管理着每一个bean的生命周期。BeanFactory和ApplicationContext是工厂接口,并且在Spring中... 查看详情

javasocket编程实现群聊(超详细)(代码片段)

Javasocket编程实现群聊最终效果文末有完整代码,创作不易,点个赞再走吧~客户端之间的交流有人退出群聊时,减少在线人数实现流程1、项目结构即原理分析功能实现多客户之间聊天实时统计在线人数图形化界面创建... 查看详情

农民工看完都学会了!java中间件开发

初识多线程介绍进程回到线程进程与线程并行与并发Javs实现多线程Java实现多线程需要注意的细节Thread线程类API设置线程名守护线程优先级线程线程生命周期使用多线程需要注意的问题线程安全问题性能问题安全发布对象简述解... 查看详情

数据结构和算法学编程必知必会的50个代码实现,你都会了吗?

❤️数组实现一个支持动态扩容的数组实现一个大小固定的有序数组,支持动态增删改操作实现两个有序数组合并为一个有序数组🧡链表实现单链表、循环链表、双向链表,支持增删操作实现单链表反转实现两个有... 查看详情