Spring AOP基于xml、注解方式实现

首先在pom.xml文件中添加坐标

<dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.1.2.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.2</version>
        </dependency>
    </dependencies>

一、基于xml文件方式实现aop切面

1、创建目标类

package com.qgq.test;

/**
 * 需要增强的类
 */
public class StrongMain {
    public void testMain(){
        System.out.println("执行某种操作。。。。。");
    }
}

2、创建切面类并编写对应增强方法

package com.qgq.test;

import org.aspectj.lang.ProceedingJoinPoint;

/**
 * 切面类
 */
public class MyAspect {
    /**
     * 前置增强
     */
    public void before(){
        System.out.println("执行前置增强。。。。");
    }

    /**
     * 后置增强
     */
    public void afterReturning(){
        System.out.println("执行后置增强。。。。");
    }

    /**
     * 异常增强
     */
    public void afterThrow(){
        System.out.println("执行异常增强。。。。");
    }

    /**
     * 环绕增强
     * @param pjp 切点对象
     * @return
     */
    public Object around(ProceedingJoinPoint pjp){
        try {
            System.out.println("上环绕增强。。。。");
            pjp.proceed();
            System.out.println("下环绕增强。。。。");
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        return pjp;
    }

    /**
     *  最终增强 相当于try..catch..finally中的finally,无论是否异常都会执行
     */
    public void after(){
        System.out.println("执行最终增强。。。。");
    }
}

3、创建xml配置文件,resource右键 new->XML Configuration File,选择Spring Config,并创建aop命名空间(beans标签中第三行、第五行)

<?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">

    
</beans>

4、配置容器管理及aop切点

最终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">


    <!--将需要增强的类交给ico容器管理-->
    <bean id="strongMain" class="com.qgq.test.StrongMain"></bean>

    <!--将需要切面类交给ico容器管理-->
    <bean id="myAspect" class="com.qgq.test.MyAspect"></bean>
    <!--aop配置织入-->
    <aop:config>
        <!--将切点提取出来,下方增强直接pointcut-ref调用-->
        <!--此处第一个*代表任意修饰符及返回值,第二个*代表test包下所有类,第三个*代表所有方法-->
        <!--(..)代表任意参数-->
        <aop:pointcut id="pointcut" expression="execution(* com.qgq.test.*.*(..))"></aop:pointcut>
        <aop:aspect ref="myAspect">
            <!--前置增强-->
            <aop:before method="before" pointcut-ref="pointcut"></aop:before>
            <!--后置增强-->
            <aop:after-returning method="afterReturning" pointcut-ref="pointcut"></aop:after-returning>
            <!--环绕增强-->
            <aop:around method="around" pointcut-ref="pointcut"></aop:around>
            <!--异常增强-->
            <aop:after-throwing method="afterThrow" pointcut-ref="pointcut"></aop:after-throwing>
            <!--最终增强-->
            <aop:after method="after" pointcut-ref="pointcut"></aop:after>
        </aop:aspect>
    </aop:config>
</beans>

5、创建一个类用于执行测试

package com.qgq.test;

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

public class Test {
    public static void main(String[] args){
        //加载配置文件
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("ApplicationContext.xml");
        //从ioc容器中获取bean
        StrongMain strongMain = (StrongMain)applicationContext.getBean("strongMain");
        //调用增强后的方法
        strongMain.testMain();
    }
}

注意:异常增强正常情况下不会执行,可以在目标方法中手动创造个异常,如经典的int i=1/0

    public void testMain(){
        int i = 1 / 0;
        System.out.println("执行某种操作。。。。。");
    }

执行一下,触发异常增强,(其他增强可以自己测一下,这里不做过多阐述)

 

二、基于注解方式实现aop切面

1、创建目标类

package com.qgq.test02;

import org.springframework.stereotype.Component;

//将目标类交给ico容器管理
@Component("strongMain02")
public class StrongMain02 {
    public void testMain(){
        System.out.println("执行某种操作。。。。。");
    }
}

2、创建切面类并编写对应增强方法

package com.qgq.test02;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
//将需要切面类交给ico容器管理
@Component("myAspect02")
//告诉spring,当前类为切面类
@Aspect
public class MyAspect02 {
    /**
     * 提取切点,下方增强方法直接使用
     */
    @Pointcut("execution(* com.qgq.test02.*.*(..))")
    public void pointcut(){

    }

    /**
     * 前置增强,注解中参数为调用的切点方法,也可以写MyAspect02.pointcut()
     */
    @Before("pointcut()")
    public void before(){
        System.out.println("执行前置增强。。。。");
    }

    /**
     * 后置增强
     */
    @AfterReturning("pointcut()")
    public void afterReturning(){
        System.out.println("执行后置增强。。。。");
    }

    /**
     * 异常增强
     */
    @AfterThrowing("pointcut()")
    public void afterThrow(){
        System.out.println("执行异常增强。。。。");
    }

    /**
     * 环绕增强
     * @param pjp 切点对象
     * @return
     */
    @Around("pointcut()")
    public Object around(ProceedingJoinPoint pjp){
        try {
            System.out.println("上环绕增强。。。。");
            pjp.proceed();
            System.out.println("下环绕增强。。。。");
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        return pjp;
    }


    /**
     * 最终增强
     */
    @After("pointcut()")
    public void after(){
        System.out.println("执行最终增强。。。。");
    }
}

3、创建xml配置文件,resource右键 new->XML Configuration File,选择Spring Config,并创建aop命名空间(beans标签中第三行、第五行),xml文件中仅需扫描包、开启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"
       xmlns:context="http://www.springframework.org/schema/context"
       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">
    
    <!--扫描包-->
    <context:component-scan base-package="com.qgq.test02" />
    <!--开启aop自动代理,若不开启无法执行增强方法-->
    <aop:aspectj-autoproxy />
</beans>

5、创建一个类用于执行测试

package com.qgq.test02;

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

public class Test02 {
    public static void main(String[] args){
        //加载配置文件
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("ApplicationContext.xml");
        //从ioc容器中获取bean
        StrongMain02 strongMain02 = (StrongMain02)applicationContext.getBean("strongMain02");
        //调用增强后的方法
        strongMain02.testMain();
    }
}

本文仅测试使用aop,具体实现可以根据项目所需。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值