文章目录
-
- 实际案例
-
-
- 功能模块划分
-
-
- 安全功能模块
- 支付功能模块
- 日志功能模块
- 缓存功能模块
-
-
- 硬编码实现需求
-
-
- 支付模块代码修改
- 测试类
- 运行结果
- 总结
-
- 使用代理模式实现需求
-
-
- 代理类
- 测试类
- 运行结果
- 总结
-
- AOP实现需求
-
-
- AOP定义
- 专业名词
- 使用AOP
-
-
- 编写xml
- 编写测试类
- 运行结果
- 总结
- aop的坑
-
-
实际案例
功能模块划分
现在我们做了一个支付的项目,具体功能模块如下
总结
使用硬编码方式
优点
逻辑简单,直接顺序调用就好了
缺点
1.修改极不方便,这里我只修改了支付模块的一个方法,就要在这个方法里去修改3行代码,要是这个模块有1000个方法呢,你是不是要晕菜了,你就得机械的打开这1000个方法,将这3行代码弄进去,基本这样一弄,一天的时间都浪费了
2.当我们是一个大型团队进行开发的时候,往往是多个模块同时进行,你如果是使用这种硬编码的格式,你编写支付模块的时候就得等到其他三个模块开发完你才可以进行开发,影响开发进度
3.违反了开闭原则,就是当我们需求有变化时,我们更应该做的是去增添几个子类或者配置,而不是去修改现在已经写好了的代码
4.违背了高内聚 低耦合的原则,当我们开发的时候我们应该让本来就有不可分割的联系的那些内容尽可能聚合在一起,让那些没有必要联系的内容尽可能分的更开,这样我们的工程就是一个一个的模块,当我们修改一个模块的时候完全不用担心会影响到另一个模块,这里就违背了这个原则,支付模块与其他三个模块并没有必要联系,但是这里把它们写到了一起,使这4个模块耦合在了一起
使用代理模式实现需求
代理类
测试类
运行结果
1.我们没有对4个模块进行一点改动,只是生成了一个类,我们直接调用类文件就可以了,这对我们的代码是没有侵入性的
2.符合开闭原则,我们关闭改变(改变原有代码),拥抱扩展(新增类或者接口等等)
缺点
因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类,类太多.同时,一旦接口增加方法,目标对象与代理对象都要维护。
这是因为这个缺点,我们的正主要出场了,代理模式的升级版
AOP实现需求
AOP定义
在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
专业名词
切面
通知
连接点
织入
代理
是不是看起来一脸懵逼,单纯讲概念那是谁学起来都很痛苦,不如把概念引入实际情景中来学习,下面我们来讲一个实际的案例
使用AOP
编写xml
编写测试类
运行结果

总结
通过上面的案例我们已使用aop实现了需求,但是我们仅仅只是写了一个配置文件就完成了,对代码几乎没有侵入性,
这里有一个问题,为什么我们有了代理模式还要使用aop呢r> 因为我们使用代理模式是静态的代理,实际是我们在程序运行之前就要写好这些代理类,但是动态代理就是我们实际运行的时候,通过反射机制在字节码层次去生成代理类,就比静态代理要灵活,至于动态代理的实现请继续关注笔者的spring系列
aop的坑
1.只有 Spring 生成的对象才有 AOP 功能,因为 Spring 生成的代理对象才有 AOP 功能。切入的类和被切入的类必须是被spring管理的(springIOC),如果是自己new 出来的,切入无效。
2.而且所对应的切入方法不能是static 修饰的
3.例如上面的案例,我们写了两个after的通知,那么这两个通知的执行顺序是怎么样的呢r> 它与我们编写的顺序是反的,越写在前面的越后执行,这是我们就可以给切面设置一个属性,order ,这是属性的值越大越先被执行
文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览92925 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!