2021年很快的過去了,這一年發生了一些不少的事情,也明白了一些事情。
2021年工作方面檢視了一些架構的源碼,包括spring、springmvc、springcloud、netty、mybatis、shiro、xxl-job 等架構源碼,了解程度80%吧。 通過閱讀源碼,大緻了解到每個架構的設計原則以及基于spring擴充元件的大體思路-在對象後置處理器或者對象工廠後置處理器做一些操作,動态的向容器注冊一些bean。
spring 核心的ioc、aop 等源碼,也包括對象的生命周期。 ioc的開始是在對象工廠的refresh 方法,對于springboot 項目,預設的對象工廠是org.springframework.context.annotation.AnnotationConfigApplicationContext , 在啟動過程中調用refresh 會調用到父類org.springframework.context.support.AbstractApplicationContext#refresh 開始其IOC的過程。 refresh 方法中finishBeanFactoryInitialization 會調用getBean生成所有非lazy 的單例對象,也就是對象的生命周期開始進行。其中IOC 重要的一步是生成BeanDefinition 對象,然後最後周遊BeanDefinition 對象,生成bean緩存到map 中。 AOP實際是在對象的後置處理器判斷是否有适用的AOP MethodInteceptor(org.aopalliance.intercept.MethodInterceptor), 如果有則生成代理對象,代理對象需要維護一個org.springframework.aop.framework.CglibAopProxy.DynamicAdvisedInterceptor, 以這裡為入口進行AOP。其實對于AspectJ 文法的AOP, 也是走的Spring 的AOP機制(基于MethodIntecepor、Pointcut、PointcutAdvisor),隻不過是封裝成AspectJ 特有的相關Bean, 參考: org.springframework.aop.aspectj.AspectJExpressionPointcut。
其他像SpringMVC、OpenFeign、Shiro、xxl-job 等都是利用Spring 的可擴充性進行操作,都是在對象後置處理器或者對象工廠後置處理器,攔截帶有指定注解的Bean, 生成代理對象注入到容器中,代理對象中做相關的業務邏輯。
2021年生活方面報了一個教育訓練班,很感謝教育訓練班的每一位同學對自己的肯定,和他們在一起學習真的沒有任何壓力,仿佛回到大學時期。接下來,自己也會定期複習自己在教育訓練班學習的内容。
2022 年自己還有好多要學的,主要是kafka、rocketmq、k8s 三大塊的學習任務。剩下就是再多學習一些Java 之外的go語言之類的。
【當你用心寫完每一篇部落格之後,你會發現它比你用代碼實作功能更有成就感!】