从实力的角度出发来思考这道AOP题目
文/楠木大叔
技术更迭,一往无前。技术人总是要不断学习以适应社会的发展和行业对我们的要求。每隔一段时间,就会有纷至沓来的新技术,新知识,新概念,我们应该如何应对,是被逼到墙角,还是主动出击?
导读
- 从一道小题说起
- 空杯心态
- 不下水,就学不会游泳
- 漫无目的的学习纯属浪费时间
- 没有深度思考的学习就是自嗨
- 只输入不输出的学习就是耍流氓
- 天下武功,为快不破
- 万物即可为题
- 结语
- 参考
人之为学有难易乎?学之,则难者亦易矣;不学,则易者亦难矣。——《为学》
从一道小题说起
作为一个技术出身的码农,我总是对小镇做题家是嗤之以鼻的。然而,经历多年的学习和工作洗礼之后,我似乎又从小镇做题家身上看到一些不一样的东西,那就是做题是一种相对靠谱的学习方式。特别是近年来,在新技术的学习上,我逐渐开始认可和实践这种方式。各位客官先不要反驳,请听我慢慢道来。
笔者在学习SpringAOP的时候,非常认真的地研读过《Spring实战》一书中关于AOP相关知识点,也参阅过相关技术博客文章并在实践中有过应用,相关文章可查阅笔者文章:
自认为已经能够基本理解AOP的概念和应用场景,但是直到遇到这道题,笔者才发现自己对Spring AOP的理解其实依然浮于表面。
尽管类似的例子在《Spring实战》这本书上有涉及,如下
但是在大多数的技术博文中亦或是整理的面试考点中,基本都是摘抄书本术语和总结一些概念居多(当然能够沉下心来去读懂源码的同学请绕行)。这就会给新手们一种错觉,AOP思想不过如此。
AOP的相关术语
- jointpoint(连接点):是指那些被拦截到的点。在spring中是指方法,因为spring只支持方法类型的连接点。
- pointcut(切入点):对哪些joinpoint进行拦截
- advice(通知/增强):拦截到的jionpoint所做的事情。方法层面的。
- 前置通知
- 后置通知
- 异常通知(抛出异常)
- 最终通知(无论如何都执行)
- 环绕通知(方法执行的前后都通知,甚至可以阻止目标方法执行)
- introduction(引介):特殊的通知,类层面的。
- target(目标对象):代理的目标对象
- weaving(织入):把增强应用到目标对象来创建新的代理对象的过程
- proxy(代理):被AOP织入增强后产生的结果代理类
- aspect(切面):切入点+通知的结合
- advisor:一般的切面,advice本身就是一个切面,对目标类所有方法进行拦截
- PointcutAdvisor:代表具有切点的切面,可以指定拦截目标类哪些方法
- IntroductionAdvisor:引介切面
短短总结,其实涉及了众多知识点,如果没有仔细品读和思考,恐怕是很难吃透的。所以,笔者反思,平时阅读和学习新知识的一些问题,很多时候容易大而化之,停留表面——毕竟技术书籍不像小说,可以快速阅读完。有时候自认为理解了,实则不然。知识点其实需要一个载体来承载,比如一个实际应用实战,或者一道理论题目。否则就是纸上谈兵,无法落地。技术的学习本身是理论和实践结合的。所以,要想多快好省的学习,笔者推荐通过理论学习,并结合做一些实战性强的题目。这样的目的如下:
- 快速熟悉各种应用场景
- 检验理论知识
- 聚焦
空杯心态
你就像这只杯子一样,里面装满了自己的看法和成见。如果你不先把杯子空掉,叫我如何对你说禅呢?
南隐是一位禅师。一天,一位学者来向他问禅,但自己喋喋不休。南隐则默默无语,以茶相待。他将茶水注入这位客人的杯子,满了也不停下来,而是继续往里面倒,眼睁睁看着茶水不停地溢出杯外。客人着急地说:“已经满出来了,不要再倒了!”
南隐说:“你就像这只杯子一样,里面装满了自己的看法和成见。如果你不先把杯子空掉,叫我如何对你说禅呢?”。
"空杯心态"是我最近几年比较爱提及的一个词,学习新知识,对新手来说,是没有思想包袱的,但是对于老鸟,建议空杯心态,否则容易沉迷过去的知识体系,走弯路。
不下水,就学不会游泳
绝大多数的人,面对陌生事物,往往会怀有畏惧感。
我没有接触过PS,那么如果让我去设计一个海报,就会心生畏惧。我没有用过Java,让我去写Java的项目,我总是处于观看而不敢亲自下去写...
过去的数年中,笔者长时间从事C#项目研发,但是最近两年由于工作项目的需要,需要学习Python,Java等语言。这里以学习Java为例。
笔者学习Java真的是一波三折,不敢说自己有多大期望,就是希望能够做一个小小的网站。第一次想学Java,大概是16~17年左右,因为没有人指导,必然是要走弯路的,在windows上从搭建环境到跑起来第一个spring web的hello,world,足足花了一周多的时间。有兴趣的朋友可以去看那篇纪实文章
出师不利,被Spring的各种配置虐的一无是处。然后更多的是看书,再加上没有在实战中应用的需求,基本放弃使用。几年后,无独有偶,遇见另外一个技术还不错的同事,他也刚好有这段经历,不过他当年他坚持了一周都没有把Spring跑起来,令人唏嘘。
去年,因为工作原因又开始使用Java,此时Springboot已经大行其道。便又开始投入Sprigboot的学习中,没话说,Springboot的确是大大降低了学习门槛。有了实际应用场景,加上工作的方面的推进,这一次真正开始上手了,基本熟悉了整个项目搭建和开发流程,总算能够独立完成一个网站的开发和部署。
面对一个陌生领域,大部分人总是会有畏难心理,左顾右盼,甚至无从下手。这个时候,你只需要考虑是否有学的价值,如果有,那么就毫不犹豫的先干起来,否则,从心态上你就会选择躺平。
漫无目的的学习纯属浪费时间
漫无目标,无书不读的人,他们的知识是很难精湛的。
"好读书,不求甚解",这也许是陶渊明先生的自谦的说法。普通人,特别是技术人真不要仿效。技术工作及其严谨,差之毫厘,谬以千里。学习上来不得半点马虎。
我很钦佩热爱学习的人,他们博览群书,对新技术总是第一批尝鲜的人。但是也有另一种,喜欢读书,但是很盲目和无目的。
我有一个很爱学习的同事,在公司,中午就会看书,下班回到家也看,公司组织团建出去也看。但是我最近留意了一下,半月过去,我发现他的阅读进展并不是很快,依然还停留在半个月前的那个章节。很多企业都会组织读书会,就是大家建一个群,组织有兴趣的同事一起读书,群里相互监督,固定时间打卡。笔者曾经供职的一家公司,老总亲自搞了一个52读书班,什么意思呢?就是每个人一年要读52本书,平均下来就是一周一本书。最后完成目标的人会授予奖章,当然是有人完成的。所以,从这个角度来看,我这个同事读书效率是极低的。甚至这种不连续性还会带来兴趣的热度的下降,最终半途而废。
如果您确实有充足的闲散时间,那么您随心的读书总比刷手机娱乐八卦强。但如果您是真正想学习的人,特别是学习新技术。因为这种学习的结果只有会和不会,对于技术人来说半瓶水和小白没有没有本质区别。
艾宾浩斯遗忘曲线表明,遗忘在学习之后立即开始,最初的遗忘速度很快,随着时间的推移,遗忘的速度逐渐下降,达到一定速度后就不再遗忘。
所以,当你决定要学习的时候,一定要给自己有个规划,要有里程碑,要有截止日期。一定要保持学习的连续性和连贯性。
没有深度思考的学习纯属自嗨
学而不思则罔,思而不学则殆。
学习的渠道和资源从未如此丰富。记得多年以前,我们在各大技术群里提问总会有人帮你解答,但不知从什么时候开始,"不懂就问百度"成了一种神回复。
你想学什么技术,网络上总能找到相关学习资源。但是,伴随而来的可能是更多参差不齐的搜索结果。新手无法辨别搜索结果的信度,走点弯路还好,但是时间却实实在在浪费了。
所以,在学习新知识的时候,官网和原著优先。合理利用网络资源和相关辅助教程,技术博客等。同时切记随大流,尽信书不如无书。
对于一些较为晦涩的技术知识点,你就算阅读一百遍也不一定能够理解,只有从场景的角度出发去深度思考,才能理解和吃透。
在没有深度思考之前你会觉得的自己无所不能,在深度思考之后,你会觉得自己只是勉强入门。
不以输出为目的的学习都是耍流氓
学习,是指通过阅读、听讲、思考、研究、实践等途径获得知识和技能的过程。
没有结果的学习本身就没有意义,在终身学习的时代,在技术知识发展日新月异的时代,很多知识和技能一样是有生命周期的。你今天学习了某个新知识,获得了一项新技能,3~5年之后,这项技能可能在行业里面已经没有用武之地了。
学习是一个过程,需要投入人力,物力,时间和金钱,一切没有结果的学习都是毫无意义的。那我们如何来分辨我们是否是真的努力呢?答案就是——输出,输出,大量的输出,用作品说话。你总不能说我学会了,但就是做不出来吧!这不就是耍流氓吗?
一鼓作气,趁热打铁
若有恒,何必三更眠五更起;最无益,莫过一日曝十日寒。
除了少数天才,学习新知识本来就不是一件快乐的事情。懒惰,拖延是人的本性,能够长期坚持学习的绝非常人。所以当我们开始要学一个知识或新技能的时候,不管是外部还是内部的驱动,一定会有"三分钟热度"。
比如,人工智能时代已经来临,行业压力让你觉得不学习就有失业风险。所以,你想学习Python来适应时代的发展。你买了教材,甚至还订阅了相关的在线视频课程。
刚开始,你全身都是劲儿,教材,安装开发环境,甚至还订阅了相关的在线视频课程,忙得不亦说乎。这种热度一般不会太持久,除非你的领导要求你学习,并在工作中使用。否则,没人能保证这个热度是否能够坚持到周五。
笔者的建议,要充分利用这个三分钟热度,快速把构建项目并跑起来,做一个能够有一定价值的demo,持续交互。比如,一个爬虫,一个可以用在工作中的自动化工具等。
一方面趁热打铁,一方面有成就感,同时也输出了。
万物即可为题
前面笔者提到,知识点其实需要一个载体来承载,比如一个实际应用实战,或者一道理论题目。否则就是纸上谈兵,无法落地。
过去在高校,我们学习都会有考试题目,那些题目更加理论化,属于"背多分"类型。但是进入工作岗位,特别是技术工作岗位,这就行不通了。因为技术工作不仅要强调过程,还要强调结果,只有过程和结果都对才是完成。
一直以来,前辈们都在强调动手实践的重要性,但是往往忽略了新手们并没有代入感。举个例子,所有人都明白学好英语的方式就是多说口语。但是实际上大多数都是“哑巴式英语”,道理都懂,语法倍儿棒,就是没法落地。
所以,题目一定是理论和实践相结合的,一定是符合实际应用场景的。这样的题目,才具有代入感,否则就是为学而学。
选择性的刷一些高质量的技术题目,绝对是提升认知的,并且事半工倍。
结语
以上只是笔者个人对学习技术的一点看法和思考,一家之言,姑妄言之姑妄听之。欢迎大家共同探讨和文明交流。
参考
- 《Spring实战(第4版)》
- Windows上如何搭建Java开发环境?
- 细说AOP(面向切面编程)
从实力的角度出发来思考这道AOP题目的更多相关文章
- 与焊接厂交流——从生产角度出发的PCB设计心得
上周的时候,去了趟加工厂盯电路板的焊接进度.然后在闲余的时候,跟焊接厂的工程师交流了一下,工程师从生产的角度,说了几个值得注意的事项: 1.元件的焊盘应该要窄长,不能过宽.因为,在过机表贴时,焊盘上的 ...
- 毕大从自身设计HSF的角度出发谈服务化这回事
服务化的过去.现在和未来 原创: bluedavy HelloJava 9月18日 服务化毫无疑问是技术圈一直火热的buzzword,而且其实已经非常多年了,这在日益更新的技术圈还挺神奇的,作为在服 ...
- [html] 前端角度出发做好SEO需要考虑什么
Meta标签优化 主要包括主题(Title),网站描述(Description),和关键词(Keywords).还有一些其它的隐藏文字比如Author(作者),Category(目录),Languag ...
- 从前端角度出发有哪些注意事项有利于SEO?
1.提高页面加载速度. 能用css解决的不用背景图片,背景图片也尽量压缩大小,可以几个icons放在一个图片上,使用background-position找到需要的图片位置.可以减少HTTP请求数,提 ...
- 分享一道我认为非常有思考价值JavaScript题目
这是一道综合性的题目,如果你能快速清晰的分析整理出来,那我相信你对JavaScript是有一定的理解的了.我会先将题目的图片截取出来,供大家思考,在结尾在给出我的分析过程和答案,作个总结. 好,废话不 ...
- 李洪强iOS经典面试题142-第三方框架及其管理
李洪强iOS经典面试题142-第三方框架及其管理 第三方框架及其管理 使用过CocoaPods吗?它是什么?CocoaPods的原理? CocoaPod是一个第三方库的管理工具,用来管理项目中的第 ...
- 广州APP开发外包公司哪家比较好?广州达到信息技术有限公司技术到底怎么样?
广州APP开发公司哪家比较好,广州手机APP软件开发公司广州达到信息表示:用户的刚性需求是公司使用手机APP软件盈利的根本前提和基础,所以开发一款手机APP应用时必须从客户的角度来思考.因此公 ...
- API Design
REST API Design Guidelines V 1.0.201208 Draft 5 Last Updated: 08/31/2012 1 简介 本文档旨在规范REST API的 ...
- caffe2 教程入门(python版)
学习思路 1.先看官方文档,学习如何使用python调用caffe2包,包括 Basics of Caffe2 - Workspaces, Operators, and Nets Toy Regres ...
随机推荐
- Python中Scapy网络嗅探模块的使用
目录 Scapy scapy的安装和使用 发包 发包和收包 抓包 将抓取到的数据包保存 查看抓取到的数据包 格式化输出 过滤抓包 Scapy scapy是python中一个可用于网络嗅探的非常强大的第 ...
- MySQL的Double Write并不难理解
目录 问题引入- 断电了 不一会 - 来电了 Double write工作流程 恢复的过程 配置参数 疑问 推荐阅读 问题引入- 断电了 今天为大家介绍一个新的名词:double write. 相信你 ...
- LeetCode---84. 柱状图中最大的矩形(hard)
题目:84. 柱状图中最大的矩形 给定 n 个非负整数,用来表示柱状图中各个柱子的高度.每个柱子彼此相邻,且宽度为 1 . 求在该柱状图中,能够勾勒出来的矩形的最大面积. 示例: 输入: [2,1,5 ...
- IDEA安装插件时搜索不到,一直在转圈刷新,无法安装
方法一:更换一个网络(我自己没有测试过) 参考链接:https://blog.csdn.net/m0_37856386/article/details/110389028 方法二:打开settings ...
- 将项目连接到远程仓库git
方式一: git clone "git中的项目地址",此时会生成一个新的项目2.该步骤用于生成一个本地仓库 将需要提交的所有文件除了node_module.git以及输出文件dis ...
- OCR-Form-Tools项目试玩记录(一)本地部署
OCR-Form-Tools是微软的一个开源代码库,包含微软表单识别和OCR服务相关的多种工具.Github仓库地址 目前,表单标注工具(OCR Form Labeling Tool)是首个发布到本该 ...
- 拿到列表的长度len(列表名)
拿到列表的长度len(列表名),即元素个数 列表要放在括号里面
- java集合-链表LinkedList
1.简介 LinkedList 底层使用的是 双向链表的数据结构 2.类图(JDK 1.8) 下图是LinkedList实现的接口和继承的类关系图: public class LinkedList&l ...
- 技能Get·BOM头是什么?
阅文时长 | 0.26分钟 字数统计 | 472.8字符 主要内容 | 1.引言&背景 2.BOM头是什么? 3.如何创建或取消BOM头? 4.如何判断文件是否包含BOM头? 5.声明与参考资 ...
- 【zombie】如何查看并杀死僵尸进程?
[zombie]如何查看并杀死僵尸进程? 赏金Micheal关注 2019.03.31 19:40:15字数 1,016阅读 4,373 僵尸进程定义 In UNIX System terminolo ...