Spring IoC容器(一)

 IoC,Inversion of Control 控制反转,是一个过程。仅通过构造函数、工厂方法或在对象实例化后在对象实例上设置属性来定义其依赖关系。容器负责这些工作,这个过程从本质上来说是bean本身的反向,因此称为反向控制。

1 容器

负责实例化、配置及装配bean。容器从配置元数据那获取该怎么实例化、配置及装配bean。而配置来源主要有三个:1)XML;2)java注释;3)java代码。xml比较常用。

@Configuration // 将一个普通类标志为IoC容器
public class CustomConfig {@Bean // 定义一个beanpublic User customUser() {return new User();}
}private static void test1() {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(CustomConfig.class);User user = context.getBean(User.class);System.out.println(user);
}

上面代码展示了java代码配置bean的方式。通过AnnotationConfigApplicationContext来获取容器。

图 ApplicationContext的方法及实现类

BeanFactory 接口提供了管理Bean的方法,而ApplicationContext继承了该接口,并有以下扩展:

1)更容易与Spring 的aop集成。

2)消息资源处理。

3)事件发布。

4)针对web项目,提供了特定的子类。

图 ApplicationContext的方法及实现类

2 Bean

构成程序主干并由IoC容器管理的对象称为bean。

在模块化开发中,不同模块的容器可能存在依赖了同一bean的bean。有时,我们考虑到扩展或者在某个模块中有特定的命名规范,所依赖的这个bean的命名可能会不同。 比如模块A、B依赖同一个数据源配置bean。 在模块A中该bean命名为datasourceA,在模块B中命名为datasourceB。这时候需要用到别名。

<!--数据源,common.xml-->
<bean id="datasource" class="dao.BaseDao"/><!--模块A a.xml-->
<import resource="dao.xml"/><!—别名-->
<alias name="datasource" alias="datasourceA"/>
<bean id="teacherService" class="service.TeacherService"><property name="baseDao" ref="baseDao"/>
</bean>

2.1 实例化

xml配置中,实例化bean有三种方式:1)构造函数;2)静态工厂方法;3)bean的工厂方法。

public class GoodsDao {
}public class GoodsService {public GoodsDao makeGoodsDao() {return new GoodsDao();}
}public class StaticFactory {public static GoodsService makeGoodsService() {return new GoodsService();}
}<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd" default-lazy-init="true"><!--构造函数实例化--><bean id="goodsService" class="instantiating.GoodsService"/><!--静态工厂实例化,class为该工厂的类--><bean id="goodsService2" class="instantiating.StaticFactory" factory-method="makeGoodsService"/><!--bean的工厂实例化--><bean id="goodsDao" factory-bean="goodsService" factory-method="makeGoodsDao"/>
</beans>

3 依赖

依赖是指对象在运行中需要用到的其他对象。在IoC中由容器负责注入。注入方式有两种:1)构造函数;2)set方法。

public class OtherDao {
}public class ReportDao {
}public class ReportService {private ReportDao reportDao;private String name;private Double num;public ReportService(ReportDao reportDao, String name, Double num) {this.reportDao = reportDao;this.name = name;this.num = num;}private Properties dataProperties;private Map<String, String> stockInfoMap;private List<String> links;private OtherDao otherDao;public void setDataProperties(Properties dataProperties) {this.dataProperties = dataProperties;}public void setStockInfoMap(Map<String, String> stockInfoMap) {this.stockInfoMap = stockInfoMap;}public void setLinks(List<String> links) {this.links = links;}public void setOtherDao(OtherDao otherDao) {this.otherDao = otherDao;}@Overridepublic String toString() {return "ReportService{" +"reportDao=" + reportDao +", name='" + name + '\'' +", num=" + num +", dataProperties=" + dataProperties +", stockInfoMap=" + stockInfoMap +", links=" + links +", otherDao=" + otherDao +'}';}public static void main(String[] args) {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("dependency.xml");ReportService reportService = applicationContext.getBean(ReportService.class);System.out.println(reportService);}
}<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd" default-lazy-init="true"><bean id="reportDao" class="dependency.ReportDao"/><bean id="reportService" class="dependency.ReportService">
<!--        constructor-arg 为构造函数参数,参数可以依赖其他bean,也可以是基本类似--><constructor-arg name="reportDao" ref="reportDao"/><constructor-arg name="name" value="reportService层"/><constructor-arg name="num" value="103.4"/>
<!--        set方法,来注入参数-->
<!--        Properties类型--><property name="dataProperties"><props><prop key="host">localhost</prop><prop key="username">admin</prop><prop key="password">123</prop></props></property>
<!--        Map类型--><property name="stockInfoMap"><map><entry key="name" value="中国平安"/><entry key="stock" value="601318.sh"/></map></property>
<!--        List类型--><property name="links">
<!--            空值--><null /></property><property name="otherDao">
<!--            内部bean,可以不要id或者name,不会被其他bean依赖--><bean class="dependency.OtherDao"/></property></bean>
</beans>

3.1 depends-on与懒加载

容器创建一个bean时,会先创建起依赖的bean。但是有时两个bean直接没有直接依赖,但是希望在创建这个bean之前,先创建其他的bean。可用depends-on来完成这个需求:

<bean id="teacherDao" class="dao.TeacherDao" depends-on="userDao,baseDao"/>

在创建teacherDao这个bean之前,会先创建userDao及baseDao这两个bean。

在容器中,默认会在项目加载时把所有的bean都创建完成,这样做的好处是某个bean的配置错误能在运行时被发现。但是有时不希望创建所有的bean,希望当要使用这个bean时再来创建,default-lazy-init  懒加载属性可以作用于全局的beans,也可以作用于单个的beans。当值为true时,bean在第一次使用时才会被创建。

3.2 方法注入

假如bean1的某个方法,在每次调用时都需要一个特定的bean2(不是bean1的直接依赖,即非bean1的字段)。传统方法是,可以在该方法中通过ApplicationContext获取bean2。这是这样加大了耦合度,容器提供了Lookup标签来实现此类需求:

public class Bean2 {
}public class Bean1 {private final static ApplicationContext applicationContext = new ClassPathXmlApplicationContext("method.xml");/*** 传统方式*/public void showBean2OfTradition() {Object bean2 = applicationContext.getBean("bean2");System.out.println(bean2);}/*** Lookup 方法*/public Bean2 getBean2() {return null;}public static void main(String[] args) {Bean1 bean1 = applicationContext.getBean(Bean1.class);bean1.showBean2OfTradition();System.out.println(bean1.getBean2());}
}<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd" default-lazy-init="true"><bean id="bean1" class="method.Bean1">
<!--        会覆盖原getBean2方法,直接返回bean2--><lookup-method name="getBean2" bean="bean2"/></bean><bean id="bean2" class="method.Bean2"/>
</beans>

4 作用域

bean 也可以指定作用域(生命周期),Spring支持六种作用域。bean的scope属性来指定该bean的作用域。

singleton

默认作用域。不同容器生成的bean不同。

prototype

在同一容器中,不同bean依赖的bean被创建的实例不同。

request

每次请求都会创建不同的bean。

session

每个session都会创建不同 bean。

application

每个servletContext生成不同的bean。

websocket

每个websocket连接生成不同的bean。

表 spring 的六种bean的作用域

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

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

相关文章

C语言入门(二)、每日Linux(三)——gcc命令,通过gcc命令熟悉C语言程序实现的过程

使用gcc编译C语言程序 C语言程序实现的过程gcc命令基础用法常用选项编译和汇编选项&#xff1a;优化选项&#xff1a;调试选项&#xff1a;链接选项&#xff1a;警告选项&#xff1a; 实验对于-o选项 通过gcc命令熟悉C语言程序的执行过程1.预处理2.编译阶段3.汇编阶段4.链接阶段…

Java 面试题之 IO(二)

字符流 文章目录 字符流Reader&#xff08;字符输入流&#xff09;Writer&#xff08;字符输出流&#xff09; 文章来自Java Guide 用于学习如有侵权&#xff0c;立即删除 不管是文件读写还是网络发送接收&#xff0c;信息的最小存储单元都是字节。 那为什么 I/O 流操作要分为字…

Java 与 JavaScript的区别

Java 与 JavaScript的区别 Java 与 JavaScript&#xff1a;概述Java的特点JavaScript 的起源JavaScript 的特点Java 与 JavaScript&#xff0c;哪个更好&#xff1f;JavaScript 与 Java 相似吗&#xff1f;Java 与 JavaScript 的区别JavaScript 在服务器端的运行方式是怎样的&a…

网络防御安全知识(第二版)

安全策略 传统的包过滤防火墙 --- 其本质为ACL列表&#xff0c;根据数据报中的特征进行过滤&#xff0c;之后对比规制&#xff0c; 执行动作。 五元组 --- 源IP&#xff0c; 目标IP&#xff0c;源端口&#xff0c; 目标端口&#xff0c;协议 安全策略 --- 相较于ACL的改进之…

Linux/Delivery

Enumeration nmap 首先扫描目标端口对外开放情况&#xff0c;第一轮扫描发现对外开放了22,80,8065三个端口&#xff0c;端口详细信息如下 nmap -sC -sV -p 22,80,8065 10.10.10.222 nmap显示22端口运行着ssh服务&#xff0c;80端口运行着http服务&#xff0c;8065端口运行的…

基于go mod模式创建项目最佳实践

希望能带给你成功的喜悦&#xff01; 除go get、vendor这两种方式外&#xff0c;Go版本在1.11之后推出了go module模式来管理依赖&#xff0c;使用go mod时下载的依赖文件在$GOPATH/pkg/mod/下。本文以两种办法介绍如何创建go mod项目。 目录 goland开启玩法 本地手动创建项目…

【Linux】Linux下多线程

需要云服务器等云产品来学习Linux的同学可以移步/–>腾讯云<–/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;优惠多多。&#xff08;联系我有折扣哦&#xff09; 文章目录 1. 前置&#xff1a;进程地址空间和页表1.1 如何看待进程地址空间和页表1.2 虚拟地址…

MIAOYUN获评OpenCloudOS社区2023年度优秀贡献企业

近日&#xff0c;OpenCloudOS社区发布了社区年度贡献企业榜单&#xff0c;成都元来云志科技有限公司&#xff08;简称“MIAOYUN”&#xff09;凭借对国产开源的热情&#xff0c;及对操作系统产业的支持&#xff0c;通过兼容适配互认证&#xff0c;为推动OpenCloudOS规模化应用&…

使用IP爬虫代理提取数据的步骤是什么?爬虫代理IP怎么提高采集效率?

​​​​​ 一、使用IP爬虫代理提取数据的步骤 在使用爬虫代理IP提取数据之前&#xff0c;需要先了解数据来源和目标网站的结构。以下是一个基本的步骤&#xff1a;1.确定数据来源 首先需要确定要提取数据的网站或数据源&#xff0c;了解网站的结构、数据存储方式以及数据更新…

Qt应用软件【协议篇】Modbus详细介绍

文章目录 概述Modbus 485协议概述在工业自动化中的应用 通信模式数据模型功能码 Modbus RTU示例 1&#xff1a;读取保持寄存器示例 2&#xff1a;写入单个线圈示例 3&#xff1a;写入多个保持寄存器报文传输 Modbus ASCII报文示例报文传输 Modbus TCP报文示例报文传输 概述 在…

如何将iPad连接到USB设备?这里提供了详细步骤

本文介绍了如何将iPad连接到USB设备。说明适用于所有版本的iPad。 将USB设备与带USB-C端口的iPad一起使用 以下iPad具有USB-C端口: 自2018年第三代以来的iPad Pro机型 自2020年第四代以来的iPad Air机型 自2021年第六代以来的iPad迷你机型 自2022年以来的第十代iPad机型 这些…

动手学深度学习(一)深度学习介绍2

目录 二、起源 三、深度学习的成功案例&#xff1a; 四、特点&#xff1a; 五、小结&#xff1a; 二、起源 为了解决各种各样的机器学习问题&#xff0c;深度学习提供了强大的工具。 虽然许多深度学习方法都是最近才有重大突破&#xff0c;但使用数据和神经网络编程的核心思…

Redis学习——高级篇①

Redis学习——高级篇① Redis7高级之单线程和多线程&#xff08;一&#xff09; 一、Redis单线程VS多线程1.Redis的单线程部分1.1 Redis为什么是单线程&#xff1f;1.2 Redis所谓的“单线程”1.3 Redis演进变化1.3.1 Redis 3.x 单线程时代性能很快的原因1.3.2…

【Linux网络编程】网络编程套接字(1)

【Linux网络编程】网络编程套接字(1) 目录 【Linux网络编程】网络编程套接字(1)源IP地址和目的IP地址端口号端口号和进程ID的关系 网络通信TCP协议UDP协议网络字节序socket编程接口简单的UDP网络程序 作者&#xff1a;爱写代码的刚子 时间&#xff1a;2024.1.29 前言&#xff1…

树--二叉树(C语言纯手凹)

目录 目录 1.什么是树&#xff1f;&#xff08;不深入&#xff0c;仅做了解&#xff09; 2.树的表示方式 2.1孩子兄弟表示法&#xff08;左孩子右兄弟&#xff09; 2.2孩子表示法 2.3双亲表示法 3.什么是二叉树 4.二叉树分类 4.1满二叉树 4.2完全二叉树 4.3二叉搜索树…

基础小白快速学习c语言----变量的仔细介绍

变量&#xff1a; 表面理解&#xff1a;在程序运行期间&#xff0c;可以改变数值的数据&#xff0c; 深层次含义&#xff1a;变量实质上代表了一块儿内存区域&#xff0c;我们可以将变量理解为一块儿内存区域的标识&#xff0c;当我们操作变量时&#xff0c;相当于操作了变量…

qemu搭建arm64 linux kernel环境

一、环境准备 ubuntu 22.04 内核源码&#xff1a;linux-6.6.1 &#xff08;直接上最新版&#xff09; 下载链接&#xff1a;The Linux Kernel Archives 交叉编译工具链&#xff1a; sudo apt-get install gcc-12-aarch64-linux-gnu 具体能用的版本gcc-XX-arch64-linux-gnu…

如何使用IaC Scan Runner扫描IaC中的常见安全漏洞

关于IaC Scan Runner IaC Scan Runner是一款针对IaC&#xff08;基础设施即代码&#xff09;的安全漏洞扫描工具&#xff0c;在该工具的帮助下&#xff0c;广大安全开发人员可以轻松扫描IaC&#xff08;基础设施即代码&#xff09;中的常见漏洞。 IaC Scan Runner本质上是一个…

正则表达式 文本三剑客

一 正则表达式&#xff1a; 由一类特殊字符及文本字符所编写的模式&#xff0c;其中有些字符&#xff08;元字符&#xff09;不表示字符字面意义&#xff0c;而表示控制或通配的功能&#xff0c;类似于增强版的通配符功能&#xff0c;但与通配符不同&#xff0c;通配符功能是用…

2023年算法GWCA -CNN-BiLSTM-ATTENTION回归预测(matlab)

2023年算法GWCA -CNN-BiLSTM-ATTENTION回归预测&#xff08;matlab&#xff09; GWCA -CNN-BiLSTM-Attention长城建造算法优化卷积-长短期记忆神经网络结合注意力机制的数据回归预测 Matlab语言。 长城建造算法&#xff08;Great Wall Construction Algorithm&#xff0c;GWC…