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连支持一下,创造不易您们的支持是我的动力🤞


目录
相关文章
|
3月前
ext portal+dwr+spring实现个性主页面拖拉效果的核心代码
ext portal+dwr+spring实现个性主页面拖拉效果的核心代码
52 6
|
2月前
|
缓存 监控 Java
|
3月前
|
Java BI API
spring boot 整合 itextpdf 导出 PDF,写入大文本,写入HTML代码,分析当下导出PDF的几个工具
这篇文章介绍了如何在Spring Boot项目中整合iTextPDF库来导出PDF文件,包括写入大文本和HTML代码,并分析了几种常用的Java PDF导出工具。
691 0
spring boot 整合 itextpdf 导出 PDF,写入大文本,写入HTML代码,分析当下导出PDF的几个工具
|
3月前
|
存储 Java 程序员
SpringIOC和DI的代码实现,Spring如何存取对象?@Controller、@Service、@Repository、@Component、@Configuration、@Bean DI详解
本文详细讲解了Spring框架中IOC容器如何存储和取出Bean对象,包括五大类注解(@Controller、@Service、@Repository、@Component、@Configuration)和方法注解@Bean的用法,以及DI(依赖注入)的三种注入方式:属性注入、构造方法注入和Setter注入,并分析了它们的优缺点。
44 0
SpringIOC和DI的代码实现,Spring如何存取对象?@Controller、@Service、@Repository、@Component、@Configuration、@Bean DI详解
|
5月前
|
存储 缓存 Java
面试问Spring循环依赖?今天通过代码调试让你记住
该文章讨论了Spring框架中循环依赖的概念,并通过代码示例帮助读者理解这一概念。
面试问Spring循环依赖?今天通过代码调试让你记住
|
5月前
|
SQL 数据库
Spring5入门到实战------13、使用JdbcTemplate操作数据库(批量增删改)。具体代码+讲解 【下篇】
这篇文章是Spring5框架的实战教程,深入讲解了如何使用JdbcTemplate进行数据库的批量操作,包括批量添加、批量修改和批量删除的具体代码实现和测试过程,并通过完整的项目案例展示了如何在实际开发中应用这些技术。
Spring5入门到实战------13、使用JdbcTemplate操作数据库(批量增删改)。具体代码+讲解 【下篇】
|
5月前
|
XML Java 数据格式
Spring5入门到实战------11、使用XML方式实现AOP切面编程。具体代码+讲解
这篇文章是Spring5框架的AOP切面编程教程,通过XML配置方式,详细讲解了如何创建被增强类和增强类,如何在Spring配置文件中定义切入点和切面,以及如何将增强逻辑应用到具体方法上。文章通过具体的代码示例和测试结果,展示了使用XML配置实现AOP的过程,并强调了虽然注解开发更为便捷,但掌握XML配置也是非常重要的。
Spring5入门到实战------11、使用XML方式实现AOP切面编程。具体代码+讲解
|
5月前
|
Java 数据安全/隐私保护 Spring
揭秘Spring Boot自定义注解的魔法:三个实用场景让你的代码更加优雅高效
揭秘Spring Boot自定义注解的魔法:三个实用场景让你的代码更加优雅高效
|
5月前
|
监控 Java 测试技术
代码更新不停机:Spring Boot应用实现零停机更新的新质生产力
【8月更文挑战第14天】在快节奏的软件开发与运维环境中,应用的持续部署与更新成为了提升竞争力的关键。传统的停机更新方式不仅影响用户体验,还可能造成业务中断和数据丢失。因此,实现Spring Boot应用的零停机更新成为了现代软件开发团队追求的目标。本文将深入探讨如何通过一系列技术和策略,在不影响服务可用性的前提下,实现Spring Boot应用的平滑升级。
460 2
|
5月前
|
XML 数据库 数据格式
Spring5入门到实战------14、完全注解开发形式 ----JdbcTemplate操作数据库(增删改查、批量增删改)。具体代码+讲解 【终结篇】
这篇文章是Spring5框架的实战教程的终结篇,介绍了如何使用注解而非XML配置文件来实现JdbcTemplate的数据库操作,包括增删改查和批量操作,通过创建配置类来注入数据库连接池和JdbcTemplate对象,并展示了完全注解开发形式的项目结构和代码实现。
Spring5入门到实战------14、完全注解开发形式 ----JdbcTemplate操作数据库(增删改查、批量增删改)。具体代码+讲解 【终结篇】