Spring-AOP综合代码演示讲解

简介: Spring-AOP综合代码演示讲解

😀前言

本篇的Spring-AOP系类文章的最后一篇讲解了spring-AOP的综合代码演示其中包括了基于注解和基于xml二种方式使大家方便理解

🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉😉


😘Spring-AOP综合代码演示讲解

  1. 请编写一个 Cal 接口

方法 cal1(int n) 计算 1+2…+n

方法 cal2(int n) 计算 1 * 2 * … * n

  1. 实现类 MyCal implements Cal
  2. 请分别使用注解方式 / XML 配置方式 完成 AOP 编程

(1) 在执行 cal1 前打印开始执行的时间,在 执行完后打印时间

(2) 在执行 cal2 前打印开始执行的时间,在 执行完后打印

😊基于注解

创建Cal.java接口

public interface Cal {
    public int cal1(int n);
    public int cal2(int n);
}

创建MyCal.java

@Component //将Cal对象作为组件,注入到Spring容器
public class MyCal implements Cal {
    @Override
    public int cal1(int n) {
        int res = 1;
        for (int i = 1; i <= n; i++) {
            res += i;
        }
        System.out.println("cal1 执行结果=" + res);
        return res;
    }
    @Override
    public int cal2(int n) {
        int res = 1;
        for (int i = 1; i <= n; i++) {
            res *= i;
        }
        System.out.println("cal2 执行结果=" + res);
        return res;
    }
}

创建MyCalAOP类

@Aspect //MyCalAOP 是一个切面类
@Component //MyCalAOP/对象 作为组件注入到spring容器
public class MyCalAOP {
    //前置通知
    //这里注意,如果目标类和切面类,在同一个包,可以省略包名
    //因为cal1和cal2方法,都要去输出开始执行时间,因此使用MyCal.*
    @Before(value = "execution(public int MyCal.*(int))")
    public void calStart(JoinPoint joinPoint) {
        Signature signature = joinPoint.getSignature();
        System.out.println(signature.getName() + " 执行, 开始执行时间=" + System.currentTimeMillis());
    }
    //返回通知
    //这里注意,如果目标类和切面类,在同一个包,可以省略包名
    //因为cal1和cal2方法,都要去输出开始执行时间,因此使用MyCal.*
    @AfterReturning(value = "execution(public int MyCal.*(int))")
    public void calEnd(JoinPoint joinPoint) {
        Signature signature = joinPoint.getSignature();
        System.out.println(signature.getName() + " 执行, 结束时间=" + System.currentTimeMillis());
    }
}

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/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">
    <!--扫描指定包-->
    <context:component-scan
            base-package="com.spring.aop.homework"/>
    <!--启用基于注解的AOP功能-->
    <aop:aspectj-autoproxy/>
</beans>

创建测试类

public class TestMyCalAOP {
    @Test
    public void testMyCalByAnnotation() {
        //得到spring容器
        ApplicationContext ioc =
                new ClassPathXmlApplicationContext("beans10.xml");
        Cal cal = ioc.getBean(Cal.class);
        cal.cal1(10);
        System.out.println("===========");
        cal.cal2(5);
    }
}

😉基于xml配置

创建Cal.java接口

public interface Cal {
    public int cal1(int n);
    public int cal2(int n);
}

创建MyCal.java

public class MyCal implements Cal {
    @Override
    public int cal1(int n) {
        int res = 1;
        for (int i = 1; i <= n; i++) {
            res += i;
        }
        System.out.println("cal1 执行结果=" + res);
        return res;
    }
    @Override
    public int cal2(int n) {
        int res = 1;
        for (int i = 1; i <= n; i++) {
            res *= i;
        }
        System.out.println("cal2 执行结果=" + res);
        return res;
    }
}

创建MyCalAOP类

public class MyCalAOP {
    //前置通知
    public void calStart(JoinPoint joinPoint) {
        Signature signature = joinPoint.getSignature();
        System.out.println(signature.getName() + " 执行, 开始执行时间=" + System.currentTimeMillis());
    }
    //返回通知
    public void calEnd(JoinPoint joinPoint) {
        Signature signature = joinPoint.getSignature();
        System.out.println(signature.getName() + " 执行, 结束时间=" + System.currentTimeMillis());
    }
}

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 https://www.springframework.org/schema/aop/spring-aop.xsd">
    <!--配置MyCalAOP-bean-->
    <bean class="com.spring.aop.homework.xml.MyCalAOP" id="myCalAOP" />
    <!--配置MyCal-bean-->
    <bean class="com.spring.aop.homework.xml.MyCal" id="myCal"/>
    <!--配置切面类-->
    <aop:config>
        <!--配置切入点表达式-->
        <aop:pointcut id="myPointCut" expression="execution(public int com.spring.aop.homework.xml.MyCal.*(int))"/>
        <!--配置前置,返回-->
        <aop:aspect ref="myCalAOP" order="10">
            <aop:before method="calStart" pointcut-ref="myPointCut"/>
            <aop:after-returning method="calEnd" pointcut-ref="myPointCut"/>
        </aop:aspect>
    </aop:config>
</beans>

创建测试类

public class TestMyCalAOP {
    @Test
    public void testMyCalByAnnotation() {
        //得到spring容器
        ApplicationContext ioc =
                new ClassPathXmlApplicationContext("beans11.xml");
        Cal cal = ioc.getBean(Cal.class);
        cal.cal1(10);
        System.out.println("===========");
        cal.cal2(5);
    }
}
``

😄总结

本篇讲解了spring-AOP的综合代码演示其中包括了基于注解和基于xml二种方式使大家方便理解

😍Spring-AOP系类文章

第一篇-> Spring-AOP的基本介绍以及通过先动态代理方式实现

第二篇-> Spring-动态代理深入了解

第三篇-> 再次分析-提出 Spring AOP-真正的AOP

第四篇-> spring-aop的切入表达式和JoinPoint的使用以及怎么返回通知获取结果和在异常通知中获取异常还有环绕通知

第五篇-> 演示spring AOP的切入表达式重用和优先级问题以及怎么实现基于xml的AOP

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁

希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻

如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞


目录
相关文章
|
4月前
|
移动开发 前端开发 Java
使用ipaguard插件对Spring Boot程序进行代码混淆
使用ipaguard插件对Spring Boot程序进行代码混淆
47 0
|
6月前
|
Java 数据库连接 数据库
利用spring将mybatils集成,从而减少代码
利用spring将mybatils集成,从而减少代码
|
8月前
|
Java 应用服务中间件 Maven
解析Spring Boot中的Profile:配置文件与代码的双重掌控
解析Spring Boot中的Profile:配置文件与代码的双重掌控
|
2月前
|
存储 Java 关系型数据库
Spring Batch学习记录及示例项目代码
Spring Batch学习记录及示例项目代码
|
7月前
|
缓存 监控 安全
Spring AOP 详细深入讲解+代码示例
Spring AOP(Aspect-Oriented Programming)是Spring框架提供的一种面向切面编程的技术。它通过将横切关注点(例如日志记录、事务管理、安全性检查等)从主业务逻辑代码中分离出来,以模块化的方式实现对这些关注点的管理和重用。 在Spring AOP中,切面(Aspect)是一个模块化的关注点,它可以跨越多个对象,例如日志记录、事务管理等。切面通过定义切点(Pointcut)和增强(Advice)来介入目标对象的方法执行过程。 切点是一个表达式,用于匹配目标对象的一组方法,在这些方法执行时切面会被触发。增强则定义了切面在目标对象方法执行前、执行后或抛出异常时所
2224 0
|
3月前
|
IDE Java 应用服务中间件
基于Spring+mybatis的SSM超市消费积分管理系统代码实现含演示站
这是一个SSM超市消费积分管理系统。有2个角色:买家角色和管理员角色,现在开始分角色介绍下功能。买家角色核心功能有买家登录,查看网站首页,查看蔬菜详情,加入购物车,提交订单,查看我的订单。管理员角色核心功能有管理员登录,用户管理,管理员管理,商品管理,一级分类管理,二级分类管理,订单管理。更多的功能可以去演示站查看。
基于Spring+mybatis的SSM超市消费积分管理系统代码实现含演示站
|
8月前
|
设计模式 Java Spring
Spring Boot使用责任链模式优化业务逻辑中的if-else代码
在开发过程中,我们经常会遇到需要根据不同的条件执行不同的逻辑的情况。传统的做法是使用if-else语句来进行条件判断,但是随着业务逻辑的复杂化,if-else语句会变得越来越臃肿,难以维护和扩展。这时候,我们可以考虑使用责任链模式来优化代码结构,使得代码更加清晰、可扩展和易于维护。
|
4月前
|
Java Maven 数据安全/隐私保护
代码优雅升级,提升开发效率:挖掘Spring AOP配置的学习宝藏!
代码优雅升级,提升开发效率:挖掘Spring AOP配置的学习宝藏!
|
5月前
|
SQL Java 关系型数据库
【Spring Boot+Thymeleaf+MyBatis+mysql】实现电子商务平台实战(附源码)持续更新~~ 包括sql语句、java、html代码
【Spring Boot+Thymeleaf+MyBatis+mysql】实现电子商务平台实战(附源码)持续更新~~ 包括sql语句、java、html代码
52 0
|
5月前
|
XML Java 数据格式
spring通过文件属性注入bean和基于xml的bean的自动装配以及spring-eel表达式的使用加代码合集
spring通过文件属性注入bean和基于xml的bean的自动装配以及spring-eel表达式的使用加代码合集
48 0