Spring学习03——AOP Demo

切面类StudentServiceAspect.java

package com.su.advice;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;

public class StudentServiceAspect {

    public void doBefore(JoinPoint jp){
        System.out.println("类名:"+jp.getTarget().getClass().getName());
        System.out.println("方法名:"+jp.getSignature().getName());
        System.out.println("开始添加学生:");
    }
    
    public void doAfter(JoinPoint jp){
        System.out.println("类名:"+jp.getTarget().getClass().getName());
        System.out.println("方法名:"+jp.getSignature().getName());
        System.out.println("学生添加完成:"+jp.getArgs()[0]);
    }
    
    public Object doAround(ProceedingJoinPoint pjp) throws Throwable{
        System.out.println("添加学生前");
        Object retVal=pjp.proceed();
        System.out.println(retVal);
        System.out.println("添加学生后");
        return retVal;
    }
    
    public void doAfterReturning(JoinPoint jp){
        System.out.println("返回通知");
    }
    
    public void doAfterThrowing(JoinPoint jp,Throwable ex){
        System.out.println("异常通知");
        System.out.println("异常信息:"+ex.getMessage());
    }
}

接口StudentService

package com.su.service;

public interface StudentService {

    public void addStudent(String name);
}

接口的实现类StudentServiceImpl

package com.su.service.impl;

import com.su.service.StudentService;

public class StudentServiceImpl implements StudentService{

    @Override
    public void addStudent(String name) {
        // System.out.println("开始添加学生"+name);
        System.out.println("添加学生"+name);// System.out.println("完成学生"+name+"的添加");
    }

}

测试类

package com.su.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.su.service.StudentService;


public class T {

    public static void main(String[] args) {
        ApplicationContext ac=new ClassPathXmlApplicationContext("beans.xml");
        StudentService studentService=(StudentService)ac.getBean("studentService");
        studentService.addStudent("张三");
        
    }
    

}

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.su.advice.StudentServiceAspect"></bean>
    
    <bean id="studentService" class="com.su.service.impl.StudentServiceImpl"></bean>
    
    <aop:config>
        <aop:aspect id="studentServiceAspect" ref="studentServiceAspect">
            <aop:pointcut expression="execution(* com.su.service.*.*(..))" id="businessService"/>
            <aop:before method="doBefore" pointcut-ref="businessService"/><!-- 将doBefore切入 切点配置的方法中 -->
            <aop:after method="doAfter" pointcut-ref="businessService"/>
            <aop:around method="doAround" pointcut-ref="businessService"/>
            <aop:after-returning method="doAfterReturning" pointcut-ref="businessService"/>
            <aop:after-throwing method="doAfterThrowing" pointcut-ref="businessService" throwing="ex"/> 
        </aop:aspect> 
    </aop:config>
</beans>

如果只配置doBefore、doAfter,只切入这两个方法的话,执行结果如图

 

posted @ 2018-03-06 14:14  澡堂麦霸  阅读(177)  评论(0编辑  收藏  举报