Spring(六)AOP-面向切面编程

Posted on 2021-04-11 23:08  MissRong  阅读(60)  评论(0)    收藏  举报

Spring(六)AOP-面向切面编程

一、AOP介绍

 相关术语说明:  

 二、准备

1、需要引入的jar包

 2、applicationContext.xml中需要配置

引入aop约束:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       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
                          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
</beans>

三、五种通知类型

举例:

首先是 .xml 文件:

.xml文件需要加入:
<bean id="man" class="com.icss.controller.Man"></bean>
    <bean id="fbi" class="com.icss.controller.FBI"></bean>
    <aop:config>
        <!--切入点(这里是 Man类中的 )-->
        <!-- <aop:pointcut id = "poincut1" expression = "execution(* com.icss.controller.Man.qq(..))"/>-->
        <aop:pointcut id = "pointcut1" expression = "execution(* com.icss.controller.Man.qq(..))"/>
        <aop:pointcut id = "pointcut2" expression = "execution(* com.icss.controller.Man.mm(..))"/>
        <aop:pointcut id = "pointcut4" expression = "execution(* com.icss.controller.Man.errfinal(..))"/>
        <!--<aop:pointcut id = "pointcut3" expression = "execution(* com.icss.controller.Man.err(..))"/>-->
        <aop:aspect ref = "fbi">
         <!--这里是 FBI类中的-->
            <!--前置通知-->
            <aop:before method = "monitoring" pointcut-ref="pointcut1"></aop:before>
            <!--后置通知-->
            <aop:after-returning method="monitoringStop" pointcut-ref="pointcut1"></aop:after-returning>
            <!--环绕通知-->
            <aop:around method = "testArround" pointcut-ref = "pointcut2"></aop:around>
            <!--异常通知-->
            <!--<aop:after-throwing method="testThrowing" pointcut-ref="pointcut3" throwing="err"></aop:after-throwing>-->
            <!--最终通知 :无论是否有异常 总会将方法执行完毕-->
            <aop:after method="testAfter" pointcut-ref="pointcut4" ></aop:after>
        </aop:aspect>
    </aop:config>

注:这里的qq(...)是一个方法,下面的*(..)代表所有的方法。

public class FBI {
    public void monitoring(JoinPoint joinPoint){
        System.out.println("查看到某人正在" + joinPoint.getSignature().getName() + "活动");
    }
    public void monitoringStop(JoinPoint joinPoint) {
        System.out.println("查看到某人停止" + joinPoint.getSignature().getName() + "活动");
    }
    public void testArround(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("不准动!");
        joinPoint.proceed();
    }
    public void testThrowing(Object err) {
        System.out.println("抛出的异常是:" + err);
    }
    public void testAfter() {
        System.out.println("计算完毕");
    }
}
public class Man {
    public void qq() {
        System.out.println("男人正在聊QQ");
    }

    public void mm() {
        System.out.println("男人正在泡...");
    }
//    public void err() {
//        System.out.println("做算术:");
//        System.out.println(10/0);
//        System.out.println("计算完毕");
//    }
    public void errfinal() {
        System.out.println("做算术");
        System.out.println(10/0);
    }
}

四、注解方式

举例:

.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:context="http://www.springframework.org/schema/context"
       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
                          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <bean id="man" class="com.icss.controller.Man"></bean>
    <bean id="fbi" class="com.icss.controller.FBI"></bean>
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>

FBI类:

@Aspect //声明切面
public class FBI { //代理对象
    @Before("execution(* com.icss.controller.Man.qq())")
    public void monitoring(JoinPoint joinPoint){
        System.out.println("查看到某人正在" + joinPoint.getSignature().getName() + "活动");
    }
//    @AfterReturning("execution(* com.icss.controller.Man.qq())")
    public void monitoringStop(JoinPoint joinPoint) {
        System.out.println("查看到某人停止" + joinPoint.getSignature().getName() + "活动");
    }
//    @Around("execution(* com.icss.controller.Man.qq())")
    public void testArround(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("不准动!");
        joinPoint.proceed();
    }
//    @AfterThrowing(value = "execution(* com.icss.controller.Man.qq())", throwing = "err")
    public void testThrowing(Object err) {
        System.out.println("抛出的异常是:" + err);
    }
//    @After(value = "execution(* com.icss.controller.Man.qq())")
    public void testAfter() {
        System.out.println("计算完毕");
    }
}

 

博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3