Spring AOP的基本使用 Demo

本文通过一个实际的Spring AOP案例,介绍了如何使用AOP进行方法增强,包括前置通知、后置通知和环绕通知,并展示了引入功能如何将Yinru接口类注入到JiSuanQiImpl中。详细步骤和打印结果有助于理解AOP的实际应用。
摘要由CSDN通过智能技术生成

这个Demo是个Demo,基于main启动

启动配置类

@Configuration
@ComponentScan("yuanma.xxx")
//@Import(ImportTest.class)
@EnableAspectJAutoProxy //开启AOP
public class BeanConfig {
}

启动测试类

public class AOPTestApp {


    public static void main(String[] args) {

       //xml();
        ann();
    }

    /**
     * 基于注解的入口
     */
    public static void ann() {

        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(BeanConfig.class);
        JiSuanQi jiSuanQiImpl = (JiSuanQi) context.getBean("jiSuanQiImpl");
        jiSuanQiImpl.jia(2,2);
    }
}

被加强的类

/**
 * 计算器
 */
public interface JiSuanQi {

    int jia(int a, int b);
    int jian(int a, int b);
    int cheng(int a, int b);
    int chu(int a, int b);
}

/**
 * 计算器
 */
@Component
public class JiSuanQiImpl implements JiSuanQi {

    @Override
    public int jia(int a, int b) {
        System.out.println("执行了a+b");
        return a + b;
    }

    @Override
    public int jian(int a, int b) {
        System.out.println("执行了a-b");
        return a-b;
    }

    @Override
    public int cheng(int a, int b) {
        System.out.println("执行了a*b");
        return a*b;
    }

    @Override
    public int chu(int a, int b) {
        System.out.println("执行了a/b");
        return a/b;
    }
}

切面类

切面类就是定义增强代码的


/**
 * 增强计算器的切面
 */
@Component
@Aspect
public class JisuanqiAspect {


    @Pointcut("execution(* yuanma.leiqiang.aop..*(..))")
    public void pointCut() {}

    @Before(value = "pointCut()")
    public void before(JoinPoint joinPoint) throws Exception{
        String name = joinPoint.getSignature().getName();
        System.out.println("Before增强了方法"+ name);

    }

    @After(value = "pointCut()")
    public void after(JoinPoint joinPoint) throws Exception{
        String name = joinPoint.getSignature().getName();
        System.out.println("After增强了方法"+ name);

    }

    @AfterReturning(value = "pointCut()", returning = "result")
    public void afterReturning(JoinPoint joinPoint, Object result) throws Exception{
        String name = joinPoint.getSignature().getName();
        System.out.println("After增强了方法"+ name + "结果为"+result);

    }

    @AfterThrowing(value = "pointCut()")
    public void afterThrowing(JoinPoint joinPoint) throws Exception{
        String name = joinPoint.getSignature().getName();
        System.out.println("方法出现了异常"+ name);

    }

    @Around(value = "pointCut()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable{
        String name = pjp.getSignature().getName();
        System.out.println("环绕通知=>方法执行前"+ name);

        Object object = pjp.proceed(pjp.getArgs());//执行我们的方法

        System.out.println("环绕通知=>方法执行后"+ name);
        return object;
    }
}

启动后的打印结果

环绕通知=>方法执行前jia // 环绕通知前 方法执行了
Before增强了方法jia  //前置通知执行了
执行了a+b  //原方法执行了
环绕通知=>方法执行后jia //环绕通知后 方法执行了
无返回值After增强了方法jia  //后置通知 不带返回值的方法执行
带返回值After增强了方法jia结果为4   //后置通知 带返回值的方法执行

AOP的引入功能

可以直接将一个类引入被增强的类,例如A类被AOP增强,可以使用AOP的引入功能,引入B类,在getBean(“a”)从IOC中获取A的实例对象,可以强转成B类,这样就能使用B类的方法了。

引入类

该类必须是接口类

/**
 * AOP切面用来引入的类
 */
public interface Yinru {

    void yinru();
}

引入类的实现类

/**
 * AOP切面用来引入的类
 */
public class YinruImpl implements Yinru {

    public void yinru() {
        System.out.println("引入了一个方法");
    }
}

切面的写法

@Component
@Aspect
public class JisuanqiAspect {

    //AOP功能==》引入方式的使用

    @DeclareParents(value = "yuanma.leiqiang.aop.JiSuanQiImpl",  //这个是被增强的实现类
            defaultImpl = YinruImpl.class  //这个是引入类的实现类
    )
    public static Yinru yinru; //注意该类的定义方式,静态和公共的,这个是引入类的接口类
    
}

测试启动类


public class AOPTestApp {


    public static void main(String[] args) {

       //xml();
        ann();
    }

    /**
     * 基于注解的入口
     */
    public static void ann() {

        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(BeanConfig.class);
        JiSuanQi jiSuanQiImpl = (JiSuanQi) context.getBean("jiSuanQiImpl");
        jiSuanQiImpl.jia(2,2);
        Yinru yinru = (Yinru) jiSuanQiImpl; //这里强转成引入类
        yinru.yinru();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT界的老菜鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值