一、SpringAOP
⒈ AOP
Aspect Oriented Programming 面向切面编程, 实现的是核心业务和非核心业务之间的的分离,让核心类只做核心业务,代理类只做非核心业务。
⒉ 目的
-
把核心业务和非核心业务进行分离。
-
把多个非核心业务处理(点)变成一个切面(之前的非核心业务代码需要写多次变成只需要写一次。
-
要求:只有当核心类中有多个业务需要进行处理的时候使用 AOP 较为合理,如果只有一个业务需要被处理那么就没有必要使用 AOP 了。
二、静态代理
-
需要知道核心类(被代理类)是哪一个类,并且有什么方法。
-
非核心的代码需要重复写多次,显得代码的结构臃肿,形成代码冗余。
-
非核心类(代理类)需要实现核心类(被代理类)实现的接口,也就是他们需要实现共同的接口,但是以核心类实现的接口(被代理类)为准。
三、动态代理
-
不需要知道核心类(被代理类)具体是什么类。
-
非核心类(代理类)需要实现 InvocationHandler 接口。
四、静态代理示例
1. 业务介绍
假定高三学生为核心类,学生的家人是代理类。高三学生需要做的核心业务有:在家学习(studyAtHome)、在学校学习(studyAtHome);家人需要做的非核心业务为:准备饭菜(买、洗、炒、煮饭)。准备补品(购买、熬制、加佐料)。
2. 具体代码
github 地址:https://github.com/tsgkim/JavaBasic/tree/master/JavaBasic/src/com/basic/tu/proxy/myStatic
(1) 创建一个高三学生的接口(G3Student)
(2) 创建一个高三学生实现类:G3Student_boy,并且这个类实现高三学生接口(G3Student)
(3) 创建一个高三学生的代理类:G3StudentProxy,并且实现了高三学生接口(G3Student)
(4) 测试
(5) 结果
代理:准备买菜
代理:准备洗菜
代理:准备炒菜
代理:准备煮饭
-----------------
小明在HOME学习
-----------------
代理 :购买补品
代理 :熬制部品
代理 :加入佐料
代理:准备买菜
代理:准备洗菜
代理:准备炒菜
代理:准备煮饭
-----------------
小明在SCHOOOL学习
-----------------
代理 :购买补品
代理 :熬制部品
代理 :加入佐料
五、小结
由上面的例子我们可以简单模拟一个静态代理的实例,但是我们发现,这个代理做的事情会因为核心对象业务多而变得多起来,而且这些代理做的事情都是相同的没有变化的:
//这个是代理(G3Student_proxy)准备饭菜的需要做的流程:
System.out.println("代理:准备买菜");
System.out.println("代理:准备洗菜");
System.out.println("代理:准备炒菜");
System.out.println("代理:准备煮饭");
System.out.println("-----------------");
//这个是代理(G3Student_proxy)准备补品的需要做的流程:
System.out.println("-----------------");
System.out.println("代理 :购买补品");
System.out.println("代理 :熬制部品");
System.out.println("代理 :加入佐料");
System.out.println();
并且,如果我们要修改这些流程中的某一个流程的时候会发现要改多处,而且都是相同的代码,所以这个时候使用动态代理就可以轻松解决这个问题。
转载自:http://www.cnblogs.com/demoMeng/p/5880909.html
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于