分享一个自己写的最为简单的Spring AOP的应用,其实,本人也是学习Spring不久,只是把一些个人的理解分享下,供参考。可能很多人刚开始不太理解到底啥是AOP,其实它也是相对OOP来说的,类似OOP其实也是一种编程思想吧。本人暂且把Spring 中的AOP理解成一种方法的拦截器(可能有所片面,主要是方便理解)。
个人通俗理解,就好比你去自动取款机取钱,边上装了个摄像头在监视着。你取你的钱,不用管那摄像头干嘛,只是对于摄像头来说,已经把你取钱的这一过程记录了下来。你取钱的这一过程我们可以从OOP角度分析,而对于摄像头来说,就是从AOP角度去分析了。反映到我下面要讲的示例就是系统日志的记录。
我要讲的示例大致是这样的,从OOP角度分析,就是说现在有一个User对象,然后你要调用业务逻辑实现去保存(或者其他行为)这个User对象,或者说是做持久化操作,把User对象相关信息写进数据库。那么从AOP角度来看,就是在你进行保存对象这一行为发生的时候进行日志记录。就是说,你在进行业务操作的时候,不需要去关心系统背后到底做了啥,Spring AOP它已经帮你搞定了。
(图一、个人对于OOP与AOP在本人示例中的理解)
上图说表示的东西是个人的理解理解,纵向为主业务逻辑这里表现为对User对象的持久化操作,横向为AOP实现,这里表现为系统日志记录。
以下是代码具体实现:(采用Spring2.5,Myeclipse6.5) Java代码
1. (一)、从AOP角度分析: 2.
3. package org.wiki.spring.aspect; 4.
5. import org.aspectj.lang.JoinPoint; 6. 7. /**
8. * 定义切面类,将系统中的横切性关注点模块化 9. *
10. * @author Wiki.M 11. * 12. */
13.public class Aspect { 14.
15. /**
16. * 定义advice,即切面类中方法具体实现, 这里主要是用于记录日志,只做简单处理。 17. *
18. * @param joinPoint,可以取得被拦截方法的一些信息 19. */
20. public void logging(JoinPoint joinPoint) { 21. //得到被拦截方法参数,并打印
22. Object[] args = joinPoint.getArgs(); 23. for (int i = 0; i < args.length; i++) {
24. System.out.println(\arg\+ i + \-- \+ args[i]); 25. } 26.
27. //得到被拦截方法签名
28. System.out.println(joinPoint.getSignature().getName());
29.
30. //记录系统日志具体实现
31. System.out.println(\ 32. }
33.} 34.
35.(二)从DAO,数据持久化角度分析: 36.package org.wiki.spring.dao; 37.
38.import org.wiki.spring.domain.User; 39. 40./**
41. * 定义IUserDAO接口,目的是为了灵活实现UserDAO不同的操作。 42. * @author Wiki.M 43. * 44. */
45.public interface IUserDAO { 46.
47. public void addUser(User user); 48.
49. public void deleteUser(int id); 50.
51. public void updateUser(int id); 52.} 53. 54.
55.//================================================== 56.
57.package org.wiki.spring.dao; 58.
59.import org.wiki.spring.domain.User; 60. 61./**
62. * IUserDAO接口的具体实现,这里只做简单处理 63. * @author Wiki.M 64. * 65. */
66.public class UserDAOImpl implements IUserDAO { 67.
68. @Override
69. public void addUser(User user) {
70. System.out.println(\ 71.
72. } 73.
74. @Override
75. public void deleteUser(int id) {
76. System.out.println(\