|
[indent,“没有绝世神功” —— Frederick Brooks
[/indent,AOP思想
[list,
[*,前言
[/list,大家好,我是42岁的程序员码农阿峰。从2003年开始写程序现在已经17年开发经验了。但是我深以为然的就是编程思想的提炼是一辈子的事情。程序员不断需要学习新技术,所以活到老学到老是最基本的要求。如果能够做到持续优质的产出代码、完成项目,那么应该不需要太在意职场的35岁危机。最近单位统一使用Java开发了,之前一直是搞.net为主。Java我只开发过android程序。公司请千峰教育给团队培训Java中级,被搞Java的程序员的编程思想折服了,Java果然牛逼,怪不得生态要比.net好很多。不是有意要挑起语言之争,没有移情别恋,还是一如既往的喜欢.net用了十几年的东西,怎么可能随便就放弃了。觉得学习多种语言是个很有意思的事情,编程思想的领悟会提升对编程语言的领悟是通用的,比如这几天学了spring aop]然后明白了在什么场景下用.net同样也可以实现。
[list,
[*,一招鲜走遍天
[/list,编程是技术更是艺术。这里说的一招鲜是说某个时期醉心的编程方法、编程思想。刚开始编程以为万事都是增删改查,会了这招兵来将挡水来土掩。后面又学会了使用代码生成器,编程进入了半自动化时代。再后来趟了无数坑之后,发现还是面向网络(度娘)编程牛逼。后来又迷上了设计模式的运用。再后来依赖注入,IOC容器的使用开始面向接口编程。总结下来就是:没有绝世神功。哪有一招鲜!
[list,
[*,AOP
[/list,现在除了AOP我没玩过之外,其他的主流招式我都耍了一遍。AOP(Aspect-Oriented Programming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。对于其他类型的代码,如安全性、异常处理和透明的持续性也是如此。这种散布在各处的无关的代码被称为横切(cross-cutting)代码,在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。
[indent,AOP:本质上就是 Spring动态代理开发,有益于原始类的维护
[/indent,Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理。JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。JDK动态代理的核心是InvocationHandler接口和Proxy类。
如果目标类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成某个类的子类,注意,CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的,诸如private的方法也是不可以作为切面的。
AOP是非常绝妙的编程思想和技术。接下来会花一些时间在这上面。学习永无止境。
|
|