Spring AOP 初探
2013-04-02 15:01
225 查看
AOP: Aspect Oriented Programming 面向切面编程。
面向切面编程(也叫面向方面编程):Aspect Oriented Programming(AOP),是目前软件开发中的一个热点,也是Spring框架中的一个重要内容。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
AOP是OOP的延续
主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等。
主要的意图是:将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。
-------摘选自百度百科
下面针对安全控制这一功能实现一个简单的AOP应用。
假如现在我们需要开发一个会员注册系统,为了简单起见,该系统只有注册和注销两个功能。考虑到安全因素,只有管理员才有权限使用该功能。下面是我们系统的一个注册系统接口。(面向接口编程比面向类编程更好!)
该接口声明了两个协议,即注册和注销,它的每个子类必须实现这两个方法。
下面给出一个具体的注册系统。
这个具体的注册系统实现了接口给出的两个协议,在进行注册和注销两个操作时,会判断操作者是否有相应的权限(是否为管理员),然后才能继续业务逻辑操作。这种方法实现看起来有点让人不舒服,因为安全控制和业务逻辑混合在了一起,而且存在部分代码冗余现象。通过观察可以知道,这两个方法有共同的地方,即安全控制代码,我们可以把相同的部分提取出来,利用AOP来实现安全控制。
我们将安全控制的代码移除,修改后的注册系统实例如下:
这样,每个方法只需关注业务逻辑,而无需费心其它系统功能。接下来,我们需要编写一个安全控制类。
该类的方法before会在注册和注销方法调用前被调用。
然后编写Spring的配置文件:
最后编写测试类:
运行一下:
在每次调用注册或者注销方法时,首先会进行安全控制。
总结:
通过AOP,我们可以将系统功能,如日志记录,事务管理,安全控制,审计等从方法中解脱出来,这样方法可以专注于核心的业务逻辑,大大增加了系统的可维护性。
其它:
项目结构:
如果IDE提示“The hierarchy of the type MyBeforeMethod is inconsistent”,说明缺少了一个jar包 - aopalliance jar
面向切面编程(也叫面向方面编程):Aspect Oriented Programming(AOP),是目前软件开发中的一个热点,也是Spring框架中的一个重要内容。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
AOP是OOP的延续
主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等。
主要的意图是:将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。
-------摘选自百度百科
下面针对安全控制这一功能实现一个简单的AOP应用。
假如现在我们需要开发一个会员注册系统,为了简单起见,该系统只有注册和注销两个功能。考虑到安全因素,只有管理员才有权限使用该功能。下面是我们系统的一个注册系统接口。(面向接口编程比面向类编程更好!)
package org.spring.tutorial; /** * 注册系统 */ public interface RegisterSystem { /** * 注册会员 * @param name 会员名称 */ void register(String name); /** * 注销会员 * @param name 会员名称 */ void unRegister(String name); }
该接口声明了两个协议,即注册和注销,它的每个子类必须实现这两个方法。
下面给出一个具体的注册系统。
package org.spring.tutorial; /** * 一个具体的注册系统 */ public class RegisterSystemImpl implements RegisterSystem { @Override public void register(String name) { System.out.println("判断是否为管理员..."); System.out.println("会员:" + name + "注册成功!"); } @Override public void unRegister(String name) { System.out.println("判断是否为管理员..."); System.out.println("会员:" + name + "注销成功!"); } }
这个具体的注册系统实现了接口给出的两个协议,在进行注册和注销两个操作时,会判断操作者是否有相应的权限(是否为管理员),然后才能继续业务逻辑操作。这种方法实现看起来有点让人不舒服,因为安全控制和业务逻辑混合在了一起,而且存在部分代码冗余现象。通过观察可以知道,这两个方法有共同的地方,即安全控制代码,我们可以把相同的部分提取出来,利用AOP来实现安全控制。
我们将安全控制的代码移除,修改后的注册系统实例如下:
package org.spring.tutorial; /** * 一个具体的注册系统 */ public class RegisterSystemImpl implements RegisterSystem { @Override public void register(String name) { System.out.println("会员:" + name + "注册成功!"); } @Override public void unRegister(String name) { System.out.println("会员:" + name + "注销成功!"); } }
这样,每个方法只需关注业务逻辑,而无需费心其它系统功能。接下来,我们需要编写一个安全控制类。
package org.spring.tutorial; import java.lang.reflect.Method; import org.springframework.aop.MethodBeforeAdvice; /** * 安全控制类 * */ public class SafeControl implements MethodBeforeAdvice { @Override public void before(Method method, Object[] args, Object target) throws Throwable { System.out.println("判断是否为管理员..."); } }
该类的方法before会在注册和注销方法调用前被调用。
然后编写Spring的配置文件:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 注册系统bean --> <bean id="registerSystemImpl" class="org.spring.tutorial.RegisterSystemImpl" /> <!-- 安全控制bean --> <bean id="safeControl" class="org.spring.tutorial.SafeControl" /> <!-- 注册系统代理 --> <bean id="registerSystemProxy" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="target" ref="registerSystemImpl" /> <property name="interceptorNames"> <list> <value>safeControl</value> </list> </property> </bean> </beans>
最后编写测试类:
package org.spring.tutorial; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class App { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"SpringConfig.xml"}); RegisterSystem proxy = (RegisterSystem) context.getBean("registerSystemProxy"); proxy.register("benson"); proxy.unRegister("benson"); } }
运行一下:
判断是否为管理员... 会员:benson注册成功! 判断是否为管理员... 会员:benson注销成功!
在每次调用注册或者注销方法时,首先会进行安全控制。
总结:
通过AOP,我们可以将系统功能,如日志记录,事务管理,安全控制,审计等从方法中解脱出来,这样方法可以专注于核心的业务逻辑,大大增加了系统的可维护性。
其它:
项目结构:
如果IDE提示“The hierarchy of the type MyBeforeMethod is inconsistent”,说明缺少了一个jar包 - aopalliance jar
相关文章推荐
- Spring Aop 初探(4)
- Spring AOP 初探
- Spring Aop 初探(1)
- xinit启动X Window System过程初探
- WebSocket初探
- Servlet初探和生命周期
- Hadoop初探
- Go语言的接口和实现类初探(一)
- Redis介绍【初探】
- non-IDE开发android初探
- Go语言的接口和实现类初探(二)
- 单一世界架构初探之世界地图
- 对Spring aop的理解
- Android Studio使用CMake编译JNI初探
- 初探 ODBC (开放式数据库接口)————明诚弘毅写的
- [网络编程]_[Socket]_[Socket 阻塞模式(blocking)下的 I/O模型(model) 之 Select 模型(model)初探]
- FFMPEG(一)使用初探
- 初探ASP.NET MVC
- 初探JavaScript魅力(四)
- 算法初探-动态规划(Dynamic Programming)