012. Spring Aspect Oriented Programming(AOP)

来源:互联网 发布:淘宝美工怎么做 编辑:程序博客网 时间:2024/06/08 07:03

1、创建Java项目:File -> New -> Java Project

2、引入必要jar包,项目结构如下
这里写图片描述

3、创建StudentService接口StudentService.java

package com.spring.service;public interface StudentService {    public void saveStudent(String student);}

4、创建StudentServiceImp实现类StudentServiceImp.java

package com.spring.service.imp;import com.spring.service.StudentService;public class StudentServiceImp implements StudentService {    @Override    public void saveStudent(String student) {        System.out.println("invoke saveStudent(String student) Save student: " + student);        // System.out.println(1/0); // 测试异常通知    }}

5、创建StudentServiceAspect切面类StudentServiceAspect.java

package com.spring.advice;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.ProceedingJoinPoint;public class StudentServiceAspect {    public void doBefore(JoinPoint jp ) {        System.out.println("前置通知开始");        System.out.println("Class name: " + jp.getTarget().getClass().getName());        System.out.println("Function name: " + jp.getSignature().getName());        System.out.println("Save student begin: " + jp.getArgs()[0]);        System.out.println("前置通知结束");    }    public void doAfter(JoinPoint jp) {        System.out.println("后置通知开始");        System.out.println("Class name: " + jp.getTarget().getClass().getName());        System.out.println("Function name: " + jp.getSignature().getName());        System.out.println("Save student end: " + jp.getArgs()[0]);        System.out.println("后置通知结束");    }    public Object doAround(ProceedingJoinPoint pjp) {        System.out.println("环绕通知开始");        Object retVal = null; // 函数返回值        try {            retVal = pjp.proceed(); // 调用函数        } catch (Throwable e) {            e.printStackTrace();        }        System.out.println("函数执行结果: " + retVal);        System.out.println("环绕通知结束");        return retVal;    }    public void doAfterReturning(JoinPoint jp) {        System.out.println("返回通知");    }    public void doAfterThrowing(JoinPoint jp, Throwable e){        System.out.println("异常通知: " + e.getMessage());    }}

6、创建spring配置文件applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       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/aop         http://www.springframework.org/schema/aop/spring-aop.xsd">    <bean id="studentServiceAspect" class="com.spring.advice.StudentServiceAspect"></bean>    <bean id="studentService" class="com.spring.service.imp.StudentServiceImp"></bean>    <aop:config>        <aop:aspect id="studentServiceAspect" ref="studentServiceAspect">            <aop:pointcut expression="execution(* com.spring.service.*.*(..))" id="advice" />            <aop:before method="doBefore" pointcut-ref="advice"/>            <aop:after method="doAfter" pointcut-ref="advice"/>            <aop:around method="doAround" pointcut-ref="advice"/>            <aop:after-returning method="doAfterReturning" pointcut-ref="advice"/>            <aop:after-throwing method="doAfterThrowing" pointcut-ref="advice" throwing="e"/>        </aop:aspect>    </aop:config></beans>

7、创建Spring测试类SpringUnit.java

package com.spring.junit;import org.junit.Test;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.spring.service.StudentService;public class SpringUnit {    @Test    public void test() {        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");        StudentService studentService = (StudentService) ctx.getBean("studentService");        studentService.saveStudent("吴腾辉");        ctx.close();    }}

8、测试结果

... 省略Spring日志信息 ...前置通知开始Class name: com.spring.service.imp.StudentServiceImpFunction name: saveStudentSave student begin: 吴腾辉前置通知结束环绕通知开始invoke saveStudent(String student) Save student: 吴腾辉返回通知函数执行结果: null环绕通知结束后置通知开始Class name: com.spring.service.imp.StudentServiceImpFunction name: saveStudentSave student end: 吴腾辉后置通知结束... 省略Spring日志信息 ...
原创粉丝点击