Spring AOP implementation (5)

AOP's fifth implementation of -xml notice
IUserServcie.java

package com.qfedu.aop05;

import java.util.List;

public interface IUserService {

    /**
     * 获取所有的用户对象列表
     * @return
     */
    List<Object> getAllUser();

    /**
     * 保存用户
     * @param user
     * @return
     */
    boolean saveUser(Object user);

    /**
     * 根据用户uid删除该uid对应的用户信息
     * @param uid
     * @return
     */
    boolean deleteUser(int uid);

    /**
     * 更新指定用户信息
     * @param obj
     * @return
     */
    boolean updateUser(Object obj);


    void getUserByUid();
}

UserServiceImpl.java

package com.qfedu.aop05;

import java.util.ArrayList;
import java.util.List;

public class UserServiceImpl implements IUserService {

    @Override
    public List<Object> getAllUser() {
        System.out.println("--------getAllUser----------");
        return new ArrayList<>();
    }

    @Override
    public boolean saveUser(Object user) {
        System.out.println("--------saveUser----------");
        return true;
    }

    @Override
    public boolean deleteUser(int uid) {
        System.out.println("--------deleteUser----------");
        return false;
    }

    @Override
    public boolean updateUser(Object obj) {
        System.out.println("--------updateUser----------");
        return true;
    }

    @Override
    public void getUserByUid() {
        System.out.println("--------getUserByUid----------");
        System.out.println(1 / 0);
        String str = null;
        System.out.println(str.length());
    }
}

MyAspect.java

package com.qfedu.aop05;

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

import java.util.Arrays;

/**
 * 五种通知方式来实现aop
 *  1. 前置通知,在业务方法之前执行
 *  2. 后置通知,在业务方法之后执行
 *  3. 环绕通知,同时在业务方法的前后执行
 *  4. 带有返回值通知,可以拿到业务方法的返回值
 *  5. 异常通知,可以捕获业务方法中的异常对象
 *
 *      注意:如果同时配置来所有的通知方式,则执行顺序依次为:
 *          before>around before>业务方法 >after returning > around after > after
 *          before>around before>业务方法 >after throwing >  after
 *
 *          ps. 使用注解的话是环绕通知proceed方法之前部分先执行,使用xml配置的话取决于aop:before和aop:around的配置顺序
 */
public class MyAspect {


    public void myBefore(JoinPoint jp){

//        System.out.println("args " + Arrays.toString(jp.getArgs()));
//        System.out.println("toString " + jp.toString());
//        System.out.println("getTarget " + jp.getTarget());
        System.out.println("this is before.");
    }

    public void myAfter(JoinPoint jp){
        System.out.println("this is after.");
    }

    public Object myAround(ProceedingJoinPoint pjp){
        try {
            System.out.println("this is around before");

            Object obj = pjp.proceed();

            System.out.println("this is around after " + obj);

            return obj;
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }

        return null;
    }

    /**
     * 带有返回值的通知
     * @param jp
     * @param obj 配置文件中的obj
     */
    public void myReturn(JoinPoint jp, Object obj){
        System.out.println("this is after returning " + obj);
    }

    public void myThrow(JoinPoint jp, Throwable e){
        System.out.println("this is after throwing " + e.getMessage());
    }
}

beans.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="us" class="com.qfedu.aop05.UserServiceImpl"/>
    <bean id="ma" class="com.qfedu.aop05.MyAspect" />

    <aop:config proxy-target-class="true">
        <aop:aspect ref="ma">
            <aop:pointcut id="mpc" expression="execution(* com.qfedu.aop05.*.*(..))" />

            <aop:before method="myBefore" pointcut-ref="mpc"/>
            <aop:after method="myAfter" pointcut-ref="mpc" />
            <aop:around method="myAround" pointcut-ref="mpc" />
            <aop:after-returning method="myReturn" pointcut-ref="mpc" returning="obj" />
            <aop:after-throwing method="myThrow" pointcut-ref="mpc" throwing="e" />
        </aop:aspect>
    </aop:config>
</beans>

TestAOP05.java

package com.qfedu.aop05;

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

public class TestAOP05 {

    @Test
    public void test(){
        ApplicationContext ac = new ClassPathXmlApplicationContext("com/qfedu/aop05/beans.xml");

        IUserService us = ac.getBean("us", IUserService.class);

        us.updateUser(new Object());
        us.getAllUser();
        us.saveUser(new Object());
        us.deleteUser(1);
        us.getUserByUid();
    }
}

Released six original articles · won praise 8 · views 724

Guess you like

Origin blog.csdn.net/zpz2001/article/details/104553144