AOP的第五种实现方式-xml通知(#千锋#)

1.IUserServcie.java

package com.zy.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();

}

2.UserServiceImpl.java

package com.zy.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());

    }

}

3.MyAspect.java

package com.zy.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());

    }

}

4.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.zy.aop05.UserServiceImpl"/>

    <bean id="ma" class="com.zy.aop05.MyAspect" />

    <aop:config proxy-target-class="true">

        <aop:aspect ref="ma">

            <aop:pointcut id="mpc" expression="execution(* com.zy.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>

5.TestAOP05.java

package com.zy.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/zy/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();

    }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。