`
DoubleEO
  • 浏览: 158191 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

spring in action学习笔记 1 (许多自己的理解,欢迎拍砖)

阅读更多
1.我所知道的aop
    初看aop,上来就是一大堆术语,而且还有个拉风的名字,面向切面编程,都说是OOP的一种有益补充等等。一下子让你不知所措,心想着:怪不得很多人都和我说aop多难多难。当我看进去以后,我才发现:它就是一些java基础上的朴实无华的应用,包括ioc,包括许许多多这样的名词,都是万变不离其宗而已。
2.为什么用aop
    1就是为了方便,看一个国外很有名的大师说,编程的人都是“懒人”,因为他把自己做的事情都让程序做了。用了aop能让你少写很多代码,这点就够充分了吧
    2就是为了更清晰的逻辑,可以让你的业务逻辑去关注自己本身的业务,而不去想一些其他的事情,这些其他的事情包括:安全,事物,日志等。
    3.那些aop的术语
    初看这么多术语,一下子都不好接受,慢慢来,很快就会搞懂。
    1.通知(Advice)
    就是你想要的功能,也就是上面说的 安全,事物,日志等。你给先定义好把,然后在想用的地方用一下。
    2.连接点(JoinPoint)
    这个更好解释了,就是spring允许你使用通知的地方,那可真就多了,基本每个方法的前,后(两者都有也行),或抛出异常时都可以是连接点,spring只支持方法连接点.其他如aspectJ还可以让你在构造器或属性注入时都行,不过那不是咱关注的,只要记住,和方法有关的前前后后(抛出异常),都是连接点。
    3.切入点(Pointcut)
    上面说的连接点的基础上,来定义切入点,你的一个类里,有15个方法,那就有几十个连接点了对把,但是你并不想在所有方法附近都使用通知(使用叫织入,以后再说),你只想让其中的几个,在调用这几个方法之前,之后或者抛出异常时干点什么,那么就用切点来定义这几个方法,让切点来筛选连接点,选中那几个你想要的方法。
    4.切面(Aspect)
    切面是通知和切入点的结合。现在发现了吧,没连接点什么事情,连接点就是为了让你好理解切点,搞出来的,明白这个概念就行了。通知说明了干什么和什么时候干(什么时候通过方法名中的before,after,around等就能知道),而切入点说明了在哪干(指定到底是哪个方法),这就是一个完整的切面定义。
    5.引入(introduction)
    允许我们向现有的类添加新方法属性。这不就是把切面(也就是新方法属性:通知定义的)用到目标类中吗
    6.目标(target)
    引入中所提到的目标类,也就是要被通知的对象,也就是真正的业务逻辑,他可以在毫不知情的情况下,被咱们织入切面。而自己专注于业务本身的逻辑。
    7.代理(proxy)
    怎么实现整套aop机制的,都是通过代理,这个一会给细说。
    8.织入(weaving)
    把切面应用到目标对象来创建新的代理对象的过程。有3种方式,spring采用的是运行时,为什么是运行时,后面解释。
关键就是:切点定义了哪些连接点会得到通知

   4.我所理解的aop原理

    spring用代理类包裹切面,把他们织入到Spring管理的bean中。也就是说代理类伪装成目标类,它会截取对目标类中方法的调用,让调用者对目标类的调用都先变成调用伪装类,伪装类中就先执行了切面,再把调用转发给真正的目标bean。
    现在可以自己想一想,怎么搞出来这个伪装类,才不会被调用者发现(过JVM的检查,JAVA是强类型检查,哪里都要检查类型)。
    1.实现和目标类相同的接口,我也实现和你一样的接口,反正上层都是接口级别的调用,这样我就伪装成了和目标类一样的类(实现了同一接口,咱是兄弟了),也就逃过了类型检查,到java运行期的时候,利用多态的后期绑定(所以spring采用运行时),伪装类(代理类)就变成了接口的真正实现,而他里面包裹了真实的那个目标类,最后实现具体功能的还是目标类,只不过伪装类在之前干了点事情(写日志,安全检查,事物等)。
    这就好比,一个人让你办件事,每次这个时候,你弟弟就会先出来,当然他分不出来了,以为是你,你这个弟弟虽然办不了这事,但是他知道你能办,所以就答应下来了,并且收了点礼物(写日志),收完礼物了,给把事给人家办了啊,所以你弟弟又找你这个哥哥来了,最后把这是办了的还是你自己。但是你自己并不知道你弟弟已经收礼物了,你只是专心把这件事情做好。
   
    顺着这个思路想,要是本身这个类就没实现一个接口呢,你怎么伪装我,我就压根没有机会让你搞出这个双胞胎的弟弟,那么就用第2种代理方式,创建一个目标类的子类,生个儿子,让儿子伪装我

    2.生成子类调用,这次用子类来做为伪装类,当然这样也能逃过JVM的强类型检查,我继承的吗,当然查不出来了,子类重写了目标类的所有方法,当然在这些重写的方法中,不仅实现了目标类的功能,还在这些功能之前,实现了一些其他的(写日志,安全检查,事物等)。
   这次的对比就是,儿子先从爸爸那把本事都学会了,所有人都找儿子办事情,但是儿子每次办和爸爸同样的事之前,都要收点小礼物(写日志),然后才去办真正的事。当然爸爸是不知道儿子这么干的了。 这里就有件事情要说,某些本事是爸爸独有的(final的),儿子学不了,学不了就办不了这件事,办不了这个事情,自然就不能收人家礼了。

   前一种兄弟模式,spring会使用JDK的java.lang.reflect.Proxy类,它允许Spring动态生成一个新类来实现必要的接口,织入通知,并且把对这些接口的任何调用都转发到目标类。

    后一种父子模式,spring使用CGLIB库生成目标类的一个子类,在创建这个子类的时候,spring织入通知,并且把对这个子类的调用委托到目标类。
    相比之下,还是兄弟模式好些,他能更好的实现松耦合,尤其在今天都高喊着面向接口编程的情况下,父子模式只是在没有实现接口的时候,也能织入通知,应当做一种例外。

初学aop对aop术语和原理上的一些总结
分享到:
评论
19 楼 tangbo530 2009-02-12  
advice还不如说装备
18 楼 lianj_lee 2009-02-08  
楼猪,你写的相当的棒。通俗易懂。

湿了吗?想让你更湿
17 楼 h521999 2009-01-19  
讲的不错,通俗易懂!
16 楼 qq6518980 2009-01-16  
楼主讲得真好啊,看一下就理解很多了,真不错!
15 楼 DoubleEO 2009-01-15  
jcbufresh 写道
学习了,虽然对aop有所了解,但看了楼主的理解感觉跟亲切。
关于代理的理解,看到比较亲切的就是阎宏的《java与模式》和楼主的了。
很多介绍aop的书籍里充斥着大量的专业名词,书看完了已被这些名词给
弄晕了。喜欢的还是议论文的三段式,提出问题,解决问题,证明问题。
为什么会产生这种技术?因为什么问题而有了这种技术?
这种技术是怎么解决这个问题的?
这种技术和其他的技术比较,在解决这个问题时有什么优势?
最好是在讲解的时候能更通俗,更形象。
感谢楼主的分享,赞一个!


看了你对我的评价,我湿了~
14 楼 jcbufresh 2009-01-15  
学习了,虽然对aop有所了解,但看了楼主的理解感觉跟亲切。
关于代理的理解,看到比较亲切的就是阎宏的《java与模式》和楼主的了。
很多介绍aop的书籍里充斥着大量的专业名词,书看完了已被这些名词给
弄晕了。喜欢的还是议论文的三段式,提出问题,解决问题,证明问题。
为什么会产生这种技术?因为什么问题而有了这种技术?
这种技术是怎么解决这个问题的?
这种技术和其他的技术比较,在解决这个问题时有什么优势?
最好是在讲解的时候能更通俗,更形象。
感谢楼主的分享,赞一个!

13 楼 DoubleEO 2009-01-08  
cysk_zhang 写道
接口固然好,但是还是觉得所谓的父子模式功能更强大。
面向接口编程的前提是,你面对的是同属于一个大类中的类型。
如果,你甚至不能确定你需要代理哪中类型的对象,那面向接口的代理就成了鸡肋。

比如说这样一个场景,实现一个通用的拦截器,可以拦截任何类型对象的方法调用,只要该方法有某个特定的anotation来注释,在调用前打出该方法名称。面向接口的代理是无法实现的。
这种只有用楼主所说的父子模式来实现了。
cglib的动态代理可以很好的实现上面的需求。

你说的是,我也层考虑过你说的这样,我在最初的设计上,都会先去细心设计接口,我已经习惯了面向接口。
如果用别人的代码库或者根本得不到源码,那可能只能用父子模式。你的见解很好啊,学习了~
12 楼 cysk_zhang 2009-01-08  
接口固然好,但是还是觉得所谓的父子模式功能更强大。
面向接口编程的前提是,你面对的是同属于一个大类中的类型。
如果,你甚至不能确定你需要代理哪中类型的对象,那面向接口的代理就成了鸡肋。

比如说这样一个场景,实现一个通用的拦截器,可以拦截任何类型对象的方法调用,只要该方法有某个特定的anotation来注释,在调用前打出该方法名称。面向接口的代理是无法实现的。
这种只有用楼主所说的父子模式来实现了。
cglib的动态代理可以很好的实现上面的需求。
11 楼 DoubleEO 2009-01-07  
mayday85 写道
胖子 还在北京么 书借我

我都不知道你是谁~咋借你~
10 楼 mayday85 2009-01-07  
胖子 还在北京么 书借我
9 楼 philyes 2009-01-07  
不错,讲得通俗易懂,那比些精通**之类的书强多了
8 楼 leeldy 2009-01-06  
牛X的学习笔记。。。
7 楼 DoubleEO 2009-01-05  
iranger 写道
麦田守望者 写道

Advice应该叫增强吧

哥儿们你是不是看了陈的那本Spring?Advice在英文里就是通知的意思,绝对没有增强的意思,可以翻翻字典。
陈把它叫做增强是从功能上来解释的,因为一个Advice的作用是使目标类有了新的功能,就像增强了目标类一样,所以他认为叫增强更合适

我也觉得是,英文毕竟不是母语,所以叫advice就好了~陈那本大厚你读完了吗?那可这是很厚啊
6 楼 iranger 2009-01-05  
麦田守望者 写道

Advice应该叫增强吧

哥儿们你是不是看了陈的那本Spring?Advice在英文里就是通知的意思,绝对没有增强的意思,可以翻翻字典。
陈把它叫做增强是从功能上来解释的,因为一个Advice的作用是使目标类有了新的功能,就像增强了目标类一样,所以他认为叫增强更合适
5 楼 DoubleEO 2009-01-03  
麦田守望者 写道
Advice应该叫增强吧

这个翻译不同吧...你是不是看的陈雄华的那本...
4 楼 麦田守望者 2009-01-03  
Advice应该叫增强吧
3 楼 jinwenhong 2009-01-02  
太好了,我对AOP有了更深的理解。多谢!
2 楼 njuptsoz 2008-12-31  
不错!一下子多对AOP有了收获!
1 楼 newyounger 2008-12-29  

相关推荐

    Spring in Action中文清晰版(带阅读笔记).part1

    Spring in Action中文清晰版(带阅读笔记). Spring in Action中文清晰版(带阅读笔记).

    Spring in Action 中文版 第五部分(Spring in Action CN.005)

    Spring in Action CN.001<br>Spring in Action CN.002<br>Spring in Action CN.003<br>Spring in Action CN.004<br>Spring in Action CN.005<br>Spring in Action CN.006<br>Spring in Action CN.007<br>Spring in ...

    Springcloud学习笔记.md

    Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Spring...

    spring in action的jar包

    《Spring in Action》是关于Spring框架的一本经典书籍,它深入浅出地介绍了Spring的核心概念和技术。这个"spring in action的jar包"很可能是书中提到的一些必要的库文件,用于配合书中的实例代码运行。这些jar包是...

    Spring in Action 中文版 第二部分(Spring in Action CN.002)

    Spring in Action CN.001<br>Spring in Action CN.002<br>Spring in Action CN.003<br>Spring in Action CN.004<br>Spring in Action CN.005<br>Spring in Action CN.006<br>Spring in Action CN.007<br>Spring in ...

    Spring in Action 中文版 pdf

    通过阅读《Spring in Action》中文版,开发者不仅可以学习到Spring的基本用法,还能深入了解其背后的原理,从而提升自己的技术水平。配合压缩包内的`sia3-code`源码,可以进行实践操作,进一步巩固理论知识。这是一...

    Spring in Action 第四版英文原版+源码

    《Spring in Action》第四版是关于Spring框架的一本权威指南,由Manning出版社出版。这本书深入浅出地介绍了如何使用Spring框架构建强大的Java应用程序。英文原版提供了最原始的作者见解和技术细节,对于想要深入...

    spring in action 中文版6-11.zip

    通过学习《Spring in Action》中文版6-11章节,读者将能够掌握Spring框架的核心功能,理解如何在实际项目中运用Spring进行高效开发,并具备解决复杂问题的能力。同时,了解Spring生态中的其他组件如Spring Boot和...

    spring in action 第二版中文版

    《Spring in Action》第二版中文版是一本深受开发者欢迎的Spring框架入门与进阶书籍,旨在帮助读者深入理解和掌握Spring框架的核心概念和技术。这本书详细介绍了如何利用Spring进行企业级Java应用开发,包括依赖注入...

    Spring in Action, 6th Edition, PDF 格式

    Spring in Action, Sixth Edition is a comprehensive guide to Spring’s core features, all explained in Craig Walls’ famously clear style. You’ll put Spring into action as you build a complete ...

    Spring in action 2nd

    ### Spring in Action 第二版 —— 详尽解析与学习指南 #### 一、书籍概述 《Spring in Action》第二版是一本深受开发者喜爱的技术书籍,由Craig Walls和Ryan Breidenbach共同撰写,并由Manning出版社出版。这本书...

    springsecurity学习笔记

    在"springsecurity学习笔记"中,你可能会涉及以下主题: - Spring Security的基本配置,包括web安全配置和全局安全配置。 - 如何自定义认证和授权流程,比如实现自定义的AuthenticationProvider和...

    Spring in Action 源码

    《Spring in Action》是关于Spring框架的一本经典著作,第4版涵盖了Spring的最新发展,包括Spring Boot、Spring Data、Spring Security以及Spring Web Flow等重要模块。随书源码是学习和理解书中理论的最佳实践资源...

    Spring in Action 2nd Edition

    根据读者和专业评论者的反馈来看,《Spring in Action》不仅是一本技术手册,还融合了良好的软件设计思想和模式,使得学习过程更加轻松愉快。 - **读者评价**:多位读者提到这本书不仅覆盖了Spring框架的所有基础...

    Spring in Action中文清晰版(带阅读笔记).part2

    Spring in Action中文清晰版(带阅读笔记)

    springInAction第四版中文版

    本书涵盖了Spring框架的核心概念、重要特性和实际应用,旨在帮助读者全面理解并熟练掌握Spring在开发中的运用。 1. **Spring框架概述**:Spring是一个轻量级的Java企业级应用框架,它提供了一个全面的编程和配置...

    Spring学习笔记( spring视频笔记)

    Spring学习笔记( spring视频笔记)

Global site tag (gtag.js) - Google Analytics