下面介绍使用Spring框架进行AOP编程。
首先我们需要导入需要的jar包:
1.aspectjrt.jar
2.aspectjweaver.jar
3.cglib-nodep-2.1_3.jar
在spring中有两种方式实现面向切面编程,一种是基于XML配置,另一种是使用注解份额方式,在实际开放中我们可以任选其中的一种即可。
首先介绍下使用注解方式进行AOP开发。
要使用注解方式,我们需要打开注解处理器
1. <aop:aspectj-autoproxy/>
我们还是使用前面介绍的接口:
1. package com.szy.spring;
2.
3. public interface UserManager
4. {
5.
6. public abstract void addUser(String username, String password);
7.
8. public abstract void deleteUser(int userId);
9.
10. public abstract String findUser(int userId);
11.
12. public abstract void modifyUser(int userId, String username, String password);
13.
14. }
实现这个接口:
1. package com.szy.spring;
2.
3. public class UserManagerImpl implements UserManager
4. {
5.
6. public void addUser(String username, String password)
7. {
8. "--------UserManagerImpl.addUser()----------");
9. }
10.
11. public void deleteUser(int userId)
12. {
13. "--------UserManagerImpl.deleteUser()----------");
14. }
15.
16. public String findUser(int userId)
17. {
18. "--------UserManagerImpl.findUser()----------");
19. return null;
20. }
21.
22. public void modifyUser(int userId, String username, String password)
23. {
24. "--------UserManagerImpl.modifyUser()----------");
25. }
26. }
切入点是用来定义我们要拦截的方法。在切入点定义中使用了AOP表达式语言,下面通过实例简单解释一下:
1. @Pointcut("execution (* com.szy.spring..*.*(..))")
2. execution:代表执行
3. 第一个*:代表返回值类型,使用*代表任何类型的返回值
4. com.szy.spring:代表包名
5. ..:代表其底下的子包也进行拦截
6. 第二个*:代表对哪个类进行拦截,*代表所有类
7. 第三个*:代表方法
8. (..):代表方法的蚕食有无都可以
现在我们要对UserManagerImpl类下的所有方法进行拦截,则切入点如下表示:
1. @Pointcut("execution (* com.szy.spring.UserManagerImpl.*(..))")
2.
3. private void anyMethod() //定义切入点
4. {
5. }
其中切入点的名称是下面方法的名称aynMethod(),包括括号。
下面我们定义通知,通知分为前置通知、后置通知、意外通知、等。通知分为前置通知、后置通知、意外通知、最终通知和环绕通知等。
演示前置通知,
1. @Before("anyMethod()") //括号内为切入点名称
2. public void doBefore()
3. {
4. "----------------执行前置通知-----------------");
5. }
6.
7. @AfterReturning("anyMethod()")
8. public void doAfterReturning()
9. {
10. "----------------执行后置通知-----------------");
11. }
1. @After("anyMethod()")
2. public void doAfter()
3. {
4. "----------------执行最终通知-----------------");
5. }
6.
7. @AfterThrowing("anyMethod()")
8. public void doAfterThrowing()
9. {
10. "----------------执行意外通知-----------------");
11. }
12.
13. @Around("anyMethod()")
14. public Object doAround(ProceedingJoinPoint pjp) throws Throwable
15. {
16. "----------------进入判断方法-----------------");
17. //该方法必须被执行
18. "----------------退出判断方法-----------------");
19. return result;
20. }
我们把切面交给spring管理,要交给spring管理我们可以在配置文件同进行bean配置,或者使用扫描的方式。
1. <bean id="interceptor" class="com.szy.spring.Interceptor"/>
下面我们进行测试
1. ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
2. "userManager");
3. "coolszy", "kuka");
按照我们的设计,输入的结果应为
----------------执行前置通知-----------------
----------------进入判断方法-----------------
--------UserManagerImpl.addUser()----------
----------------执行后置通知-----------------
----------------执行最终通知-----------------
----------------退出判断方法-----------------