尚硅谷spring框架视频教程——学习笔记一(IOC、AOP)

文章目录

  • 前言
  • 一、控制反转(IOC)
    • 1. 底层原理
    • 2. 两种实现方式(接口)
    • 3. bean管理(基于xml方式)
    • 4. bean管理(基于注解方式)
  • 二、面向切面编程(AOP)
    • 1. 底层逻辑
    • 2. 基于注解开发

前言

虽然不懂消化原理也不妨碍消化食物,但还是对消化原理感兴趣。

一、控制反转(IOC)

控制反转,就是把创建对象和对象之间的调用过程交给spring进行管理,以降低代码之间的耦合度。

1. 底层原理

控制反转是基于:xml解析、工厂模式和反射三部分实现的。
(1)创建对象及对象间调用的相关信息配置在配置文件中,spring通过xml解析获取相关信息;
(2)通过工厂模式将调用的类与被调用的类解耦;
(3)在工厂类中,使用获取到的配置信息,通过反射创建对象并设置属性;

2. 两种实现方式(接口)

(1)BeanFactory:加载配置文件时不创建对象,获取对象(使用)时才创建;
(2)ApplicationContext:BeanFactory的子接口,加载配置文件的时候就会创建对象,把耗费时间的步骤放在服务器启动的时候;

3. bean管理(基于xml方式)

(1)创建对象

  • 使用bean标签注入创建对象,默认调用无参的构造函数

(2)注入属性

  • set方法注入属性
  • 有参构造函数注入属性
  • p名称空间注入(了解)
  • 使用null标签注入空值
  • 特殊字符的注入可写到<![CDATA[]]>中
  • 通过ref注入外部bean
  • 使用array标签、list标签、map标签(内部使用entry标签)、set标签注入集合
  • 使用util名称空间(如<util:list>)提取重复注入部分

(3)工厂bean

  • 区别
    普通bean:在bean标签中定义什么类型,就返回什么类型;
    工厂bean:定义的类型和返回的类型可以不一致;
  • 实现
    创建类,实现FactoryBean接口,并定义泛型;
    实现getObject方法;

(4)bean的作用域(单实例或多实例)
通过bean标签中的scope属性设置作用域,默认是单实例(singleton,加载配置文件时创建对象),还可以设置为多实例(property,调用getBean时才创建对象)、请求(request,了解即可)、会话(session,了解即可)

(5)bean生命周期
配置后置处理器可在创建对象过程中加入一些自定义逻辑,如属性修改、依赖注入增强等。注意:配置后置处理器之后,默认会为当前配置文件中的所有bean都配置上后置处理器

  • 通过无参构造创建bean实例;
  • 设置属性值以及对其他bean的引用
  • 把bean实例传给后置处理器的postProcessBeforeInitialization方法(实现BeanPostProcessor接口)
  • 调用bean的初始化方法(通过bean标签中的init-method属性设置)
  • 把bean实例传给后置处理器的postProcessAfterInitialization方法(实现BeanPostProcessor接口)
  • 获取到bean对象,并使用
  • 当容器关闭时(手动调用context的close方法),调用bean的销毁方法(通过bean标签中的destroy-method属性设置)

(6)自动装配
在bean标签中,通过autowire配置自动装配方式,根据属性名称(byName)或者属性类型(byType)

(7)引入外部属性文件
比如数据库的配置可以放到properies为后缀的文件中,通过context名称空间引入外部属性文件,然后在设置属性值时,通过${}获取相应配置

4. bean管理(基于注解方式)

(1)什么是注解
注解是代码中的特殊标记,基本模式为@注解名称(属性名称=属性值),可以作用在类、方法、属性上。使用注解的目的是简化xml配置。

(2)开启组件扫描
可配置只扫描或者不扫描某种注解。

  • 可以使用命名空间context,并设置base-package的属性值
  • 也可以使用完全注解开发
@Configuration
@ComponentScan(basePackages = {"com.xxx"})
public class SpringConfig {
}

(3)创建对象的注解
功能都是一样的,只是习惯加以区分。value的属性值可以不写,默认是将类名称的首字母改成小写

  • @Component(value=“xxx”):用于普通的类对象
  • @Controller(value=“xxx”):一般用在web层
  • @Service(value=“xxx”):一般用在业务逻辑层
  • @Repository(value=“xxx”):一般用在数据访问层(DAO层)

(4)注入属性的注解

  • @Autowired:根据属性类型注入类对象,属于spring的包
  • @Qualifier(value=xxx):根据属性名称注入类对象,属于spring的包
    需要和@Autowired一起使用
  • @Resource(name=xxx):根据类型/名称注入类对象,属于javax的包
  • @Value(value=xxx):注入普通类型属性

二、面向切面编程(AOP)

不修改原有代码的前提下,在主干逻辑中添加新功能,降低业务逻辑各部分之间的耦合度,比如为登录功能加上权限控制。

1. 底层逻辑

(1)有接口,使用JDK动态代理
代理对象和目标对象都实现同一个接口,代理对象方法内部调用目标对象的相应方法。代码来自

// 目标接口
public interface OrderService {void add();
}
// 目标类
public class OrderServiceImpl implements OrderService {@Overridepublic void add() {System.out.println("添加用户");}
}
// 代理类
public class OrderServiceProxy implements OrderService {@Overridepublic void add() {long begin = System.currentTimeMillis();OrderService.add();long end = System.currentTimeMillis();System.out.println("耗时"+(end - begin)+"毫秒");}
}

代码实现使用了java.lang.reflect.Proxy的newProxyInstance方法。第一个参数:类加载器;第二个参数:接口类型;第三个参数:调用得到处理器代码来自

public class ProxyHandler implements InvocationHandler {private Object targetObject;//被代理的对象public  Object newProxyInstance(Object targetObject){this.targetObject = targetObject;return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),targetObject.getClass().getInterfaces(),this);}//该方法在代理对象调用方法时调用@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("记录日志");return method.invoke(targetObject,args);}
}

(2)没有接口,使用CGLIB动态代理
代理对象继承目标类,重写相应的方法,并使用super.xxx()调用父类方法

// 目标类
public class OrderService {public void add() {System.out.println("添加用户");}
}
// 代理类
public class OrderServiceProxy extends OrderService {@Overridepublic void add() {long begin = System.currentTimeMillis();super.add();long end = System.currentTimeMillis();System.out.println("耗时"+(end - begin)+"毫秒");}
}

2. 基于注解开发

(1)操作术语

  1. 连接点:类中可以被增强的方法
  2. 切入点:实际被增强的方法
  3. 通知(增强):实际增强的逻辑部分
  4. 切面:是动作,把通知应用到切入点的过程

(2)使用方法

  1. 开启组件扫描(@ComponentScan),开启生成代理对象(@EnableAspectJAutoProxy(proxyTargetClass = true))
  2. 创建类,在类中写主干逻辑
  3. 创建增强类,编写增强逻辑,在类上加@Aspect注解(用于标识一个类为切面)

(3)五种通知类型
前置(@Before)、后置(@AfterReturning有异常不执行)、环绕(@Around环绕之后有异常不执行)、异常(@AfterThrowing)、最终(@After)
切入点表达式为execution([权限修饰符][返回类型][类全路径][方法名称](参数列表)),权限修饰符:public/private/protected,一般直接写*,表示不限制;返回类型可以不写。

// 配置类
@Configuration
@ComponentScan(basePackages={"com.atguigu"})
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class ConfigAop() {}// 主干逻辑
@Component
public class User {public void add() {System.out.println("add主逻辑");}
}// 增强类
// 多个增强类对同一个方法进行增强,设置优先级,数字越小优先级越高
@Order(1)
@Aspect
@Component
public class UserProxy{// 相同切入点的抽取@Pointcut(value="execution(* com.atguigu.dao.BookDao.add(..))")public void pointdemo() {}// 对com.atguigu.dao.BookDao类里的add方法进行增强@Before(value="execution(* com.atguigu.dao.BookDao.add(..))")public void before() {System.out.println("增强的逻辑");}@After(value="pointdemo()")public void after() {System.out.println("增强的逻辑");}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

赛博算卦之周易六十四卦JAVA实现:六幺算尽天下事,梅花化解天下苦。

佬们过年好呀~新年第一篇博客让我们来场赛博算命吧&#xff01; 更多文章&#xff1a;个人主页 系列文章&#xff1a;JAVA专栏 欢迎各位大佬来访哦~互三必回&#xff01;&#xff01;&#xff01; 文章目录 #一、文化背景概述1.文化起源2.起卦步骤 #二、卦象解读#三、just do i…

【16届蓝桥杯寒假刷题营】第2期DAY4

【16届蓝桥杯寒假刷题营】第2期DAY4 - 蓝桥云课 问题描述 幼儿园小班的浩楠同学有一个序列 a。 他想知道有多少个整数三元组 (i,j,k) 满足 1≤i,j,k≤n 且 ai​aj​ak​。 输入格式 共2行&#xff0c;第一行一个整数 n&#xff0c;表示序列的长度。 第二行 n 个整数&#x…

基于单片机的超声波液位检测系统(论文+源码)

1总体设计 本课题为基于单片机的超声波液位检测系统的设计&#xff0c;系统的结构框图如图2.1所示。其中包括了按键模块&#xff0c;温度检测模块&#xff0c;超声波液位检测模块&#xff0c;显示模块&#xff0c;蜂鸣器等器件设备。其中&#xff0c;采用STC89C52单片机作为主控…

【狂热算法篇】探秘图论之Dijkstra 算法:穿越图的迷宫的最短路径力量(通俗易懂版)

羑悻的小杀马特.-CSDN博客羑悻的小杀马特.擅长C/C题海汇总,AI学习,c的不归之路,等方面的知识,羑悻的小杀马特.关注算法,c,c语言,青少年编程领域.https://blog.csdn.net/2401_82648291?typebbshttps://blog.csdn.net/2401_82648291?typebbshttps://blog.csdn.net/2401_8264829…

【Block总结】动态蛇形卷积,专注于细长和弯曲的局部结构|即插即用

论文信息 标题: Dynamic Snake Convolution based on Topological Geometric Constraints for Tubular Structure Segmentation 作者: 戚耀磊、何宇霆、戚晓明、张媛、杨冠羽 会议: 2023 IEEE/CVF International Conference on Computer Vision (ICCV) 发表时间: 2023年10月…

【NEXT】网络编程——上传文件(不限于jpg/png/pdf/txt/doc等),或请求参数值是file类型时,调用在线服务接口

最近在使用华为AI平台ModelArts训练自己的图像识别模型&#xff0c;并部署了在线服务接口。供给客户端&#xff08;如&#xff1a;鸿蒙APP/元服务&#xff09;调用。 import核心能力&#xff1a; import { http } from kit.NetworkKit; import { fileIo } from kit.CoreFileK…

Linux工具使用

1.gcc/g的使用 1.1程序翻译的过程 ①预处理&#xff1a;展开头文件&#xff0c;替换宏&#xff0c;调节编译&#xff0c;去注释。 ②编译&#xff1a;将代码变成汇编语言 ③汇编&#xff1a;将汇编代码变成二进制不可执行的目标文件。 ④链接&#xff1a;将多个我写的多个…

Mac Electron 应用签名(signature)和公证(notarization)

在MacOS 10.14.5之后&#xff0c;如果应用没有在苹果官方平台进行公证notarization(我们可以理解为安装包需要审核&#xff0c;来判断是否存在病毒)&#xff0c;那么就不能被安装。当然现在很多人的解决方案都是使用sudo spctl --master-disable&#xff0c;取消验证模式&#…

单细胞-第五节 多样本数据分析,打分R包AUCell

文件在单细胞\5_GC_py\1_single_cell\3.AUCell.Rmd 1.基因 rm(list = ls()) load("g.Rdata")2.AUCell https://www.ncbi.nlm.nih.gov/pmc/articles/PMC9897923 IF: NA NA NA用这个文章里的方法,将单细胞亚群的marker基因与ros相关基因取交集,用作AUCell的基因集…

[EAI-027] RDT-1B,目前最大的用于机器人双臂操作的机器人基础模型

Paper Card 论文标题&#xff1a;RDT-1B: a Diffusion Foundation Model for Bimanual Manipulation 论文作者&#xff1a;Songming Liu, Lingxuan Wu, Bangguo Li, Hengkai Tan, Huayu Chen, Zhengyi Wang, Ke Xu, Hang Su, Jun Zhu 论文链接&#xff1a;https://arxiv.org/ab…

MATLAB的数据类型和各类数据类型转化示例

一、MATLAB的数据类型 在MATLAB中 &#xff0c;数据类型是非常重要的概念&#xff0c;因为它们决定了如何存储和操作数据。MATLAB支持数值型、字符型、字符串型、逻辑型、结构体、单元数组、数组和矩阵等多种数据类型。MATLAB 是一种动态类型语言&#xff0c;这意味着变量的数…

【解决方案】MuMu模拟器移植系统进度条卡住98%无法打开

之前在Vmware虚拟机里配置了mumu模拟器&#xff0c;现在想要移植到宿主机中 1、虚拟机中的MuMu模拟器12-1是目标系统&#xff0c;对应的目录如下 C:\Program Files\Netease\MuMu Player 12\vms\MuMuPlayer-12.0-1 2、Vmware-虚拟机-设置-选项&#xff0c;启用共享文件夹 3、复…

DeepSeek介绍及使用ollama本地化部署DeepSeek-R1大模型

DeepSeek 中文名深度求索人工智能基础技术研究有限公司(简称“深度求索”或“DeepSeek”)&#xff0c;成立于2023年&#xff0c;是一家专注于实现AGI的中国公司。 在本月初推出 DeepSeek-R1后&#xff0c;该公司宣称其在执行数学、编码和自然语言推理等任务时“性能可与OpenAI…

金融级分布式数据库如何优化?PawSQL发布OceanBase专项调优指南

前言 OceanBase数据库作为国产自主可控的分布式数据库&#xff0c;在金融、电商、政务等领域得到广泛应用&#xff0c;优化OceanBase数据库的查询性能变得愈发重要。PawSQL为OceanBase数据库提供了全方位的SQL性能优化支持&#xff0c;助力用户充分发挥OceanBase数据库的性能潜…

简要介绍C语言与c++共有的数学函数

C语言和C都提供了丰富的数学函数&#xff0c;这些函数主要定义在 <math.h>&#xff08;C语言&#xff09;和 <cmath>&#xff08;C&#xff09;头文件中。以下分别介绍C语言与C共有的数学函数&#xff0c;以及C特有的数学函数。 C语言与C共有的数学函数&#xff08…

NVIDIA GPU介绍:概念、序列、核心、A100、H100

概述 入职一家大模型领域创业公司&#xff0c;恶补相关知识。 概念 一些概念&#xff1a; HPC&#xff1a;High Performance Computing&#xff0c;高性能计算SoC&#xff1a;System on Chip&#xff0c;单片系统FLOPS&#xff1a;Floating Point Operations Per Second&am…

Python中的函数(下)

函数返回值 返回单个值 函数可以通过 return 语句返回一个值。一旦执行到 return 语句&#xff0c;函数就会停止执行&#xff0c;并将指定的值返回给调用者。例如&#xff1a; 返回多个值 实际上&#xff0c;Python函数只能返回一个值&#xff0c;但可以通过返回一个元组来模…

python算法和数据结构刷题[2]:链表、队列、栈

链表 链表的节点定义&#xff1a; class Node():def __init__(self,item,nextNone):self.itemitemself.nextNone 删除节点&#xff1a; 删除节点前的节点的next指针指向删除节点的后一个节点 添加节点&#xff1a; 单链表 class Node():"""单链表的结点&quo…

https数字签名手动验签

以bing.com 为例 1. CA 层级的基本概念 CA 层级是一种树状结构&#xff0c;由多个层级的 CA 组成。每个 CA 负责为其下一层级的实体&#xff08;如子 CA 或终端实体&#xff09;颁发证书。层级结构的顶端是 根 CA&#xff08;Root CA&#xff09;&#xff0c;它是整个 PKI 体…

S4 HANA明确税金本币和外币之间转换汇率确定(OBC8)

本文主要介绍在S4 HANA OP中明确明确税金本币和外币之间转换汇率确定(OBC8)相关设置。具体请参照如下内容&#xff1a; 明确税金本币和外币之间转换汇率确定(OBC8) 以上配置&#xff0c;我们可以根据不同公司代码所配置的使用不同的汇率来对税金外币和本币之间进行换算。来针对…