采用AOP的面向切面编程方式,对学生信息管理系统中的新增学生信息、更新学生信息和删除学生信息3个方法实现日志记录业务。
1. 创建项目
Idea创建Java项目,项目名称为:case08-spring-aop。
2. 导入spring相关jar包
case08-spring-aop项目下创建lib目录,在lib目录下导入Jar包:
- 核心包
spring-core-5.3.25.jar
spring-beans-5.3.25.jar
spring-context-5.3.25.jar
spring-expression-5.3.25.jar
- AOP包
spring-aop-5.3.25.jar
aspectjweaver-1.9.7.jar
- 测试包
junit-4.6.jar
- 依赖包
commons-logging-1.2.jar
3. 创建Spring配置文件
src目录下创建applicationContext.xml配置文件。
<beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd"><!--开启组件扫描--><context:component-scanbase-package="com.wfit"/><!--开启aspectj--><aop:aspectj-autoproxy/></beans>
4. 创建StudentDao类
src目录下创建com.wfit.dao包,此包目录下创建StudentDao.java类。
publicclassStudentDao { publicvoidaddStudent(){ System.out.println("新增成功!"); } publicvoiddelStudent(){ System.out.println("删除成功!"); } publicvoidgetStudent(){ System.out.println("查询成功!"); } }
5. 创建StudentService接口
src目录下创建com.wfit.service包,此包目录下创建StudentService.java接口。
publicinterfaceStudentService { /*** 新增*/publicvoidaddStudent(); /*** 删除*/publicvoiddelStudent(); /*** 查询*/publicvoidgetStudent(); }
6. 创建StudentServiceImpl类
src目录下创建com.wfit.service.impl包,此包目录下创建StudentServiceImpl.java类实现StudentService接口。
publicclassStudentServiceImplimplementsStudentService{ StudentDaostudentDao; publicvoidaddStudent() { studentDao.addStudent(); } publicvoiddelStudent() { inti=1/0; studentDao.delStudent(); } publicvoidgetStudent() { studentDao.getStudent(); } }
7. 创建MyAspect类
src目录下创建com.wfit.config包,此包目录下创建MyAspect.java类。
//注解一个组件对象//声明一个切面publicclassMyAspect { /*** 切入点*/"execution(* com.wfit.service.StudentService.*(..))") (privatevoidmyPointCut(){ } /*** 前置通知*/"myPointCut()") (publicvoidbefore(JoinPointjp){ System.out.println("前置通知,日志:"+jp.getSignature().getName() +"开始执行!"); } /*** 后置返回通知*/"myPointCut()") (publicvoidafterReturning(JoinPointjp){ System.out.println("后置返回通知,日志:"+jp.getSignature().getName() +"执行成功!"); } /*** 环绕通知*/"myPointCut()") (publicvoidaround(ProceedingJoinPointpjp) throwsThrowable { //环绕开始System.out.println("around开始..."); //执行当前目标方法pjp.proceed(); //环绕结束System.out.println("around结束..."); } /*** 异常通知*/value="myPointCut()",throwing="e") (publicvoidafterThrowing(JoinPointjp,Throwablee){ Stringmsg="异常通知,日志:"+jp.getSignature().getName() +"执行异常,原因是:"+e; System.out.println(msg); } /*** 后置(最终)通知*/"myPointCut()") (publicvoidafter(JoinPointjp){ System.out.println("后置(最终)通知,日志:"+jp.getSignature().getName() +"执行结束!"); } }
8. 编写测试类
src目录下创建com.wfit.test包,此包目录下创建TestStudent.java类。
publicclassTestStudent { privateStudentServicestudentService; publicvoidinit(){ ApplicationContextapplicationContext=newClassPathXmlApplicationContext("applicationContext.xml"); studentService=applicationContext.getBean("studentServiceImpl", StudentService.class); } publicvoidtestAdd(){ studentService.addStudent(); } publicvoidtestDel(){ studentService.delStudent(); } publicvoidtestGet(){ studentService.getStudent(); } }
9. 执行结果
- 执行testAddStudent结果
- 执行testDelStudent结果