Spring IOC注入方式、Bean作用域

news2024/11/20 1:01:15

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方法

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

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

相关文章

翼鸥教育:从OceanBase V3.1.4 到 V4.2.1,8套核心集群升级实践

引言&#xff1a;自2021年起&#xff0c;翼鸥教育便开始应用OceanBase社区版&#xff0c;两年间&#xff0c;先后部署了总计12套生产集群&#xff0c;其中核心集群占比超过四分之三&#xff0c;所承载的数据量已突破30TB。自2022年10月&#xff0c;OceanBase 社区发布了4.2.x 版…

如何在 Ubuntu 22.04 上安装 ownCloud

简介 ownCloud 是一个开源的个人云存储平台&#xff0c;它允许用户在本地服务器上存储和同步文件&#xff0c;提供了一个类似于 Dropbox 或 Google Drive 的服务&#xff0c;但是更加注重隐私和数据控制。以下是 ownCloud 的一些基础使用简介&#xff1a; 文件存储&#xff1…

使用Mybatis向Mysql中的插入Point类型的数据全方位解析

1. 结果 希望每一个能够看到结果的人都能自己装载进去&#xff01;加油&#xff01; 2.代码 2.1TestMapper import org.apache.ibatis.annotations.*; import java.util.Date; import java.util.List;/*** author Administrator*/ Mapper public interface TestMapper {/*…

web——sqliabs靶场——第六关——报错注入和布尔盲注

这一关还是使用报错注入和布尔盲注 一. 判断是否有sql注入 二. 判断注入的类型 是双引号的注入类型。 3.报错注入的检测 可以使用sql报错注入 4.查看库名 5. 查看表名 6.查看字段名 7. 查具体字段的内容 结束 布尔盲注 结束

鸿蒙实战:页面跳转传参

文章目录 1. 实战概述2. 实现步骤2.1 创建鸿蒙项目2.2 编写首页代码2.3 新建第二个页面 3. 测试效果4. 实战总结 1. 实战概述 本次实战&#xff0c;学习如何在HarmonyOS应用中实现页面间参数传递。首先创建项目&#xff0c;编写首页代码&#xff0c;实现按钮跳转至第二个页面并…

数据结构(基本概念及顺序表——c语言实现)

基本概念&#xff1a; 1、引入 程序数据结构算法 数据&#xff1a; 数值数据&#xff1a;能够直接参加运算的数据&#xff08;数值&#xff0c;字符&#xff09; 非数值数据&#xff1a;不能够直接参加运算的数据&#xff08;字符串、图片等&#xff09; 数据即是信息的载…

一.安装版本为19c的Oracle数据库管理系统(Oracle系列)

1.数据库版本信息&#xff1a; 版本信息&#xff1a; 或者直接由命令查出来&#xff1a; 2.操作系统的版本信息 3.安装包下载与上传 可以去oracle官网下载也可以从其他人的百度网盘链接中下载&#xff1a; 使用xftp工具或者其他的工具&#xff08;mobaxterm&#xff09;上传到l…

从 IDC 到云原生:稳定性提升 100%,成本下降 50%,热联集团的数字化转型与未来展望

作者&#xff1a;金峰&#xff08;项良&#xff09;、朱永林、赵世振&#xff08;寰奕&#xff09; 公司简介 杭州热联集团股份有限公司成立于 1997 年 10 月&#xff0c;是隶属杭州市实业投资集团的国有控股公司。公司专业从事国际、国内钢铁贸易黑色大宗商品及产业服务&…

说说软件工程中的“协程”

在软件工程中&#xff0c;协程&#xff08;coroutine&#xff09;是一种程序运行的方式&#xff0c;可以理解成“协作的线程”或“协作的函数”。以下是对协程的详细解释&#xff1a; 一、协程的基本概念 定义&#xff1a;协程是一组序列化的子过程&#xff0c;用户能像指挥家…

MinIO 的 S3 over RDMA 计划: 为高速人工智能数据基础设施设定对象存储新标准

随着 AI 和机器学习的需求不断加速&#xff0c;数据中心网络正在迅速发展以跟上步伐。对于许多企业来说&#xff0c;400GbE 甚至 800GbE 正在成为标准选择&#xff0c;因为数据密集型和时间敏感型 AI 工作负载需要高速、低延迟的数据传输。用于大型语言处理、实时分析和计算机视…

怀旧游戏打卡清单(TODO)

感觉忙碌了好久好久&#xff0c;真的好想休息一下。。 整理一下将来休息时候的打卡清单&#xff0c;不工作了去个海边狂打游戏&#xff0c;想想就惬意啊。当然&#xff0c;最好找个work from home&#xff0c;去海边找个酒店上班。挣钱休息两不误。。。 能不能实现另说&#xf…

《Python制作动态爱心粒子特效》

一、实现思路 粒子效果&#xff1a; – 使用Pygame模拟粒子运动&#xff0c;粒子会以爱心的轨迹分布并运动。爱心公式&#xff1a; 爱心的数学公式&#xff1a; x16sin 3 (t),y13cos(t)−5cos(2t)−2cos(3t)−cos(4t) 参数 t t 的范围决定爱心形状。 动态效果&#xff1a; 粒子…

使⽤MATLAB进⾏⽬标检测

目录 数据准备定义模型并训练用测试集评估性能推理过程⼀⾏代码查看⽹络结构⼀⾏代码转onnx结语 ⼈⽣苦短&#xff0c;我⽤MATLAB。 Pytorch在深度学习领域占据了半壁江⼭&#xff0c;最主要的原因是⽣态完善&#xff0c;⽽且api直观易⽤。但谁能想到现在MATLAB⽤起来⽐Pytorch…

word-毕业论文的每一章节的页眉单独设置为该章的题目怎么设置

在Microsoft Word中&#xff0c;为毕业论文的每个章节设置不同的页眉&#xff0c;通常需要使用“分节符”来分隔各个章节&#xff0c;然后在每个章节中单独设置页眉。以下是详细步骤&#xff1a; 使用分节符 插入分节符&#xff1a; 将光标放在每个章节的末尾&#xff08;注意…

【简历】25届江苏二本JAVA简历:本末倒置,重点部分格式错误,不重要的写了一堆

简历总体说明 校招的第一法则就是必须要确定校招层次。 开发岗分为大中小厂&#xff0c;不同的层次对学校背景、时间点、项目和考点的要求都不太一样&#xff0c;所以必须要确定就业的层次。 这是一个25届二本同学的JAVA简历。 最近不知道怎么回事&#xff0c;看两份简历都…

字母异位词分组(java)

题目描述 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单shilie 示例 1: 输入: strs ["eat", "tea", "tan", "ate", "n…

fpga spi回环

SPI设备间的数据传输之所以又被称为数据交换,是因为 SPI协议规定一个 SPI设备 不能在数据通信过程中仅仅只充当一个"发送者(Transmitter)“或者"接收者 (Receiver)”.在每个 Clock 周期内,SPI 设备都会发送并接收一个 bit 大小的数据(不管主 设备好还是从设备),相当于…

计算机网络-理论部分(二):应用层

网络应用体系结构 Client-Server客户-服务器体系结构&#xff1a;如Web&#xff0c;FTP&#xff0c;Telnet等Peer-Peer&#xff1a;点对点P2P结构&#xff0c;如BitTorrent 应用层协议定义了&#xff1a; 交换的报文类型&#xff0c;请求or响应报文类型的语法字段的含义如何…

路由器基本原理与配置

一 &#xff0c; 路由是什么&#xff1f; 从源主机到目标主机的转发过程&#xff1b; 二 &#xff0c; 路由器 &#xff08;1&#xff09;路由器的工作原理 路由器是一种三层设备&#xff0c;是使用IP地址寻址&#xff0c;实现从源IP到达目标IP地址的端到端的服务&#xff0c…

windows的WSL Ubuntu子系统重置root或其他用户的密码

思路&#xff1a;以管理员身份运行PowerShell&#xff0c;在命令行窗口重置密码 &#xff0c;不需要删除或重新安装Linux子系统。 1、以管理员身份运行PowerShell 2、用root用户启动Ubuntu&#xff0c;执行 wsl.exe --user root 3、重置密码&#xff0c;执行passwd username&…