首先,尽管咱们这里不乏技术牛人,但是为了照顾刚接触JAVA没多久的童鞋,我先来普及Spring AOP是什么。
AOP其实是对OOP思想的补充和完善。我想大家对OOP都不会陌生,OOP引入"抽象"、"封装"、"继承"、"多态"等概念,对万事万物进行抽象和封装,来建立一种对象的层次结构。它强调了一种完整事物的自上而下的关系。但是具体细粒度到每个事物内部,OOP就显得无能为力了。
如日志功能。日志代码往往水平地散布在所有对象层次当
中,却与它所散布到的对象的核心功能毫无关系。对于其他很多类似功能,如事务管理、权限控制等也是如此。这导致了大量代码的重复,而不利于各个模块的重
用。
而AOP技术则恰恰相反,它利用一种称为"横切"的技术,能够剖解开封装的对象内部,并将那些影响了多个类并且与具体业务无关的公共行为 封装成一个独立的模块(称
为切面)。更重要的是,它又能以巧夺天功的妙手将这些剖开的切面复原,不留痕迹的融入核心业务逻辑中。这样,对于日后横切功能的编辑和重用都能够带来极大的方便。
一个实际工作中遇到的例子,
我在A环节提交一个表单,给下个B环节来审核,但是,因为之前规定,如果在每月15号之后,则不能提交, 我们通常的做法是在提交表单的方法中做这个检查,
但是,如果这些不同的提交方法 都要在提交前做检查,未免太重复了,加重了工作量,也造成代码的冗余,所以我们一用到AOP ,对要提交的方法 在具体执行前,做个方法前通知,来检查是不是满足规定就好,如果不满足,则抛出异常,前台捕获,不能提交了于是。
下面讲一个简单的通过XML文件来对AOP做个实现。
在spring配置文件上配置如下代码
<bean id="myAdvisor" class="org.qin.yinglian.system.web.CodeAOPTest">
</bean>
<aop:config>
<!-- 切点 -->
<aop:pointcut id="servicePointcut"
expression="execution(* org.qin.yinglian.basic.service.*.*(..))" />
<!-- 切面(切点+通知) -->
<aop:aspect id="serviceAspect" ref="myAdvisor">
<!-- 执行的切面方法 -->
<aop:before method="beforeAdviso" pointcut-ref="servicePointcut" />
</aop:aspect>
</aop:config>
通知类:
package org.qin.yinglian.system.web;
public class CodeAOPTest {
// 前置通知
public void beforeAdvisor() {
System.out.println("Hello");
}
}
本文出自 “JAVA那些事儿” 博客,请务必保留此出处http://1027187712.blog.51cto.com/5509347/1626982
原文:http://1027187712.blog.51cto.com/5509347/1626982