Spring学习笔记06-AOP(三)(第八周)

 

第八周

所花时间

25h左右

代码量

2000行左右

博客量

6篇

学到的知识点

世界疫情的可视化图表,爬取世界疫情的数据,Spring中的AOP

 

摘要:前两天学习了基于注解配置AOP的方法,今天学习了通过配置文件来配置AOP的方法,两者没有本质的区别,但是通过使用,感觉通过配置文件来配置AOP更好理解,而且使用起来更简易。下面通过简单实例来说明

一、导入所依赖的相关jar包

二、核心部分:在xml文件中配置相关的bean以及AOP

<?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-4.3.xsd">

    <!-- 配置bean -->
    <bean id="yunsuan" class="peizhiwenjianAOP.YunsuanImpl"></bean>

    <!-- 配置切面的bean -->
    <bean id="qiemian" class="peizhiwenjianAOP.Qiemian"></bean>
    <bean id="qiemianyouxianji"
        class="peizhiwenjianAOP.QiemianYouxianji"></bean>
        
    <!-- 配置AOP -->
    <aop:config>
        <!-- 配置切点表达式 -->
        <aop:pointcut
            expression="execution(* peizhiwenjianAOP.*.*(int,int))" id="pointcut" />
        <!-- 配置切面及通知 -->
        <aop:aspect ref="qiemian" order="2">
            <aop:before method="before" pointcut-ref="pointcut" />
            <aop:after method="after" pointcut-ref="pointcut" />
            <aop:after-throwing method="afterThrowing"
                pointcut-ref="pointcut" throwing="e" />
            <aop:after-returning method="afterReturning"
                pointcut-ref="pointcut" returning="result" />
            <!-- <aop:around method="around" pointcut-ref="pointcut"/> -->
        </aop:aspect>
        <aop:aspect ref="qiemianyouxianji" order="1">
            <aop:before method="youxianji" pointcut-ref="pointcut" />
        </aop:aspect>
    </aop:config>
</beans>
peizhiwenjianAOP.xml

三、其他部分代码

package peizhiwenjianAOP;

public interface Yunsuan {
    
    int add(int i,int j);
    int sub(int i,int j);
    int mul(int i,int j);
    int div(int i,int j);

}
Yunsuan.java
package peizhiwenjianAOP;

import org.springframework.stereotype.Component;

@Component
public class YunsuanImpl implements Yunsuan {

    @Override
    public int add(int i, int j) {
        //System.out.println("begin"+i+","+j);
        int result=i+j;
        //System.out.println("end"+result);
        return result;
    }

    @Override
    public int sub(int i, int j) {
        //System.out.println("begin"+i+","+j);
        int result=i-j;
        //System.out.println("end"+result);
        return result;
    }

    @Override
    public int mul(int i, int j) {
        //System.out.println("begin"+i+","+j);
        int result=i*j;
        //System.out.println("end"+result);
        return result;
    }

    @Override
    public int div(int i, int j) {
        //System.out.println("begin"+i+","+j);
        int result=i/j;
        //System.out.println("end"+result);
        return result;
    }

}
YunsuanImpl .java
package peizhiwenjianAOP;

import java.util.Arrays;
import java.util.List;

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


public class Qiemian {


    public void before(JoinPoint joinpoint) {
        String name=joinpoint.getSignature().getName();
        List<Object> args=Arrays.asList(joinpoint.getArgs());
        System.out.println(name+" begin "+args);
    }

    public void after(JoinPoint joinpoint) {
        String name=joinpoint.getSignature().getName();
        //不能返回目标方法执行的结果
        //List<Object> args=Arrays.asList(joinpoint.getArgs());
        System.out.println(name+" end ");
    }

    public void afterReturning(JoinPoint joinpoint,Object result) {
        String name=joinpoint.getSignature().getName();
        System.out.println(name+" end with " + result);
    }

    public void afterThrowing(JoinPoint joinpoint,Exception e) {
        String name=joinpoint.getSignature().getName();
        System.out.println(name+" exception " + e);
    }


    public Object around(ProceedingJoinPoint pdj) {
        Object result=null;
        String name=pdj.getSignature().getName();
        //执行目标方法
        try {
            //前置通知
            System.out.println(name+" begin with " + Arrays.asList(pdj.getArgs()));
            result = pdj.proceed();
            //后置通知
            System.out.println(name+" end with " + Arrays.asList(pdj.getArgs()));
        } catch (Throwable e) {
            // TODO 自动生成的 catch 块
            //异常通知
            System.out.println(name+" exception " + e);
            throw new RuntimeException(e);
        }
        //后置通知
        System.out.println(name+" end ");
        return result;
    }
}
Qiemian.java
package peizhiwenjianAOP;


public class QiemianYouxianji {
    
    public void youxianji() {
         System.out.println("我最快");
    }

}
QiemianYouxianji .java
package peizhiwenjianAOP;

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

public class Main {

    public static void main(String[] args) {
        ApplicationContext c=new ClassPathXmlApplicationContext("peizhiwenjianAOP.xml");
        Yunsuan yunsuan=c.getBean(Yunsuan.class);
        int result=yunsuan.add(3, 0);
        System.out.println("result="+result);
        int re=yunsuan.div(3, 0);
        System.out.println("result="+re);
    }
}
Main .java

原文地址:https://www.cnblogs.com/MoooJL/p/12678405.html