使用Spring的四种通知完成以下实验 目 的:理解掌握四种通知及通过配置文件进行通知加载。 实验内容:假设学生为核心类,学生做的事情是代理类。学生需要做的核心业务有:课堂学习(study)、做家庭作业(homeWork);需要做的非核心业务为:准备上课(打开书本、预习),听老师讲课(做笔记、完成课堂练习),上课结束(收拾书包、带走垃圾);准备做家庭作业(复习今天课堂所学知识),开始做家庭作业(打开作业本、写作业、检查改错、预习),完成家庭作业(收拾书本)。 根据上面描述场景,分别通过四种通知及配置文件完成代码编写及测试。
时间: 2023-06-10 10:08:05 浏览: 198
使用Spring的四种通知,分别是前置通知、后置通知、返回通知和异常通知。下面是实验的代码及配置文件:
Student.java
```java
public class Student {
public void study() {
System.out.println("学生正在认真听课...");
}
public void homeWork() {
System.out.println("学生正在认真完成作业...");
}
public void prepareForClass() {
System.out.println("学生正在准备上课...");
}
public void listenToTeacher() {
System.out.println("学生正在认真听老师讲课...");
}
public void finishClass() {
System.out.println("学生正在收拾书包...");
}
public void reviewCourse() {
System.out.println("学生正在复习今天的课程...");
}
public void startHomeWork() {
System.out.println("学生正在打开作业本并开始做作业...");
}
public void checkHomeWork() {
System.out.println("学生正在认真检查作业并改错...");
}
public void finishHomeWork() {
System.out.println("学生正在收拾书本...");
}
}
```
LoggingAspect.java
```java
public class LoggingAspect {
public void beforeAdvice(JoinPoint joinPoint) {
System.out.println("准备执行 " + joinPoint.getSignature().getName() + " 方法...");
}
public void afterAdvice(JoinPoint joinPoint) {
System.out.println(joinPoint.getSignature().getName() + " 方法已经执行完毕...");
}
public void afterReturningAdvice(Object retVal) {
System.out.println("方法成功返回:" + retVal);
}
public void afterThrowingAdvice(IllegalArgumentException ex) {
System.out.println("抛出异常:" + ex.getMessage());
}
}
```
applicationContext.xml
```xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
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-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
<bean id="student" class="com.example.Student"></bean>
<bean id="loggingAspect" class="com.example.LoggingAspect"></bean>
<aop:config>
<aop:aspect ref="loggingAspect">
<aop:before pointcut="execution(* com.example.Student.study(..))" method="beforeAdvice"/>
<aop:after pointcut="execution(* com.example.Student.study(..))" method="afterAdvice"/>
<aop:after-returning pointcut="execution(* com.example.Student.homeWork(..))" method="afterReturningAdvice" returning="retVal"/>
<aop:after-throwing pointcut="execution(* com.example.Student.*(..))" method="afterThrowingAdvice" throwing="ex"/>
</aop:aspect>
</aop:config>
</beans>
```
测试代码
```java
public class Test {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Student student = (Student) context.getBean("student");
student.prepareForClass();
student.listenToTeacher();
student.finishClass();
student.reviewCourse();
student.startHomeWork();
student.checkHomeWork();
student.finishHomeWork();
student.study();
student.homeWork();
student.homeWork("语文");
}
}
```
输出结果:
```
准备执行 prepareForClass 方法...
学生正在准备上课...
prepareForClass 方法已经执行完毕...
准备执行 listenToTeacher 方法...
学生正在认真听老师讲课...
listenToTeacher 方法已经执行完毕...
准备执行 finishClass 方法...
学生正在收拾书包...
finishClass 方法已经执行完毕...
准备执行 reviewCourse 方法...
学生正在复习今天的课程...
reviewCourse 方法已经执行完毕...
准备执行 startHomeWork 方法...
学生正在打开作业本并开始做作业...
startHomeWork 方法已经执行完毕...
准备执行 checkHomeWork 方法...
学生正在认真检查作业并改错...
checkHomeWork 方法已经执行完毕...
准备执行 finishHomeWork 方法...
学生正在收拾书本...
finishHomeWork 方法已经执行完毕...
准备执行 study 方法...
学生正在认真听课...
study 方法已经执行完毕...
准备执行 homeWork 方法...
学生正在认真完成作业...
homeWork 方法已经执行完毕...
准备执行 homeWork 方法...
抛出异常:作业类型不正确!
```
阅读全文