当前位置: 首页 > news >正文

Spring IOC注入方式、Bean作用域

Spring IOC注入

手动注入

set方法注入

需要提供set方法

public class UserService {private UserDao userDao;
​public void setUserDao(UserDao userDao) {this.userDao = userDao;}
}

设置属性字段的值

<bean id="userService" class="com.shsxt.service.UserService"><!-- 通过property标签设置字段的值name:属性字段的名称 (setXXX)ref:指定的bean标签的id--><property name="userDao" ref="userDao" />
</bean>
​
<bean id="userDao" class="com.shsxt.dao.UserDao">
</bean>
构造器注入

通过构造器的参数注入

public class UserService {private UserDao userDao;
​// 带参构造public UserService(UserDao userDao) {this.userDao = userDao;}
}

设置属性字段的值

<bean id="userService" class="com.shsxt.service.UserService"><!-- 通过constructor-arg标签设置字段的值name:属性字段的名称ref:指定的bean标签的id--><constructor-arg name="" ref=""/>
</bean>
​
<bean id="userDao" class="com.shsxt.dao.UserDao">
</bean>
循环依赖问题

当两个或多个类需要互相注入时,构造器注入会出现循环依赖问题。可以通过set方法注入解决。

自动注入

环境准备
  1. 在xml配置文件中引入context的命名空间及规范

  2. 开启自动注入

    <context:annoation-config />
  3. 在需要注入的属性字段上添加注解 (属性字段是JavaBean)

@Resource
  1. 默认根据id属性值查找 (属性字段名与id属性值保持一致)

  2. 如果id属性值不一致,则会根据(Class)类型查找

  3. 注解可以声明在属性字段级别 或 set方法级别

  4. 属性字段可以提供set方法,也可以不提供

  5. 注解可以通过name属性设置别名,如果设置了name属性,就必须要求name属性与bean标签的id属性值一致

  6. 当一个对象有一个接口实现时,正常使用;如果有多个接口实现时,需要使用name设置别名

@Autowired
  1. 默认根据(Class)类型查找,与id属性值无关

  2. 注解可以声明在属性字段级别 或 set方法级别

  3. 属性字段可以提供set方法,也可以不提供

  4. 可以结合@Qualifier设置别名,需要设置@Qualifier的name属性值,name属性值与bean标签的id属性值一致

Spring IOC 扫描器

作用:

统一管理Bean,简化配置文件,提高开发效率

环境准备:

在配置文件中开启扫描器,并设置扫描范围

<context:componet-scan base-package="需要扫描的包目录"/>

注解:

声明在类级别

Controller层@Controller
Service层@Service
Dao层@Repository
任意类@Componet

Spring IOC Bean作用域与生命周期

Bean作用域

Spring IOC容器实例化的Bean'对象时单例对象!

单例作用域

当IOC容器实例化Bean对象时,会将实例化的Bean对象设置单例缓存池中,下次再从缓存池中获取

lazy-init懒加载

如果设置true,表示懒加载,IOC容器加载时,不进行Bean对象的实例化,而是在使用Bean对象时进行实例化

如果设置false,表示不懒加载,IOC容器加载时就实例化Bean对象,默认值

lazy-init懒加载为什么要设置为false?

1. 可以提前发现一些潜在的配置文件
2. IOC容器加载时会将Bean对象实例化,使用时不需在实例化,可以提高开发效率

什么对象适合作为单例?

无状态 或状态不可改变的对象

什么是无状态 或状态不可改变的对象?

不存在改变当前对象状态的成员变量。例:controller层、Service层、dao层

原型作用域

当IOC容器实例化Bean对象时,每次都会创建一个新的Bean对象

Web容器中的作用域

request作用域

session作用域

Bean的生命周期

Bean的定义

Bean的初始化

Bean的使用

Bean的销毁

IOC/DI

IOC/DI:控制反转/依赖注入

控制反转:将对象的创建过程转交给外部容器(IOC容器)来实现

依赖注入:给属性字段赋值 (JavaBean对象)

Spring AOP

代理模式

为一个委托类(目标对象)提供一个代理类(代理对象)

作用:可以通过代理对象实现目标对象的行为,并对目标对象的行为进行增强

两个原则:

1. 目标对象与代理对象有共同的行为
2. 代理对象增强目标对象

三要素:

1. 共同的行为
2. 目标对象
3. 代理对象

常见代理模式:

静态代理

动态代理

静态代理

1. 目标对象固定
2. 在程序运行前已经得到目标对象
3. 对目标对象进行增强
4. 当需要大量代理类是,可能会产生"类爆炸"

动态代理

在程序运行时,通过反射机制动态生成代理对象

JDK动态代理

注:要求目标对象有接口实现

通过Proxy类的newProxyInstance()得到代理对象

Object proxy = Proxy.newProxyInstance(类加载器, 接口数组, InvocationHandler接口);

InvocationHandler接口中有invoke方法,代理过程在invoke方法中执行

当代理对象调用方法时,即会执行invoke方法

CGLIB动态代理

注:采用继承思想,定义代理类继承目标类。目标类不能使用final修饰。

需要在pom.xml引入cglib的依赖。

通过Enhancer的create方法,可以生成一个类,并设置该类的父类为目标类。

通过设置Enhancer对象的Callback方法,在callback方法中实现代理过程。

利用MethodInterceptor接口,该接口是Callback的子接口。

Enhancer enhancer = new Enhancer();
// 设置目标类为父类
enhancer.setSuperClass(target.getClass());
// 设置代理过程
enhancer.setCallBack(MethodInterceptor接口);
// 生成类
Object proxy = enhancer.create();

MethodInterceptor接口接口中,一个intercept方法,代理过程在intercept方法中执行

当代理对象调用方法时,即会执行intercept方法

相关文章:

Spring IOC注入方式、Bean作用域

Spring IOC注入 手动注入 set方法注入 需要提供set方法 public class UserService {private UserDao userDao; ​public void setUserDao(UserDao userDao) {this.userDao userDao;} } 设置属性字段的值 <bean id"userService" class"com.shsxt.servi…...

uniapp微信小程序转发跳转指定页面

onShareAppMessage 是微信小程序中的一个重要函数&#xff0c;用于自定义转发内容。当用户点击右上角的菜单按钮&#xff0c;并选择“转发”时&#xff0c;会触发这个函数。开发者可以在这个函数中返回一个对象&#xff0c;用于定义分享卡片的标题、图片、路径等信息。 使用场…...

利用uniapp开发鸿蒙:运行到鸿蒙模拟器—踩坑合集

从uniapp运行到鸿蒙模拟器上这一步&#xff0c;就有非常多的坑&#xff0c;一些常见的坑&#xff0c;官网都有介绍&#xff0c;就不再拿出来了&#xff0c;这里记录一下官网未记录的大坑 1.运行路径从hbuilderx启动鸿蒙模拟器 解决方法&#xff1a; Windows系统&#xff0c;官…...

【Vue】Vue3.0(二十五)Vue3.0中的具名插槽 的概念和使用场景

上篇文章 【Vue】Vue3.0&#xff08;二十四&#xff09;Vue3.0中 r e f s 、 refs 、 refs、parent 的概念和使用场景 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Vue专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年11月20日16点30分 …...

【pytorch-02】:张量的索引、形状操作和常见运算函数

文章目录 1 张量索引1.1 简单行列索引和列表索引1.2 布尔索引和多维索引 2 张量的形状操作2.1 reshape函数2.2 transpose和permute函数的使用2.3 view和contiguous函数2.4 squeeze和unsqueeze函数用法2.5 张量更改形状小结 3 常见运算函数 1 张量索引 1.1 简单行列索引和列表索…...

C语言-指针作为函数返回值及二级指针

1、指针作为函数返回值 c语言允许函数的返回值是一个指针&#xff08;地址&#xff09;我们将这样的函数称为指针函数&#xff0c;下面的例子定义一了一个函数strlong&#xff08;&#xff09;&#xff0c;用来返回两个字符串中较长的一个&#xff1a; 1. #include <stdio…...

css 使用图片作为元素边框

先看原始图片 再看效果 边框的四个角灭有拉伸变形,但是图片的中部是拉伸的 代码 border-style: solid;/* 设置边框图像的来源 */border-image-source: url(/static/images/mmwz/index/bk_hd3x.png);/* 设置如何切割图像 */border-image-slice: 66;/* 设置边框的宽度 */border…...

Linux无sudo权限将zsh作为默认shell

由于我只有用户权限&#xff0c;没有sudo权限&#xff0c;将zsh作为用户默认shell需要密码&#xff0c;所以没法在系统层面进行操作&#xff0c;下面另寻他法。 安装zsh 可以根据网上教程去安装zsh&#xff0c;一般电脑上会带有zsh&#xff0c;可以使用下述命令查看是否安装z…...

【React 进阶】掌握 React18 全部 Hooks

一、数据更新驱动 1. useState 1. 基础介绍 useState主要用于声明和操作状态变量&#xff0c;可以使函数组件像类组件一样拥有state const [state, setState] useState(initialState);state&#xff1a;状态&#xff0c;作为渲染视图的数据源 setState&#xff1a;改变st…...

【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)

【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现&#xff08;Kalman Filter&#xff09; 更新以gitee为准&#xff1a; 文章目录 数据预测概念和适用方式线性系统的适用性 数据预测算法和卡尔曼滤波公式推导状态空间方程和观测器先验估计后验估计…...

【SQL50】day 2

目录 1.每位经理的下属员工数量 2.员工的直属部门 3.判断三角形 4.上级经理已离职的公司员工 5.换座位 6.电影评分 7.修复表中的名字 8.患某种疾病的患者 9.删除重复的电子邮箱 1.每位经理的下属员工数量 # Write your MySQL query statement below #e1是经理&#xff0c;…...

【内存管理】理解 `WeakReference` 以更好地管理 Android 应用中的内存

在 Android 应用开发中&#xff0c;内存管理至关重要。糟糕的内存管理可能导致“内存泄漏”&#xff0c;即一些不再需要的对象仍然留在内存中&#xff0c;最终导致性能下降&#xff0c;甚至应用崩溃。WeakReference 就是帮助解决这个问题的一种工具。在本文中&#xff0c;我们将…...

解决IDEA中Maven管理界面不是层级结构的问题

文章目录 0. 前言1. 点击Maven管理界面右上角的三个点2. 勾选将模块分组3. 分组后的层级结构 更多 IDEA 的使用技巧可查看 IDEA 专栏中的文章&#xff1a;IDEA 0. 前言 在 IDEA 中&#xff0c;如果项目中有很多子模块&#xff0c;每个子模块中又有一个或多个子模块时&#xf…...

Linux运维篇-iscsi存储搭建

目录 概念实验介绍环境准备存储端软件安装使用targetcli来管理iSCSI共享存储 客户端软件安装连接存储 概念 iSCSI是一种在Internet协议上&#xff0c;特别是以太网上进行数据块传输的标准&#xff0c;它是一种基于IP Storage理论的存储技术&#xff0c;该技术是将存储行业广泛…...

深度学习基础练习:代码复现transformer重难点

2024/11/10-2024/11/18: 主要对transformer一些比较难理解的点做了一些整理&#xff0c;希望对读者有所帮助。 前置知识&#xff1a; 深度学习基础练习&#xff1a;从pytorch API出发复现LSTM与LSTMP-CSDN博客 【神经网络】学习笔记十四——Seq2Seq模型-CSDN博客 【官方双语】一…...

141. Sprite标签(Canvas作为贴图)

上节课案例创建标签的方式&#xff0c;是把一张图片作为Sprite精灵模型的颜色贴图,本节给大家演示把Canvas画布作为Sprite精灵模型的颜色贴图&#xff0c;实现一个标签。 注意&#xff1a;本节课主要是技术方案讲解&#xff0c;默认你有Canvas基础&#xff0c;如果没有Canvas基…...

【IDEA】解决总是自动导入全部类(.*)问题

文章目录 问题描述解决方法 我是一名立志把细节说清楚的博主&#xff0c;欢迎【关注】&#x1f389; ~ 原创不易&#xff0c; 如果有帮助 &#xff0c;记得【点赞】【收藏】 哦~ ❥(^_-)~ 如有错误、疑惑&#xff0c;欢迎【评论】指正探讨&#xff0c;我会尽可能第一时间回复…...

python中的OS模块的基本使用

&#x1f389;&#x1f389;&#x1f389;欢迎来到我的博客,我是一名自学了2年半前端的大一学生,熟悉的技术是JavaScript与Vue.目前正在往全栈方向前进, 如果我的博客给您带来了帮助欢迎您关注我,我将会持续不断的更新文章!!!&#x1f64f;&#x1f64f;&#x1f64f; 文章目录…...

【Qt】QComboBox设置默认显示为空

需求 使用QComboBox&#xff0c;遇到一个小需求是&#xff0c;想要设置未点击出下拉列表时&#xff0c;内容显示为空。并且不想在下拉列表中添加一个空条目。 实现 使用setPlaceholderText()接口。我们先来看下帮助文档&#xff1a; 这里说的是&#xff0c;placeholderText是…...

LeetCode - #139 单词拆分

文章目录 前言摘要1. 描述2. 示例3. 答案题解动态规划的思路代码实现代码解析1. **将 wordDict 转换为 Set**2. **初始化 DP 数组**3. **状态转移方程**4. **返回结果** **测试用例**示例 1:示例 2:示例 3: 时间复杂度空间复杂度总结关于我们 前言 本题由于没有合适答案为以往遗…...

服务器作业4

[rootlocalhost ~]# vim 11.sh #关闭防火墙 systemctl stop firewalld setenforce 0 #1.接收用户部署的服务名称 read -p "服务名称:(nginx)" server_name if [ $server_name ! nginx ];then echo "输入的不是nginx,脚本退出" exit 1 fi # 判断是…...

IOC控制反转---相关的介绍和6大注解解读(类注解+方法注解)

文章目录 1.传统方式造车2.传统方法的弊端3.IOC的引入3.IOC对于图书管理系统进行改进&#xff08;初识&#xff09;4.注解的使用说明4.1controller注解4.2service注解4.3component注解4.4关于spring命名的问题4.5component重命名4.6repository注解4.7configuration注解4.8注解之…...

SpringBoot(8)-任务

目录 一、异步任务 二、定时任务 三、邮件任务 一、异步任务 使用场景&#xff1a;后端发送邮件需要时间&#xff0c;前端若响应不动会导致体验感不佳&#xff0c;一般会采用多线程的方式去处理这些任务&#xff0c;但每次都需要自己去手动编写多线程来实现 1、编写servic…...

【机器学习】如何配置anaconda环境(无脑版)

马上就要上机器学习的实验&#xff0c;这里想写一下我配置机器学习的anaconda环境的二三事 一、首先&#xff0c;下载安装包&#xff1a; Download Now | Anaconda 二、打开安装包&#xff0c;一直点NEXT进行安装 这里要记住你要下载安装的路径在哪&#xff0c;后续配置环境…...

java 可以跨平台的原因是什么?

我们对比一个东西就可以了&#xff0c;那就是chrome浏览器。 MacOS/Linux/Windows上的Chrome浏览器&#xff0c;那么对于HTML/CSS/JS的渲染效果都一样的。 我们就可以认为ChromeHTML/CSS/JS是跨平台的。 这里面&#xff0c;HTML/CSS/JS是不变的的&#xff0c;对于一个网页&a…...

Solana应用开发常见技术栈

编程语言 Rust Rust是Solana开发中非常重要的编程语言。它具有高性能、内存安全的特点。在Solana智能合约开发中&#xff0c;Rust可以用于编写高效的合约代码。例如&#xff0c;Rust的所有权系统可以帮助开发者避免常见的内存错误&#xff0c;如悬空指针和数据竞争。通过合理利…...

npm | Yarn | pnpm Node.js包管理器比较与安装

一、包管理器比较 参考原文链接&#xff1a; 2024 Node.js Package Manager 指南&#xff1a;npm、Yarn、pnpm 比较 — 2024 Node.js Package Manager Guide: npm, Yarn, pnpm Compared (nodesource.com) 以下是对 Node.js 的三个包管理工具 npm、Yarn 和 pnpm 的优缺点总结&am…...

Linux下编译MFEM

本文记录在Linux下编译MFEM的过程。 零、环境 操作系统Ubuntu 22.04.4 LTSVS Code1.92.1Git2.34.1GCC11.4.0CMake3.22.1Boost1.74.0oneAPI2024.2.1 一、安装依赖 二、编译代码 附录I: CMakeUserPresets.json {"version": 4,"configurePresets": [{&quo…...

【团购核销】抖音生活服务商家应用快速接入②——商家授权

文章目录 一、前言二、授权流程三、授权Url3.1 Url参数表3.2 授权能力表3.3 源码示例 四、授权回调4.1 添加授权回调接口4.2 授权回调接口源码示例 五、实际操作演示六、参考 一、前言 目的&#xff1a;将抖音团购核销的功能集成到我们自己开发的App和小程序中 【团购核销】抖音…...

django宠物服务管理系统

摘 要 宠物服务管理系统是一种专门为宠物主人和宠物服务提供商设计的软件。它可以帮助用户快速找到附近的宠物医院、宠物美容店、宠物寄养中心等服务提供商&#xff0c;并预订相关服务。该系统还提供了一系列实用的功能。通过使用宠物服务管理系统&#xff0c;用户可以更加方便…...