Spring的IOC,DI和AOP

2023-11-18

spring的优点

①IOC和DI降低了组件之间的耦合性 ,让程序员更专注于业务逻辑

②容器提供了众多的辅助类,能加快应用的开发

③spring对于主流的应用框架提供了集成支持,如hibernate,mybatis,Struts等

④spring属于低侵入式设计,代码的污染极低

⑤容器提供了AOP技术,利用它可以方便的实现权限拦截等功能

⑥创建对象默认是单例的,不需要再使用单例模式进行处理

⑦使用Spring构建的应用程序易于单元测试。

⑧Spring能够帮助我们真正意义上实现针对接口编程。

spring的IOC和DI

在传统的程序开发中,一个类如果需要用到另外一个类的功能,常常采用组合(也就是new 对象)或者使用工厂方法(工厂方法最终也是需要new) 的方式。这样类与类之间的耦合度变高了。

IOC(Inversion of Control)控制反转,DI(Dependency Injection)依赖注入,其实两者本质上是没有区别的

例如:在A类中调用B类的方法,那么我们就称 A依赖B,B为被依赖(对象),相信这点大家能够理解。

在spring中,B的实例对象被看成Bean对象,这个Bean对象由spring容器进行创建和管理,如此一来,A获取B的实例对象就不是由自己主动去获取,而是被动接受spring给它设值,那么,这个主动变为被动,就可以理解为“控制反转”。

而另一种说法,从spring容器的角度上看,它负责把A的依赖对象B(B是被依赖对象)注入给了A,所以我们可以理解为“依赖注入”

达到的效果:

你只需要在spring配置文件总配置相应的bean,以及设置相关的属性,让spring容器来生成类的实例对象以及管理对象。在spring容器启动的时候,spring会把你在配置文件中配置的bean都初始化好,然后在你需要调用的时候,就把它已经初始化好的那些bean分配给你需要调用这些bean的类。

 

依赖注入的两种方式:

set方法注入和有参构造注入

IOC和DI的优点

降低了组件间的耦合度,增强了可维护性和复用性

 

IOC的底层原理

工厂模式+反射  可以采用dom4j来解析xml配置文件

我们可以把IOC容器的工作模式看做是工厂模式的升华,可以把IOC容器看作是一个工厂,这个工厂里要生产的对象都在配置文件中给出定义,然后利用编程语言的的反射编程,根据配置文件中给出的类名生成相应的对象。从实现来看,IOC是把以前在工厂方法里写死的对象生成代码,改变为由配置文件来定义,也就是把工厂和对象生成这两者独立分隔开来,目的就是提高灵活性和可维护性。

spring的aop

aop的使用场景

 

AOP,面向切面编程,不用修改源代码就可以扩展功能,底层使用动态代理实现

 

AOP中有三个重要的部分:

切入点(即类中实际增强的方法,aspectj可以和spring一起进行aop操作,可以通过在spring配置文件中使用表达式来配置切入点)

增强(又称为通知,消息)扩展的功能称为增强,通知包括前置通知,在方法之前执行,后置通知,在方法之后通知,异常通知,方法出现异常时通知,最终通知,在后置通知之后执行,环绕通知,在方法之前之后通知)

切面,切入点和增强的结合,就是把增强应用到具体方法上面的过程.

2 常用的表达式

execution(<访问修饰符>?<返回类型><方法名>(<参数>)<异常>)   -->访问修饰符可以为public,protected和private

(1)execution(* cn.itcast.aop.Book.add(..))  -->(..)表示可以有参数

(2)execution(* cn.itcast.aop.Book.*(..))

(3)execution(* *.*(..))

(4) 匹配所有save开头的方法 execution(* save*(..))

 

spring aop的使用方法①配置文件②使用注解(不太了解)

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring的IOC,DI和AOP 的相关文章

  • 在vue3项目中使用新版高德地图

    高德开发平台 高德开放平台 高德地图API amap com 1 首先你要注册好账号登录 2 获取key和密钥 自2021年12月02日升级 升级之后所申请的 key 必须配备安全密钥 jscode 一起使用 NPM方式安装和使用 基础版
  • 【MyBatis】 动态SQL——模糊查询 LIKE

    一 LIKE SELECT FROM t usr WHERE name like name SQL解析为 SELECT FROM t usr WHERE name like 海 可以看到 传参必须用 不能用 所以这样写的弊端就是不安全 不能
  • easy-excel批量导出数据

    easy excel批量导出 前言 最近遇到个用户数据批量导出excel的需求 第一次看到这个需求大家第一时间想到的应该大多都是easy excel这个框架吧 哈哈 我第一时间想到的也是这个框架 但是对于少量的数据 比如有10个用户这样的数
  • 学会Mybatis框架:一篇文章带你掌握双剑合璧的技术【四.MyBatis与Spring集成】

    Welcome Huihui s Code World 接下来看看由辉辉所写的关于Mybatis的相关操作吧 导读 我们都知道 MyBatis是一个优秀的持久层框架 它支持定制化SQL 存储过程以及高级映射 Spring是一个全方位的Jav
  • java自学笔记12:java中的集合框架(下)List

    一 学生选课 判断List中课程是否存在 思考 在课程序列中 如何判断是否包含某门或者某几门课程 如果课程序列包含某门课程 如何判断该课程的索引位置 在学生映射表中 如何判断是否包含某个学生ID 又该如何判断是否包含某个学生对象 如果想把课
  • Rxjava初步理解

    本质就是通过回调实现 Observable被观察对像 成员变量onSubscribe Subscriber 观察对象 订阅 Observable subscribe先调用Subscriber onStart 然后调用onSubscribe中
  • RxDownload-基于RxJava打造的下载工具, 支持多线程和断点续传

    http www jcodecraeer com a anzhuokaifa androidkaifa 2016 1104 6743 html 大文件下载测试中 内存占用一直趋于平稳 主要功能 使用Retrofit OKHTTP来进行网络请
  • 项目失败的思考

    1 鲁莽的追求新的开发框架 2 没有让组员提前学习必要的知识 3 低估项目难度 没有想到潜在的需求和技术难点 4 项目没有时间性的计划 5 任务没有很好的分割 1 项目争取阶段 做好demo 2 项目准备阶段 选择开发框架 让组员了解相关知
  • 在Maven中前端构建实践

    NodeJS为前端技术的发展带来了一次革新 层出不穷的前端库 框架以及打包工具让大家应接不暇 然而这使得前端技术越来越依赖于NodeJS 基于NodeJS编写的前后台项目可以使用同一编译或者打包工具进行管理从而做到无缝的前后端版本控制以及联
  • SSM框架之MyBatis(二)--多表查询及查询结果映射

    使用MyBatis这一强大的框架可以解决很多赋值的问题 其中对于子配置文件中的小细节有很多需要注意的地方 使用这个框架后主要就是对于配置文件的编写和配置 今天我写了一个多表查询 表的基本结构如下 用户表t user 用户编号uid 账号ac
  • 架构师--IT策略灵魂的创造者

    http blog csdn net aspop archive 2006 01 21 585823 aspx 在比尔 盖茨的众多称谓中 据说他更偏爱 首席软件架构师 同样 在网易创始人丁磊名字前 也有 首席架构师 这样的称谓 对于企业来说
  • 基于ftp协议的文件变化主动监听

    基于ftp协议的文件变化主动监听 前言 实现思路 代码实现思路 具体代码实现 依赖引入 FTPService接口 FTPServiceImpl类 FileChangeEvent接口 FileChangeData实体类 FileChangeT
  • Android MVP 详解(上)

    作者 李旺成 时间 2016年4月3日 Android MVP 详解 下 已经发布 欢迎大家提建议 MVP 在 Android 上的使用其实已经有挺长一段时间了 长到似乎有点 过时 了 目前风头正劲的是MVVM 那为什么现在还要讲 MVP
  • 从0开始写Vue项目-SpringBoot整合Mybatis-plus实现登录、注册功能

    1 从0开始写Vue项目 环境和项目搭建 慕言要努力的博客 CSDN博客 2 从0开始写Vue项目 Vue2集成Element ui和后台主体框架搭建 慕言要努力的博客 CSDN博客 3 从0开始写Vue项目 Vue页面主体布局和登录 注册
  • 两种方法在Django框架中支持后台返回包含中文的JSON/数组格式

    去年因缘际会 和Django接触了有半年时间 Django有开发快速 语言简洁的特点 对于web前端开发人员来说 其官方的模板系统也是尽量做到逻辑与显示分离的典型例子 在开发的期间 也积累了一些这方面的经验 一个印象比较深的例子就是如何支持
  • Vue框架--Ruoyi解析(前端)

    路由router注册 router目录下的 index js 配合 permission js 是整套vue前端项目的权限判断核心 index js 里面的path 配置都是一些不会与权限挂钩的路由 例如 404 登录页面路径等 permi
  • 封装的几种形式

    你说的时cpu的封装吗 供你参考 集成电路芯片的封装形式 自从美国Intel公司1971年设计制造出4位微处a理器芯片以来 在20多年时间内 CPU从Intel4004 80286 80386 80486发展到Pentium和Pentium
  • Swagget技术·SpringBoot继承Swagger框架详解!

    文章目录 一 Swagger简介 二 SpringBoot集成Swagger 三 配置Swagger 1 Swagger实例Bean是Docket 所以通过配置Docket实例来配置Swaggger 2 可以通过apiInfo 属性配置文档
  • html理解MVC模型与MVVM模型底层实现

    一 MVC模型的底层实现 1 1 相关代码 div div
  • 值得学习与推荐的c/c++框架和函数库

    这几天不上班 翻翻Evernote中记录的一些笔记 刚好有时间把记录的一些好玩链接转载一下 这篇文章里提到的很多库都用过 尤其是图像处理相关库 尤其是opencv及cximage 当时做图像算法时 很多算法就是从上面找来 然后自己修改的 比

随机推荐

  • java 导出excel实例(内含通用excel导出工具类)

    1 创建一个ExportPropertiesDto 用于动态导出表头 前端传过来的json数组类似 field year fieldName 年份 field departmentName fieldName 部门 field typeNa
  • 机器学习基础线性回归——预测网店的销售额

    线性回归 步骤 明确定义所要解决的问题 网店销售额的预测 在数据的收集与预处理环节 分五个环节完成数据的预处理工作 分别如下 1 收集数据 需要提供的网店的相关记录 2 将收集到的数据可视化 显示出来看一看 3 做特征工程 使数据更容易被机
  • python使用时间戳计算运行时间

    时间戳计算运行时间 from time import time time 记下每一次time 这一行命令时的时间戳 时间戳是一行数字 用来记录此时此刻的时间 t0 time 当前时间 for i in range 10 print i i
  • Java内存分区

    1 简介 内存全称电子计算机内存储器 用于暂时存储CPU中运行的数据以及与磁盘交换的数据 它是硬件存储与CPU进行沟通的桥梁 计算机中的所有程序进行都在内存中进行 所以java程序要想运行必须要在内存中申请一块空间 java内存中可以分为堆
  • 编译出错 程序中有游离的‘\302‘

    编者按 复制别人的代码到Linux中运行 在编译时出错 错误 程序中有游离的 302 查找资料后获取解决方法 在此做一个记录 错误提示如下 read c 164 6 错误 程序中有游离的 302 read c 164 6 错误 程序中有游离
  • 系统邮件模板的邮箱兼容性

    近期支付宝的系统邮件进行了一次改版 在这次改版的过程中 我们遇到了很多在网页中显示正常的html邮件在邮箱中显示异常的问题 下面我们把遇到的问题和一些常用的代码书写规则和大家分享 共性问题 许多邮箱都会出现的问题 1 字体大小会发生变化 排
  • 项目管理2:电子项目研发流程安排

    电子项目研发流程安排 项目研发各阶段安排 1 方案选型阶段 1 所做工作 方案调研 选型 可行性研究 2 设备采购 参考设备 参考方案 demo 注 此阶段全面初步了解设备需求 制定方案 采购验证用设备 2 方案验证阶段 1 所做工作 方案
  • jdbc,prepareStatement,表名为变量时无法使用占位符‘?’

    java操作有些数据库比如clickhouse暂时还用的是jdbc 执行sql时面临使用statement还是prepareStatement 其中statement写的简单不过会有sql注入最后安全检查不过 prepareStatemen
  • ctf文件包含+伪协议总结

    基本原理 后端编程人员一般会把重复使用的函数写到单个文件中 需要使用时再直接调用此文件即可 该过程也就被称为文件包含 文件包含的存在使得开发变得更加灵活和方便 但同时也带了安全问题 导致客户端可以远程调用文件 造成文件包含漏洞 这个漏洞在p
  • C++ 负数转二进制形式

    C 负数转二进制形式 1 十进制的负数转成二进制形式 include
  • 【VsCode远程开发】Windows SSH远程连接Linux服务器 - 无公网IP内网穿透

    文章目录 前言 视频教程 1 安装OpenSSH 2 vscode配置ssh 3 局域网测试连接远程服务器 4 公网远程连接 4 1 ubuntu安装cpolar内网穿透 4 2 创建隧道映射 4 3 测试公网远程连接 5 配置固定TCP端
  • Pandas中五个常见操作小结

    1 引言 Pandas是专门为csv excel等表格数据创建的数据分析 可视化和操作的第三方库 其中DataFrame是一种二维数据结构 它一般是由行和列组成的表格数据 在Python3中使用Pandas库 可以方便我们对表格数据执行相应
  • php 密码校验正则,PHP常用密码正则匹配验证

    PHP常用密码正则匹配验证 第一种 昵称2 10位字符 需由中文 数字 字母 区分大小写 和下划线组合 a 的方 b preg match x 4e00 x 9fa5 A Za z0 9 2 10 u a var dump b 第二种 正则
  • 备战2023蓝桥国赛-饼干

    题目描述 解析 这道题我想了很多种解决方法 但无一例外都失败了 实在是按照常规线性DP的思路真的想不出来 看了题解之后才知道它是分为三步解决这个问题的 第一步 缩小最优解的范围 先用贪心将最优解缩小到某个较小的范围内 再DP求出精确的最优解
  • 【C语言】C语言入门经典题目(范围广,内容多)

    作者 小孙的代码分享 专栏 C语言入门 送给各位的一句话 空杯心态 才能学到新知 希望大家看完这些题目有所收获 别忘了 点赞 评论 目录 前言 字符转ASCII码 判断闰年 简单计算器 包含数字9的数 十六进制转十进制 获得月份天数 求质数
  • MybatisPlus的注解

    MybatisPlus的注解 TableField exist false 表示该属性不为数据库表字段 但又是必须使用的 TableField exist true 表示该属性为数据库表字段 Mybatis Plus 插件有这个功能 可以看
  • RestTemplate使用详解

    文章目录 一 RestTemplate 简单使用 1 创建 RestTemplate 2 接口调用 二 其他设置 1 拦截器配置 2 ErrorHandler 配置 3 HttpMessageConverter 配置 在项目中 当我们需要远
  • 用Vscode编辑verilog代码配置

    这篇教程感觉很详细了 我这里分享一下vscode和插件的安装包链接 都是官网下载的 放心食用 用VSCode编辑verilog代码 iverilog编译 自动例化 自动补全 自动格式化等常用插件 链接 https pan baidu com
  • linux找共享内存

    find proc maps type f exec grep l lt 34865209 gt
  • Spring的IOC,DI和AOP

    spring的优点 IOC和DI降低了组件之间的耦合性 让程序员更专注于业务逻辑 容器提供了众多的辅助类 能加快应用的开发 spring对于主流的应用框架提供了集成支持 如hibernate mybatis Struts等 spring属于