【SSM】篇二:注解开发与AOP

news2024/11/14 21:33:39

文章目录

  • 1、注解开发
    • 1.1 注解开发定义bean
    • 1.2 纯注解开发模式
    • 1.3 注解开发Bean的作用范围和生命周期
    • 1.4 注解开发依赖注入
    • 1.5 注解开发管理第三方Bean
  • 2、Spring整合案例
    • 2.1 Spring整合mybatis
    • 2.2 Spring整合Junit
  • 3、AOP
    • 3.1 AOP思想入门案例
    • 3.2 AOP工作流程
    • 3.3 AOP切入点表达式
    • 3.4 AOP的通知类型
    • 3.5 AOP通知获取数据

1、注解开发

1.1 注解开发定义bean

注解开发定义bean的步骤:

  • 使用@Component定义bean,括号中的字符串即之前bean的id属性(不写id也行,getBean的时候按类型获取)
    在这里插入图片描述
  • 核心配置文件appliacationContext.xml中通过组件扫描加载bean(此时上一章的bean标签定义的无用了,就可以注释掉了):
    在这里插入图片描述

如果以后注解定义开发bean的时候都用@Component,对于不同的场景用起来不够清楚易于区分,由此Spring提供@Component注解的三个衍生注解:

  • @Controller:用于表现层bean的定义
  • @Service:用于业务层bean的定义
  • @Repository:用于数据层bean的定义

1.2 纯注解开发模式

Spring3.0升级了纯注解开发模式,使用java类替代核心配置文件,开启Spring快速开发跑道。

在这里插入图片描述

  • @Configuration注解用于设定当前类为配置类
  • @ComponentScan注解用于设定扫描路径,此注解只能加一次,多个路径用数组
@ComponentScan({"com.llg","com.fight.Dao"});
  • 读取Spring核心配置文件来初始化容器对象改为Java配置类来初始化容器对象
    在这里插入图片描述

1.3 注解开发Bean的作用范围和生命周期

  • @Scope注解用来说明bean是否为单例
  • @PostConstruct和@PreDestroy注解即定义生命周期

在这里插入图片描述

运行效果:
在这里插入图片描述

PS:
这两个注解报错的时候,需要在pom文件中导入依赖:

    <dependency>
      <groupId>javax.annotation</groupId>
      <artifactId>javax.annotation-api</artifactId>
      <version>1.3.2</version>
    </dependency>

1.4 注解开发依赖注入

自动装配的注解@Autowired

使用自动装配的注解@Autowired,按类型注入:

在这里插入图片描述
定义要注入的bean:
在这里插入图片描述
运行:
在这里插入图片描述
当被注入的类型的bean不止一个的时候,仅用@Autowired注解就会报错NoUniqueBeanDefinitionException

在这里插入图片描述

限定符注解@Qualifier("xxx")

此时,再加限定符注解@Qualifier(“xxx”),输入要注解的bean的名称,指定名称装配bean,即可解决。

注意:

  • 自动装配基于反射设计创建对象并暴力反射对应属性为私有属性初始化数据,因此无需提供setter方法

使用@Value实现简单类型注入

使用@Value实现简单类型注入:

在这里插入图片描述

加载properties文件@PropertySource

上面直接在@Value注解后给属性赋一个定值,显然不符合解耦和之前的思想,考虑使用properties文件:

在这里插入图片描述
此时,@Value注解优化为使用${}去获取:

在这里插入图片描述

@PropertySource("classpath:jdbc.properties")

路径中的properties文件有多个的时候,使用数组的格式写入,且不允许使用通配符


1.5 注解开发管理第三方Bean

使用@Bean配置第三方bean

在这里插入图片描述

但如果每个对象都写到核心配置中,管理和可读性都很差,可抽成一个独立的配置类,再导入到核心配置中:

  • 独立配置类

在这里插入图片描述

  • 使用@Import注解将配置类导入到核心配置类中,这个注解只能用一次,多个时用数组
    在这里插入图片描述
  • 当然,除了上面的直接导入,也可以用之前的 @ComponentScan注解扫描配置类所在的包,加载对应的配置类信息 ,推荐使用@Import
    在这里插入图片描述

为第三方Bean注入资源

  • 第三方bean注入简单的数据类型–使用成员变量
    在这里插入图片描述
  • 注入引用类型,只需要为定义bean的方法设置一个对应类型的形参,容器会根据类型去自动装配对象
    在这里插入图片描述

XML配置和注解的对比:

在这里插入图片描述


2、Spring整合案例

2.1 Spring整合mybatis

2.2 Spring整合Junit

3、AOP

3.1 AOP思想入门案例

AOP,即Aspect Oriented Programming,面向切面编程。是一种编程范式,指导开发者如何组织程序结构。在不惊动原始设计的基础上为其进行功能增强,实现无侵入式编程。

回顾:
OOP(面向对象编程)
Object Oriented Programming


AOP思想举例:

在这里插入图片描述
核心概念:

在这里插入图片描述

入门案例:

思路分析:

  • 导入坐标(pom.xml)
  • 制作连接点方法(即原始的Dao接口和实现类)
  • 制作共性功能(通知类与通知)
  • 定义切入点
  • 绑定切入点与通知关系

1.导入坐标(pom.xml)
在这里插入图片描述

2.制作连接点方法(即原始的Dao接口和实现类)

在这里插入图片描述
3.制作共性功能(通知类与通知)

在这里插入图片描述

4.定义切入点
在这里插入图片描述
切入点的定义需要依托一个不具有实际意义的方法进行,如上面的pt()方法,它无参数、无返回值、方法体无实际逻辑。
其中:@Pointcut注解来定义切入点

5.绑定切入点与通知的关系,并指定通知添加到原始连接点具体执行位置
在这里插入图片描述
注意,需要用注解@Component定义通知类受Spring容器管理,再加注解@Aspect定义当前类为切面类,最后在Spring核心配置类中使用注解@EnableAspectJAutoProxy开启对AOP注解驱动支持

在这里插入图片描述
至此,在未改动原程序的基础上,update方法新增了功能–打印当前时间:

在这里插入图片描述

3.2 AOP工作流程

在这里插入图片描述
注意,若bean对应的类中的方法没有匹配到任意切入点,则创建出来的bean就是普通对象,无关AOP,也无关代理对象。

在这里插入图片描述
打印bean,由于toString被重写,看不出来区别,调用getClass方法,可以看到代理类class是com.sun.proxy.$Proxy19,整个AOP的实现就是使用了代理模式。


3.3 AOP切入点表达式

切入点表达式语法:

  • 切入点:需要进行增强的那个方法,如上面的update
  • 切入点表达式:即要进行增强的这个方法,怎么去描述它

比如描述要增强的update,可以按照接口,也可以按照它的实现类:

在这里插入图片描述

切入点表达式标准格式:
---->
动作关键词(访问修饰符 返回值 包名.类/接口名 .方法名(参数)异常名)
execution(public User com.llg.service.Uservice.findById(int))
  • 动作关键字:描述切入点的行为动作,execution即执行到指定切入点
  • 方法修饰符:public、private等可以省略
  • 返回值
  • 包名
  • 类/接口名
  • 参数
  • 异常名:方法定义中抛出指定异常,可以省略

通配符

使用通配符来描述切入点,提高效率:

  • *:单个独立的任意符号,可以独立出现,也可做为前缀或后缀匹配符。
execution(public * com.llg.*.UserService.find* (*))

匹配com.llg包下得任意包中得UserService类或接口中所有find开头得带有一个参数、返回类型任意的public方法

  • . .:多个连续的任意符号,可独立出现,常用于简化包名与参数的书写
execution(public User com..UserService.findById(..))

匹配com包下的任意包中的UserService类或接口中所有名称为findById的方法

  • +:专门用于匹配子类类型
execution(* *..*Service+.*(..))

切入点表达式的书写技巧:

在这里插入图片描述

3.4 AOP的通知类型

AOP通知描述了抽取的共性功能,根据共性功能抽取的位置的不同,最终代码运行时要将其加入到合理的位置中,这个位置,有5中类型:

  • 前置通知
  • 后置通知
  • 环绕通知
  • 返回后通知
  • 抛出异常后通知

代码实现:


各个类型的详解:

@Before:
在这里插入图片描述
@After
在这里插入图片描述
@Around
在这里插入图片描述
注意:pjp.proceed()是对原始操作的调用,这样就区分出来了环绕具体是怎么个执行顺序,当原始操作有返回值的时候,这里要改为Object类型,并接收proceed方法的返回值来return。(原始操作返回void,也可以使用Object类型,这时候返回的是null而已)

在这里插入图片描述
@AfterReturning
在这里插入图片描述
@AfterThrowing
在这里插入图片描述



案例--测量业务层接口万次执行效率

计算时间差即执行时长,需要在接口执行前后分别记录时间==>环绕通知
在这里插入图片描述
使用环绕通知,先实现执行时长:
在这里插入图片描述

通过执行签名信息,来获取所测的接口名和方法名:
在这里插入图片描述

3.5 AOP通知获取数据

在这里插入图片描述

获取切入点方法的参数:

在这里插入图片描述

获取切入点方法返回值
  • 对于AfterReturning,我们使用形参来接收返回值:
    在这里插入图片描述
  • 对于Around,执行原始方法时,得到的结果即返回值:
    在这里插入图片描述
获取切入点方法异常信息
  • 对于Around,不再throw,直接try…catch即可:
    在这里插入图片描述
  • 对于AfterThrowing,使用新参接收异常对象:
    在这里插入图片描述


案例:百度网盘密码数据兼容处理

实现核心:使用环绕通知对原始操作的参数进行修改
在这里插入图片描述
代码实现:

业务层接口和实现类:
在这里插入图片描述在这里插入图片描述
数据层接口和实现类:
在这里插入图片描述
在这里插入图片描述
使用AOP思想,为业务层方法,加上去空格的功能,提高兼容性和用户使用体验:
在这里插入图片描述
测试程序:

在这里插入图片描述
运行结果:
在这里插入图片描述

====================

AOP总结:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

pg逻辑复制详解

目录 什么是逻辑复制 逻辑解析 复制槽 output plugin ​​​​​​​几个常见的outputplugin 几个能手动接收解析数据的函数和工具 逻辑解析测试1&#xff1a;观察用2个不同的output plugin解析数据 逻辑解析测试2&#xff1a;使用pg_recvlogical工具接收逻辑解析数据&am…

服务器配置 | 在Windows本地显示远程服务器绘图程序

文章目录方法1&#xff1a;在MobaXterm的终端输入指令方法2&#xff1a;在Pycharm中运行前提概要&#xff0c;需要在本地Windows端显示点云的3d可视化界面 对于点云的3d可视化一般有两种方法&#xff0c;open3d显示或者是mayavi显示。这两个库都可以使用pip install来实现安装…

给正在准备PMP考试的同学一些建议

去年年尾参与了pmp考试&#xff0c;顺利通过&#xff0c;并得了5A&#xff0c;让我小小激动了一下。在出来结果之前&#xff0c;我也是坚信自己能过&#xff0c;得知是5A&#xff0c;当然也是非常高兴。话不多说&#xff0c; 先贴图&#xff1a; 这里我将要说一下我都是如何备…

Modbus网关在锂电池干燥箱的应用

在锂离子电池生产过程中&#xff0c;将正负极片辊压绕卷再放入电池盒之后&#xff0c;须对锂电池电芯极组进行烘烤干燥。相信大家也了解水分对锂电池的性能影响是很大的&#xff0c;需要注液前在装配车间将锂离子电池电芯内部的水分去除&#xff0c;以免影响锂电池质量。在锂电…

星光2开发板使用ECR6600U无线wifi网卡的方法

visionfive2 开发板性能还是不错的&#xff0c;有些人买的时候会带一个无线wifi网卡&#xff0c;但是官方提供的操作系统没有驱动。 所以需要自己编驱动&#xff08;他大爷的&#xff09;。 还好有人已经踩过坑了。 星光2之USB无线网卡使用教程【新增RTL8832AU WiFi6双频无线…

开发手册——一、编程规约_3.代码格式

这篇文章主要梳理了在java的实际开发过程中的编程规范问题。本篇文章主要借鉴于《阿里巴巴java开发手册终极版》 下面我们一起来看一下吧。 1. 【强制】大括号的使用约定。如果是大括号内为空&#xff0c;则简洁地写成{}即可&#xff0c;不需要换行&#xff1b;如果是非空代码…

BI的能力边界:能解决的企业问题和不擅长的领域

数字化转型本就需要借助信息化相关技术、思想来完成&#xff0c;所以说信息化建设同样是数字化转型过程中非常重要的一环&#xff0c;而这就是商业智能BI和数字化转型的关系 BI 能解决的企业问题 数据是企业的重要资产&#xff0c;也是企业商业智能BI的核心要求。通常&#x…

【微信小程序】-- 全局配置 -- tabBar(十七)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…

【数据可视化工具】浅谈 DataEase 和 FineBI 支持的数据源

前言最近对市面上比较火热的数据可视化工具 DataEase 和 FineBI 进行了调研&#xff0c;在支持的数据源方面感觉不太一样&#xff0c;所以就有了这篇文章&#xff0c;话不多说&#xff0c;我们一起来看一下吧&#xff01;以下的内容&#xff0c;大多来自两个工具的官方文档&…

高可用 - 05 Keepalived配置(全局配置、VRRPD、LVS)

文章目录PreKeepalived的全局配置Keepalived的VRRPD配置VRRP同步组配置VRRP实例配置Keepalived的LVS配置TCP_CHECKHTTP_GET & SSL_GETMISC_CHECKPre 高可用 - 04 Keepalived编译安装 高可用 - 04 Keepalived编译安装安装Keepalived的过程中&#xff0c;指定了Keepalived配…

Chrome访问新版bing(玄学,需要魔法)

文章目录前提1. 需要魔法2. 申请过使用新版bing&#xff0c;并且收到通过的邮件。没有的话先申请&#xff0c;加入waiting list&#xff08;不赘述&#xff0c;自行百度&#xff09;配置1. Chrome安装插件&#xff08;Header Editor&#xff09;2. Header Editor添加规则3. 允许…

PaddleOCR遇到 lanms-neo问题处理

在window环境中安装PaddleOCR依赖是真的蛋疼&#xff0c;关键官方论坛里也都没有具体的解决方案。吐槽。。。吐槽。。。 我在 “windows安装lanms-neo问题处理”文章中看到lanms-neo问题全过程解决。个人觉得文档说明不是很细致&#xff0c;导致我按步骤执行&#xff0c;还是安…

插上数据的翅膀,开启我升职加薪的梦想之旅

我是麦思思&#xff0c;大学毕业后就进入大厂工作并担任电子消费行业业务部门的数据分析师&#xff0c;对于一个数据分析师而言&#xff0c;Excel是必备技能&#xff0c;函数公式我能随手就来&#xff0c;几十M的文件处理那都是轻轻松松。但是&#xff0c;近几年随着企业业务发…

一种全新的图像变换理论的实验(五)——研究目的替代DCT和小波

一、前言 目前在大量的灰度图像测试下&#xff0c;基本确定变换系数ratio取值0-25之间时&#xff0c;逆变化后的图还能基本保障效果&#xff0c;而且越接近0效果越好。本文还是以lenna.bmp灰度图为例&#xff0c;实验不再逆变换&#xff0c;而是把变换后的数据直接输出为bmp的…

如何计算Bitmap的内存占用

日常我们提到图片大小的时候&#xff0c;一般都会把关注点放在图片的文件大小。因为一般来说&#xff0c;图片文件越小&#xff0c;内存占用也会越小。但是其实图片文件大小和内存占用大小没有什么直接的必然联系&#xff0c;我们可以通过查看 Android 的 Bitmap 的内存分配&am…

GitLab 专家分享|关于 DevSecOps ,你需要知道这几点

本文来源&#xff1a;about.gitlab.com 译者&#xff1a;极狐(GitLab) 市场部内容团队 ❔ 灵魂拷问&#xff1a; 你的安全测试&#xff0c;能否跟上现代软件开发模式的步伐&#xff1f; GitLab 预测到&#xff0c;2023 年企业会将更多的时间和资源投入到持续的安全左移上&…

Day08-网页布局实战表单和表格

文章目录网页布局实战一 表单案例1-表单前后端交互案例2-常用表单元素知识点input的属性总结&#xff1a;type属性的其他值(了解)&#xff1a;按钮label标签二 结构伪类选择器三 表单布局案例案例1贯穿案例-登录页面制作案例2贯穿案例-注册页面制作四 表格案例1-表格设计案例2-…

taobao.item.propimg.upload( 添加或修改属性图片 )

&#xffe5;开放平台基础API必须用户授权 添加一张商品属性图片到num_iid指定的商品中 传入的num_iid所对应的商品必须属于当前会话的用户 图片的属性必须要是颜色的属性&#xff0c;这个在前台显示的时候需要和sku进行关联的 商品属性图片只有享有服务的卖家&#xff08;如&a…

JVM对象实例化详解

1、对象创建方式你知道几种呢&#xff1f;new&#xff1a;最常见的方式、Xxx的静态方法&#xff0c;XxxBuilder/XxxFactory的静态方法Class的newInstance方法&#xff1a;反射的方式&#xff0c;只能调用空参的构造器&#xff0c;权限必须是publicConstructor的newInstance(XXX…

maven 私服nexus安装与使用

一、下载nexus Sonatype公司的一款maven私服产品 1、官网下载地址&#xff1a;https://help.sonatype.com/repomanager3/product-information/download 2、csdn下载地址&#xff1a;https://download.csdn.net/download/u010197591/87522994 二、安装与配置 1、下载后解压如…