当前位置: 首页 > 后端技术 > Java

Spring源码学习

时间:2023-04-01 13:34:01 Java

之前在网上看过Spring源码,但是对于我来说,即使有流程图例子,即使看过Spring秘籍,源码对我来说还是一头雾水.在github上找了个小项目-spring,个人觉得结合源码看还是很不错的。BeanFactory和BeanDefinition是IOC中最重要的两个角色,Spring从如何处理对象之间的依赖关系的角度来揭示Spring框架。事实上,无论你从哪个角度去观察或深入这个框架,你都会发现职责分离的威力需要从这一步开始仔细体会。如果没有UML图,你很快就会忘记方法是按照功能放在不同的地方的,这样理解起来可能会更清楚。从源码可以看出,抽象类不仅承担了一部分真正的功能实现,而且是抽象层次分离的重要一步。如果定义了defined构造方法,那么在创建类的实例对象时必须调用构造方法。由于容器在创建instance实例对象时使用了动态代理,自然有两种选择。JDK动态代理cglib字节码这里使用的是strategy模式。它是如何体现的?一般来说,需要有一个策略接口,然后由不同的类来实现不同的策略。同时,策略的holder,也就是应用上下文https://www.liaoxuefeng.com/w...这个链接中的create(Stringname,BeanDefinition)方法更合理持有策略接口,默认是进一步完善字节码代理——创建Bean实例时带构造参数进一步完善——创建Bean实例时,参数的属性填充Resource和ResourceLoader介入容器启动机制(Processor)和应用上下文(Context)Bean实例的初始化方法和销毁方法归纳容器(Aware)单例模式/原型模式和FactoryBean监听器(容器关闭和刷新???)Spring容器在Spring中的应用第一个场景侦听器关联的是容器的刷新和关闭。监听器其实是观察者设计模式最常见的应用。我们知道Spring的职责分离的设计导致UML图复杂(有点吐槽,脑子里真的记不起来了,可能我用的不多),应该记得吧,不然面试的时候project不行,技术学习不够底层,跟其他面试官聊什么,怎么赚小钱毕竟Event,Listener,Multicaster,Publisher这四个重要Spring监听器的一部分,而EventObject是jdk中提供的一个接口。event的翻译是event,但是我觉得理解为notification更合理。廖雪峰老师在讲观察者模式时举了一个例子。理解后转载如下//A关注商品是否涨价classListenerAimplementsListener{//不写onEvent(evnete)的目的是展示演化过程publicvoidonPublish(productproduct){//StringnameSystem.out.printf(name+"涨价了");}}//B想卖涨价后的商品类ListenerB实现Listener{publicvoidonPublish(Productproduct){//StringpriceSystem.out.printf("Sellatthepriceof"+price+"");}}//Observer,这里使用ObserverablepublicclassObserverable{privateStringname;私有字符串价格;privateSetlisteners=newLinkedList<>();publicvoidaddListener(Listenerlistener){listeners.add(listener);}publicObserverable(Stringname,Stringprice){this.name=name;这个.price=价格;}publicvoidchangePrice(字符串价格){this.price=price;//新建一个类,可以封装要通知的信息Productproduct=newProduct(price,name);listener.forEach(a-a.onPublish(产品));}}从上面的例子可以看出,其实无非就是把关注事件的信息和监听器需要的信息结合起来把信息封装成一个类,这是我之前不理解的。我们继续说Spring。上面说了Event和Listener,那什么是Multicaster呢?Broadcaster,我的理解是由于Spring的抽象层次,observer中的notification分为面向对象的两种,一种是Multicaster接口(notification,提取了部分功能),另一种是publisher(也就是传统意义上的上面的代码例子中,发布(changePrice)和通知(forEach)是在一起的,可能Spring的设计者也觉得这样的设计太不对了,所以面向对象的思想又发散了。(不)最后还是要牺牲一下UML图。如果这就足够了,我想我还没有说清楚。我删除了AbstractApplicationMulticaster的文件,重写了这个类下的方法,除了addListener和removeListener这些明显的方法之外,这个抽象类下还有一个方法,就是getSupportListener(Eventeventvnt)。这里的功能实现是找到匹配Event的监听器。设计者使用反射来匹配事件需要的监听器。感觉描述的不是很清楚,贴一段源码给大家typeactualTypeArgument=((ParameterizedType)genericInterface).getActualTypeArguments()[0];StringclassName=actualTypeArgument.getTypeName();//中的代码中间部分省略returneventClass.isAssignableFrom(event.getClass());不得不说,反射真的是一个非常强大的功能。Aop的实现越难,反复思考和实践就越重要。付哥的文章很好。但是对于基础知识薄弱的同学来说,在了解一些概念之前,即使知道Spring为了保证框架的可扩展性做了很多控诉分离的工作,但还是有一种通透感。我们先来看Aop。CitizenJoinPoint切点PointCut就是根据这个来确定切点的。Advice针对切入点的逻辑方面。多点切入和逻辑封装Wave和weaver可能是类加载器完成类的动态修改,也可能是其他的以上是逻辑概念,具体实现因环境而异(感觉像做梦回到数据结构和算法)文章会持续更新...参考博客https://github.com/fuzhengwei...《Spring揭秘》