B057-spring增强 依赖注入 AOP 代理模式 创建Bean

news2024/11/27 23:37:56

目录

      • AOP
        • 概念
        • 代理模式引出
        • AOP实现方式
          • xml方式实现
          • 注解方式实现

AOP

概念

在这里插入图片描述
事务管理:比如可以抽取try catch的重复代码
日志监控:比如业务逻辑前后打印关于当前订单数量的日志,了解业务做了什么
性能监控:比如业务前后打印时间,相减可查看业务跑完所需时间

代理模式引出

在这里插入图片描述
用aop实现扩展功能,
aop用代理模式实现,但是代理模式里的扩展功能还是需要我们自己写,

静态代理:相当于一个中介只代理一个固定的房东的房源,基本不用
动态代理:默认没有,使用的时候动态生成

AOP:以上大方向
SpringAOP:AOP的spring实现方式,用动态代理方式实现。它的实现方式又有两种:jdk,CGLIB,spring自动选择用其中哪种方式,代理类自动生成也不用管,有接口的时候默认使用jdk,没有的时候用cglib(第三方jar包),现在一般service都有接口

AOP实现方式

xml方式实现

1.编写TxManager用来提供业务逻辑外的扩展功能 - 如事务管理

/*我们自己的扩展功能*/
public class TxManager {

    public void open (){
        System.out.println("开启事务");
    }

    public void commit (){
        System.out.println("提交事务");
    }

    public void rollback(Throwable e){
        e.printStackTrace();//处理异常
        System.out.println("回滚事务");
    }

    public void close(){
    System.out.println("关闭事务");
    }

    public void around(ProceedingJoinPoint point){
        try {
            open();
            point.proceed();//执行真正的业务
            commit();
        } catch (Throwable e) {
            e.printStackTrace();
            rollback(e);
        } finally {
            close();
        }
    }
}

2.准备xmlAOP环境,在Spring配置文件中引入头支持以支持aop标签

SpringTest-Context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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">

3.配置的三要素
何时,如在业务的执行前、后、catch
何地,指的是在哪一个方法
做什么,执行我们自定义扩展业务类的方法

面向切面编程,面向扩展功能编程
在这里插入图片描述
其他
spring通过动态代理实现aop,配置aop后只能注入接口,通过接口找到被引用的代理类,Spring容器中就只有代理类没有实现类,

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration//回到当前类的包下 查找当前类名-Context.xml的配置文件
public class SpringTest {

    @Autowired
    IUserService userService;

    @Test
    public void testUser(){
        System.out.println(userService.getClass());
    }
}

SpringTest-Context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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">

    <bean id="userService" class="cn.itsource._03aopxml.service.impl.UserServiceImpl"/>
    <bean id="departmentService" class="cn.itsource._03aopxml.service.impl.DepartmentServiceImpl"/>

    <!--将扩展功能交给Spring容器管理,方便AOP使用-->
    <bean id="txManager" class="cn.itsource._03aopxml.TxManager"/>
    <!--SpringAOP的核心配置-->
    <aop:config>
        <!--配置切点  配置何地 ==在哪一个方法执行
            expression:表达式  通过表达式,我们找在哪一个方法执行
            第一个*:任意返回值
            I*Service:所有以I开头 Service结尾的类(里面的所有方法都加上事物)
            第三个*:任意方法
            save(..):任意参数
        -->
        <!--execution(* cn.itsource._03aopxml.service.impl.UserServiceImpl.save(..))
            execution(* cn.itsource._03aopxml.service.impl.UserServiceImpl.*(..))-->
        <aop:pointcut id="txPoint" expression="execution(* cn.itsource._03aopxml.service.I*Service.*(..))"/>
        <!--配置切面   -->
        <aop:aspect ref="txManager">
            <!--配置前置通知 配置何时做什么-->
            <!--<aop:before method="open" pointcut-ref="txPoint"/>-->
            <!--配置后置通知-->
            <!--<aop:after-returning method="commit" pointcut-ref="txPoint"/>-->
            <!--配置异常通知-->
            <!--<aop:after-throwing method="rollback" pointcut-ref="txPoint" throwing="e"/>-->
            <!--配置最终通知-->
            <!--<aop:after method="close" pointcut-ref="txPoint"/>-->
            <!--配置环绕通知  环绕通知一行顶上面四行-->
            <aop:around method="around" pointcut-ref="txPoint"/>
        </aop:aspect>
    </aop:config>
</beans>

测试

详细见工程代码

注解方式实现

A 引入容器扫描头 Spring AOP

SpringTest-Context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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">

    <!--开启Spring注解扫描-->
    <context:component-scan base-package="cn.itsource._04aopanno"/>

    <!--开启SpringAOP 注解扫描-->
    <aop:aspectj-autoproxy/>

</beans>

后面的几步,都是在TxManager中完成
B 将扩展业务交给容器管理 @Component
C 申明pointcut,@Pointcut,需要提供一个空方法
D 配置各种通知
只用@Around环绕通知,其他四种通知不能确定执行顺序,

/*我们自己的扩展功能*/
@Component //组件 把当前类交给Spring容器管理
@Aspect //== <aop:aspect ref="txManager"> 配置切面
public class TxManager {

    //配置切点  == <aop:pointcut id="txPoint"
    @Pointcut("execution(* cn.itsource._04aopanno.service.I*Service.*(..))")
    public void  txPoint(){
        /*这个方法指明在业务类中的每个方法*/
    }

    /*配置前置通知*/
    /*@Before("txPoint()")*/
    public void open (){
        System.out.println("开启事物");
    }

    /*@AfterReturning("txPoint()")*/
    public void commit (){
        System.out.println("提交事物");
    }

    /*@AfterThrowing(value = "txPoint()", throwing = "e")*/
    public void rollback(Throwable e){
        e.printStackTrace();//处理异常
        System.out.println("回滚事务");
    }

    /*@After("txPoint()")*/
    public void close(){
    System.out.println("关闭事物");
    }

    @Around("txPoint()")
    public void around(ProceedingJoinPoint point){
        try {
            open();
            point.proceed();//执行真正的业务
            commit();
        } catch (Throwable e) {
            e.printStackTrace();
            rollback(e);
        } finally {
            close();
        }
    }
}

测试

详细见工程代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/866928.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《最强大模型平台上线,被很多行业“盯”上了》

千帆大模型 1、国内最多的模型2、国内最全的Prompt模板3、总结 千帆大模型平台是面向企业开发者的一站式大模型开发及服务运行平台&#xff0c;也是百度智能云推出的全球首个一站式企业级大模型平台。在提供全套文心大模型服务的基础上&#xff0c;还支持第三方开源大模型、各种…

记录更换若依框架的用户和部门两种表的过程

背景&#xff1a; 公司使用若依框架快速构建项目&#xff0c;客户那边原有的数据要同步过来&#xff0c;且要求字段与原先的字段一致&#xff0c;可以让数据丝滑无畅导入。用户表和部门表是基础在代码出现的地方比较多&#xff0c;该如何考虑去过度去更换&#xff09; 如何快速…

虹科案例 | 建筑物邻近挖掘工地的结构健康监测

一、 前言 工程与建筑 行业<<<< 工程与建筑——建筑结构健康监测 摘要<<<< 在现代城市环境中&#xff0c;重型建筑施工常常必须在毗邻的邻近建筑和结构附近进行&#xff0c;而这些建筑和结构在挖掘和施工期间必须保持开放以供商业或居住使用。 传…

ModaHub魔搭社区——Milvus 、Qdrant、Waeviate、Pinecone、ElasticSearch矢量数据库对比

资本市场上,2022年也是风起云涌的一年的,各大向量数据库公司纷纷完成了千万美元级别新一轮的融资。可以预见,2023年将会是向量数据库继续快速发展的一年,也会是这一新兴技术由发展走向成熟的一年。这里针对Milvus 、Qdrant、Waeviate、Pinecone、ElasticSearch这五个流行的…

掌握Python的X篇_27_Python中标准库文档查阅方法介绍

前面的博文介绍了python的基本语法、模块及其导入方法。前人将各种方法封装成模块、库、函数供我们使用&#xff0c;如何去使用前人做好的东西&#xff0c;那就需要去查阅文档。今天就介绍python中官方文档的查阅方式。对于初学者而言&#xff0c;python自带的文档就已经足够好…

SQL-每日一题【1484. 按日期分组销售产品】

题目 表 Activities&#xff1a; 编写解决方案找出每个日期、销售的不同产品的数量及其名称。 每个日期的销售产品名称应按词典序排列。 返回按 sell_date 排序的结果表。 结果表结果格式如下例所示。 示例 1: 解题思路 前置知识 group_concat函数的功能   将group by产生的…

6.2.0在线编辑:GrapeCity Documents for Word (GcWord) Crack

GrapeCity Word 文档 (GcWord) 支持 Office Math 函数以及转换为 MathML GcWord 现在支持在 Word 文档中创建和编辑 Office Math 内容。GcWord 中的 OMath 支持包括完整的 API&#xff0c;可处理科学、数学和通用 Word 文档中广泛使用的数学符号、公式和方程。以下是通过 OMa…

92. 反转链表 II

92. 反转链表 II 题目-中等难度示例1. 获取头 反转中间 获取尾 -> 拼接2. 链表转换列表 -> 计算 -> 转换回链表 题目-中等难度 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点…

生信豆芽菜-山峦图分析使用说明

网站&#xff1a;http://www.sxdyc.com/visualsRidges 一、山峦图简介 山峦图&#xff08;Ridgeline plots&#xff09;&#xff0c;本质上是多个核密度曲线图的相互重叠组合&#xff0c;也可以看作是只有半个“小提琴”的横向小提琴图&#xff0c;主要用于展示和比较数据&…

Typecho建站:腾讯云轻量应用服务器搭建网站博客方法

腾讯云轻量应用服务器自带Typecho应用模板镜像&#xff0c;腾讯云提供的Typecho模板镜像是基于CentOS 7.6 64位操作系统&#xff0c;并已预置Nginx、PHP、MariaDB软件程序&#xff0c;使用Typecho应用模板可以快速搭建博客、企业官网、电商及论坛等各类网站。腾讯云服务器网分享…

爱立信网管工具使用-Tools for Export Import(TEI)

1、TEI使用 2、数据导出 打开 OSS Common Explorer&#xff0c;如下图&#xff0c;右键“ONRM_ROOT_MO_R”,选择“Export” MO type filter:为了避免生产的 BULK CM export 文件太大&#xff08;可能会达到几个 G&#xff0c;TEI 转换时&#xff0c;对输入的 BULK CM expor…

多线程与并发编程面试题总结

多线程与并发编程 多线程 线程和进程的区别&#xff1f; 从操作系统层面上来讲&#xff1a;进程(process)在计算机里有单独的地址空间&#xff0c;而线程只有单独的堆栈和局部内存空间&#xff0c;线程之间是共享地址空间的&#xff0c;正是由于这个特性&#xff0c;对于同…

使用Python和pymupdf创建简单的PDF阅读器

使用Python和wxPython编写一个简单的PDF阅读器&#xff0c;并展示了PDF文件的内容。 介绍&#xff1a; 在日常工作和学习中&#xff0c;我们经常需要查看和阅读PDF文件。本文将介绍如何使用Python编程语言和wxPython库创建一个简单的PDF阅读器&#xff0c;让我们能够打开文件夹…

【雕爷学编程】Arduino动手做(54)---大按键微动按钮模块3

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

C语言 金币问题

目录 一、题目介绍 二、题目要求 三、解题思路 四、代码演示 一、题目介绍 国王将金币作为工资&#xff0c;发放给忠诚的骑士。 第一天&#xff0c;骑士收到一枚金币&#xff1b;之后两天&#xff08;第二天和第三天&#xff09;&#xff0c;每天收到两枚金币&#xff1b;…

Docker安装 elasticsearch-head

目录 前言安装elasticsearch-head步骤1&#xff1a;准备1. 安装docker2. 搜索可以使用的镜像。3. 也可从docker hub上搜索镜像。4. 选择合适的redis镜像。 步骤2&#xff1a;拉取elasticsearch-head镜像拉取镜像查看已拉取的镜像 步骤3&#xff1a;创建容器创建容器方式1&#…

canvas实现电子签名并且实时回显

canvas实现电子签名并且实时回显 效果&#xff1a; <template><div>canvas<canvasref"canvasF"mousedown"mouseDown"mousemove"mouseMove"mouseup"mouseUp"touchStart"touchStart"touchMove"touchMov…

Android中tools属性的使用

参考&#xff1a; 1.Android:Tools命名空间原来是有大用处的 2.Android中tools属性的使用 3.工具属性参考文档 4. 命名空间介绍 5. 注解 6. lint 7. 资源压缩shrink-resources 目录 一、概述二、引入tools命名空间三、tools 命名空间的作用有哪些&#xff1f;四、tools 命名空间…

异常处理:从生活中的插曲到代码中的挑战

文章目录 1. 异常&#xff1a;生活中与代码中的无奈2. 异常的体系结构&#xff1a;错误与异常3. 异常处理&#xff1a;抓取异常&#xff0c;保障稳定3.1 throw 和 throws3.2 try...catch3.3 finally 4. 自定义异常&#xff1a;灵活应对特定问题结语 在人类的日常生活和编程世界…

综合能源系统(6)——综合能源综合评估技术

综合能源系统关键技术与典型案例  何泽家&#xff0c;李德智主编 综合能源系统是多种能源系统非线性耦合的、多时间与空间尺度耦合的“源-网-荷一储”一体化系统&#xff0c;通过能源耦合、多能互补&#xff0c;能够实现能源的高效利用&#xff0c;并提高新能源的利用水平。对…