初识AOP
2016-02-25 14:33
197 查看
AOP的英文全称是Aspect Oriented Programming,称为面向切面或者方面的编程,其实这不是Spring的首创,但Spring引入AOP,那AOP肯定在编程效率提升上有其过人之处。现在以银行开户来看看AOP如何帮我们解决问题。
银行开户业务分为下面三步:
身份验证
开户
创卡
客户类Subs.java中有开户的方法,身份验证和创卡放到SubsOper中实现,因为实际业务比例子复杂得多,客户可能还会分很多种,不同种类的客户只是在开户流程上不一样,但是身份验证或者创卡都是一样的,因此只是将开户放到客户类中,其它的两个方法方到客户的操作类中。具体的设计如下:
Subs.java
SubsOper.java
写一个测试方法进行测试
测试结果和我们预期一致
能不能让开发人员只聚焦于开户的操作上,只负责完成好该部分的逻辑,身份验证和创卡这部分交给公共开发组去做,并且封装好后这部分的内容就不动了,最好就是做成可配置的,哪些开户操作是需要身份验证的,那么就做好针对这些操作的映射,哪些开户操作是要创卡就配置创卡,例如用户如果是用存折,就不需要创卡。这是完全可以有的,AOP就能帮我们实现梦想,只需在Spring配置文件中配置下面一段:
后面的before和after应该怎么配,不需要我赘述了。这个时候我们的测试方法变成了:
见证奇迹的时刻到了,就这么一行代码能得到和刚才一样的结果吗,答案是肯定的,和刚才的结果一模一样,不信你可以试试。后续我们可以将Subs做成一个接口,所有的客户,无论你是普通客户,还是VIP客户,或者是霸道总裁,都必须实现Subs接口,我们可以改写其中的createSub()方法,实现不同的开户逻辑,这样开发人员也无需去管什么验证,创卡这些杂七杂八的事情了,专注于自己应该专注的业务,其他的就交给其他的人去做吧,这样每天下午就有喝下午茶的时间了,晚上可以早早下班了,让加班成为回忆吧。
可能看到这里,基本上了解了AOP是干嘛的,至少明白了用了AOP后,我们要写的代码变少了很多,至少知道了很多事情是应该别人来帮我们完成,我们以前给别人干了不少活,所以我们总会觉得活得很累。但我想AOP必定有其伟大之处,不然也没必要搞这么高大上的名字,就像敏捷,XP(非windows系统,而是极限编程)这些概念那么流行,那么不明觉厉。看看下面两幅图吧。
我们过去的做法,抽象出了公共组件,并进行了分层,分为业务层和公共组件层,业务层的不同业务去调公共组件层的东西。
现在AOP的做法,将公共服务做成一个个pointcut(切面),切入到我们实际的业务中,就像刚才的例子,我们再也不用管公共服务的调用了,让别人去想办法切入吧,我们就关心自己的业务即可。
银行开户业务分为下面三步:
身份验证
开户
创卡
客户类Subs.java中有开户的方法,身份验证和创卡放到SubsOper中实现,因为实际业务比例子复杂得多,客户可能还会分很多种,不同种类的客户只是在开户流程上不一样,但是身份验证或者创卡都是一样的,因此只是将开户放到客户类中,其它的两个方法方到客户的操作类中。具体的设计如下:
Subs.java
public class Subs { public void createSub() { System.out.println("begin to create sub..."); } }
SubsOper.java
public class SubsOper { public void beforeCreateSub() { System.out.println("verify sub info before create sub..."); } public void afterCreateSub() { System.out.println("create card after create sub..."); } }
写一个测试方法进行测试
public void testApp() { SubsOper subsOper = new SubsOper(); subsOper.beforeCreateSub(); Subs subs = new Subs(); subs.createSub(); subsOper.afterCreateSub(); assertTrue( true ); }
测试结果和我们预期一致
能不能让开发人员只聚焦于开户的操作上,只负责完成好该部分的逻辑,身份验证和创卡这部分交给公共开发组去做,并且封装好后这部分的内容就不动了,最好就是做成可配置的,哪些开户操作是需要身份验证的,那么就做好针对这些操作的映射,哪些开户操作是要创卡就配置创卡,例如用户如果是用存折,就不需要创卡。这是完全可以有的,AOP就能帮我们实现梦想,只需在Spring配置文件中配置下面一段:
后面的before和after应该怎么配,不需要我赘述了。这个时候我们的测试方法变成了:
public void testAOP() { subs.createSub(); }
见证奇迹的时刻到了,就这么一行代码能得到和刚才一样的结果吗,答案是肯定的,和刚才的结果一模一样,不信你可以试试。后续我们可以将Subs做成一个接口,所有的客户,无论你是普通客户,还是VIP客户,或者是霸道总裁,都必须实现Subs接口,我们可以改写其中的createSub()方法,实现不同的开户逻辑,这样开发人员也无需去管什么验证,创卡这些杂七杂八的事情了,专注于自己应该专注的业务,其他的就交给其他的人去做吧,这样每天下午就有喝下午茶的时间了,晚上可以早早下班了,让加班成为回忆吧。
可能看到这里,基本上了解了AOP是干嘛的,至少明白了用了AOP后,我们要写的代码变少了很多,至少知道了很多事情是应该别人来帮我们完成,我们以前给别人干了不少活,所以我们总会觉得活得很累。但我想AOP必定有其伟大之处,不然也没必要搞这么高大上的名字,就像敏捷,XP(非windows系统,而是极限编程)这些概念那么流行,那么不明觉厉。看看下面两幅图吧。
我们过去的做法,抽象出了公共组件,并进行了分层,分为业务层和公共组件层,业务层的不同业务去调公共组件层的东西。
现在AOP的做法,将公共服务做成一个个pointcut(切面),切入到我们实际的业务中,就像刚才的例子,我们再也不用管公共服务的调用了,让别人去想办法切入吧,我们就关心自己的业务即可。
相关文章推荐
- 一个jar包里的网站
- 一个jar包里的网站之文件上传
- 一个jar包里的网站之返回对媒体类型
- Spring整合Quartz(JobDetailBean方式)
- Spring整合Quartz(JobDetailBean方式)
- yui3的AOP(面向切面编程)和OOP(面向对象编程)
- JavaScript AOP编程实例
- 使用AOP改善javascript代码
- 初识SmartJS - AOP三剑客
- 模拟Spring的简单实现
- spring+html5实现安全传输随机数字密码键盘
- Spring中属性注入详解
- SpringMVC框架下JQuery传递并解析Json格式的数据是如何实现的
- struts2 spring整合fieldError问题
- spring的jdbctemplate的crud的基类dao
- java使用动态代理来实现AOP(日志记录)的实例代码
- 读取spring配置文件的方法(spring读取资源文件)
- Spring Bean基本管理实例详解
- java实现简单美女拼图游戏
- 详解Java的Spring框架中的事务管理方式