spring学习(spring容器、加载配置文件方式、获取bean的方式)

目录

一、加载spring配置文件的几种方式。

(0)工程文件初始化。

(1)加载类路径下的配置文件。(常见)

(2)加载文件绝对路径的配置文件。

(3)加载多个配置文件。

二、获取bean的方式。

(1)容器对象.getBean("id")+强制类型转换。

(2)容器对象.getBean("id","bean类型")。

(3)容器对象.getBean("bean类型")。

三、spring容器初始化方式。

(1)BeanFactory接口。

<1>第一种方案。

<2>第二种方案。

(2)ApplicationContext接口。

(3)BeanFactory(Bean工厂)与ApplicationContext接口核心区别。

<1>BeanFactory延迟加载bean。

<2>ApplicationContext即时加载bean。

(4)关闭容器的接口。

<1>ConfigurableApplicationContext接口。


一、加载spring配置文件的几种方式。

(0)工程文件初始化。
  • 基于Maven构建工程。引入spring-context依赖坐标。
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.18</version>
</dependency>

  • dao层。BookDao接口。BookDaoImpl实现类。

package com.fs.dao;public interface BookDao {/*** dao层save方法*/void save();
}
package com.fs.dao.impl;import com.fs.dao.BookDao;public class BookDaoImpl implements BookDao {@Overridepublic void save() {System.out.println("book dao save...");}
}

  • resources目录下的spring配置文件。将BookDaoImpl交给spring容器管理。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="bookDao" class="com.fs.dao.impl.BookDaoImpl"></bean></beans>

  • 测试类(App)。通过获取容器对象得到对应管理的bean。通过对象调用save方法完成测试。


(1)加载类路径下的配置文件。(常见)
  • 使用类路径加载配置文件。new ClassPathXmlApplicationContext(xxx)。
package com.fs.test;import com.fs.dao.BookDao;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class App {public static void main(String[] args) {//1.使用类路径加载配置文件ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");BookDao bookDao = (BookDao) context.getBean("bookDao");bookDao.save();}
}

  • 运行结果。


(2)加载文件绝对路径的配置文件。
  • 使用文件系统加载配置文件。new FileSystemXmlApplicationContext(xxx)。
  • 复制文件的引用(绝对路径)。


package com.fs.test;import com.fs.dao.BookDao;
import org.springframework.context.support.FileSystemXmlApplicationContext;public class App {public static void main(String[] args) {//2.使用文件系统加载配置文件FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext("D:\\javacode2025\\spring-0219\\src\\main\\resources\\applicationContext.xml");BookDao bookDao = (BookDao) context.getBean("bookDao");bookDao.save();}
}
  • 运行结果也是如第1种方式一样。不过通常大多数都是使用类路径加载配置文件。

(3)加载多个配置文件。
  • 无论是哪种方式,都可以一次加载多个配置文件,配置文件之间使用逗号相隔即可。
 //使用类路径加载多个配置文件ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml","applicationContext2.xml");

二、获取bean的方式。

(1)容器对象.getBean("id")+强制类型转换。
  • 简单理解:使用bean名称(id)获取。
package com.fs.test;import com.fs.dao.BookDao;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class App {public static void main(String[] args) {//使用类路径加载配置文件ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");BookDao bookDao = (BookDao) context.getBean("bookDao");bookDao.save();}
}

(2)容器对象.getBean("id","bean类型")。
  • 简单理解:使用bean名称(id)并指定类型获取。
package com.fs.test;import com.fs.dao.BookDao;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class App {public static void main(String[] args) {//使用类路径加载配置文件ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");BookDao bookDao = context.getBean("bookDao", BookDao.class);bookDao.save();}
}

(3)容器对象.getBean("bean类型")。
  • 简单理解:使用bean类型获取。
  • 局限性。容器内部管理的某个类型的实体类的bean只能有一个。
package com.fs.test;import com.fs.dao.BookDao;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class App {public static void main(String[] args) {//使用类路径加载配置文件ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");BookDao bookDao = context.getBean(BookDao.class);bookDao.save();}
}

三、spring容器初始化方式。

(1)BeanFactory接口。
  • BeanFactory是IoC容器的顶层接口。初始化BeanFactory对象时,加载的bean延迟加载。


  • 当然使用BeanFactory接口也可以完成IoC容器对象的实例化。因为是spring最早期的实例化容器的方案。

<1>第一种方案。
package com.fs.test;import com.fs.dao.BookDao;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;public class AppForBeanFactory {public static void main(String[] args) {Resource resource = new ClassPathResource("applicationContext.xml");BeanFactory beanFactory = new XmlBeanFactory(resource);BookDao bookDao = beanFactory.getBean(BookDao.class);bookDao.save();}
}
<2>第二种方案。
package com.fs.test;import com.fs.dao.BookDao;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;public class AppForBeanFactory2 {public static void main(String[] args) {//创建bean工厂对象DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();//创建一个读取spring配置文件的对象XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);//加载spring配置文件并交给bean工厂xmlBeanDefinitionReader.loadBeanDefinitions("applicationContext.xml");BookDao bookDao = beanFactory.getBean(BookDao.class);bookDao.save();}
}
(2)ApplicationContext接口。
  • ApplicationContext是spring容器的核心接口,初始化bean是即时加载。
  • 可以通过类与接口间的层次结构向上寻找。其中ClassPathXmlApplicationContext、FileSystemXmlApplicationContext类是ApplicationContext接口常用初始化类。
  • 而ApplicationContext接口是后期在BeanFactory接口的基础上发展而来的。并通过若干个子接口、实现类的扩张,达到了最佳的使用状态。也就是现在ApplicationContext接口提供的功能要比BeanFactory接口要多得多。


(3)BeanFactory(Bean工厂)与ApplicationContext接口核心区别。
  • BeanFactory创建bean对象的时机是当调用getBean()方法时才创建延迟加载)。

  • 而ApplicationContext一创建对象就把bean对象创建好了即时加载


<1>BeanFactory延迟加载bean。
  • 1、在BookDaoImpl实现类新增无参构造方法。并打印一句话。
  • 2、测试类中从调用getBean()方法往下注释。
package com.fs.dao.impl;import com.fs.dao.BookDao;public class BookDaoImpl implements BookDao {public BookDaoImpl() {System.out.println("book dao constructor...");}@Overridepublic void save() {System.out.println("book dao save...");}
}
  • 测试类AppForBeanFactory。

package com.fs.test;import com.fs.dao.BookDao;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;public class AppForBeanFactory {public static void main(String[] args) {Resource resource = new ClassPathResource("applicationContext.xml");BeanFactory beanFactory = new XmlBeanFactory(resource);/*BookDao bookDao = beanFactory.getBean(BookDao.class);bookDao.save();*/}
}
  • 结果发现并没有调用无参构造,未完成bean的初始化。(延迟加载bean)

<2>ApplicationContext即时加载bean。
  • 而ApplicationContext在创建容器对象的时候就完成了bean的初始化。
package com.fs.test;import com.fs.dao.BookDao;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class App {public static void main(String[] args) {//使用类路径加载多个配置文件ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml","applicationContext2.xml");/*BookDao bookDao = context.getBean(BookDao.class);bookDao.save();*/}
}
  • 测试结果也就是打印了无参构造的输出。


  • 也可以在spring配置文件中的属性lazy-init="true"(设置延迟加载)。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="bookDao" class="com.fs.dao.impl.BookDaoImpl" lazy-init="true"></bean></beans>

(4)关闭容器的接口。
<1>ConfigurableApplicationContext接口。
  • 涉及到bean的生命周期与控制——close()方法。
  • 具体可以查看之前的博客:spring学习(bean的生命周期与控制?)_spring 控制bean 生命周期-CSDN博客

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

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

相关文章

DeepSeek-R1论文阅读及蒸馏模型部署

DeepSeek-R1论文阅读及蒸馏模型部署 文章目录 DeepSeek-R1论文阅读及蒸馏模型部署摘要Abstract一、DeepSeek-R1论文1. 论文摘要2. 引言3. DeepSeek-R1-Zero的方法3.1 强化学习算法3.2 奖励建模3.3 训练模版3.4 DeepSeek-R1-Zero的性能、自进化过程和顿悟时刻 4. DeepSeek-R1&am…

华为动态路由-OSPF-骨干区

华为动态路由-OSPF-骨干区 一、OSPF简介 1、OSPF概述 OSPF是一种开放式的、基于链路状态的内部网关协议&#xff08;IGP&#xff09;&#xff0c;用于在自治系统内部进行路由选择和通信。 OSPF是互联网工程任务组&#xff08;IETF&#xff09;定义的标准之一&#xff0c;被广…

RocketMQ - 常见问题

RocketMQ常见问题 文章目录 RocketMQ常见问题一&#xff1a;消息幂等问题1&#xff1a;什么是消费幂等2&#xff1a;消息重复的场景分析2.1&#xff1a;发送时消息重复2.2&#xff1a;消费时消息重复2.3&#xff1a;Rebalance时消息重复 3&#xff1a;通用解决方案3.1&#xff…

MySQL登录问题总结

不管何种数据库&#xff0c;使用的第一步都是先登录。 MySQL命令行登录语句&#xff1a;mysql -u username -P port -p -D database_name 登录MySQL的报错一般从报错信息都能得到反馈&#xff0c;常见报错原因分析如下&#xff0c;实例中的以test用户为例&#xff0c;登录环境为…

《千恋万花》无广版手游安卓苹果免费下载直装版

自取https://pan.xunlei.com/s/VOJS77k8NDrVawqcOerQln2lA1?pwdn6k8 《千恋万花》&#xff1a;柚子社的和风恋爱杰作 《千恋万花》&#xff08;Senren * Banka&#xff09;是由日本知名美少女游戏品牌柚子社&#xff08;Yuzusoft&#xff09;于2016年推出的一款和风恋爱题材…

【部署优化篇三】《DeepSeek边缘计算实战:把目标检测模型塞进树莓派,让AI在巴掌大的设备上“开天眼“》

“谁说只有超级计算机才能跑AI?今天咱们就要在树莓派上玩转DeepSeek目标检测,让这个巴掌大的小盒子变成会‘看’世界的智能终端!” 本文手把手教你从零开始,把最潮的目标检测模型塞进树莓派。全程高能预警,建议准备好你的树莓派4B/5和散热风扇,咱们这就开启边缘计算的魔法…

C++ Primer 类的作用域

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

如何在 VS Code 中快速使用 Copilot 来辅助开发

在日常开发中&#xff0c;编写代码往往是最耗时的环节之一。而 GitHub Copilot&#xff0c;作为一款 AI 编码助手&#xff0c;可以帮助开发者 自动补全代码、生成代码片段&#xff0c;甚至直接编写完整的函数&#xff0c;大幅提升编码效率。那么&#xff0c;如何在 VS Code 中快…

剑指 Offer II 024. 反转链表

comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20024.%20%E5%8F%8D%E8%BD%AC%E9%93%BE%E8%A1%A8/README.md 剑指 Offer II 024. 反转链表 题目描述 给定单链表的头节点 head &#xff0c;请反转链表&#xff…

通过API 调用本地部署 deepseek-r1 模型

如何本地部署 deepseek 请参考&#xff08;windows 部署安装 大模型 DeepSeek-R1&#xff09; 那么实际使用中需要开启API模式&#xff0c;这样可以无拘无束地通过API集成的方式&#xff0c;集成到各种第三方系统和应用当中。 上遍文章是基于Ollama框架运行了deepSeek R1模型…

【产品经理】需求分析方法论+实践

阐述了需求分析的基本认知&#xff0c;包括需求分析的定义、原则和内容。接着&#xff0c;文章详细介绍了需求分析的十个步骤&#xff0c;从收集需求到结果评审&#xff0c;为产品经理提供了清晰的操作指南。 作为产品经理&#xff0c;需求分析是一个最基本的工作&#xff0c;但…

【玩转 Postman 接口测试与开发2_020】(完结篇)DIY 实战:随书示例 API 项目本地部署保姆级搭建教程(含完整调试过程)

《API Testing and Development with Postman》最新第二版封面 文章目录 最新版《Postman 接口测试与开发实战》示例 API 项目本地部署保姆级搭建教程1 前言2 准备工作3 具体部署3.1 将项目 Fork 到自己名下3.2 创建虚拟环境并安装依赖3.3 初始运行与项目调试 4 示例项目的用法…

2025年02月19日Github流行趋势

项目名称&#xff1a;OmniParser 项目地址url&#xff1a;https://github.com/microsoft/OmniParser 项目语言&#xff1a;Jupyter Notebook 历史star数&#xff1a;12878 今日star数&#xff1a;2153 项目维护者&#xff1a;yadong-lu, ThomasDh-C, aliencaocao, nmstoker, kr…

侯捷 C++ 课程学习笔记:设计模式在面向对象开发中的应用

在侯捷老师的《C 面向对象开发》课程中&#xff0c;除了对面向对象编程的基础特性&#xff08;封装、继承和多态&#xff09;的深入讲解外&#xff0c;还引入了设计模式这一高级主题。设计模式是面向对象编程中的一种最佳实践&#xff0c;能够帮助开发者解决常见的设计问题&…

前七章综合练习

一&#xff0c;拓扑图 二&#xff0c;实验要求 不限 三&#xff0c;实验步骤 第一步&#xff0c;搭建拓扑图 如上 注意&#xff1a; 第二步&#xff0c;配置IP trust&#xff1a; client1 client2 fw untrusrt-1&#xff1a; fw r3 电信DNS 百度web-1 untrust-2&#xf…

个人shell脚本分享

在周一到周五做增量备份&#xff0c;在周六周日做完全备份 #!/bin/bash定义变量 SRC“/path/to/source” # 源目录 BKUP“/backup” # 备份主目录 FUL“KaTeX parse error: Expected EOF, got # at position 22: …ull" #̲ 完全备份目录 INC"BKUP/inc” # 增量备份…

C语言之函数封装技巧

目录 前言 一、函数在源代码中的三种状态 二、函数封装的运用 案例1&#xff1a;实现打印20以内的素数 案例2&#xff1a;存放因子数并返回长度 三、return返回与形参返回 四、<>与“” 五、解耦 总结 前言 在C语言中&#xff0c;函数封装是一种重要的技巧&#…

深度神经网络终极指南:从数学本质到工业级实现(附Keras版本代码)

深度神经网络终极指南&#xff1a;从数学本质到工业级实现&#xff08;附Keras版本代码&#xff09; 为什么深度学习需要重新理解&#xff1f;&#xff08;与浅层模型的本质差异&#xff09; 模型类型参数容量特征学习方式适合问题类型浅层模型102-104手动特征工程低维结构化数…

vue3 + thinkphp 接入 七牛云 DeepSeek-R1/V3 流式调用和非流式调用

示例 如何获取七牛云 Token API 密钥 https://eastern-squash-d44.notion.site/Token-API-1932c3f43aee80fa8bfafeb25f1163d8 后端 // 七牛云 DeepSeek API 地址private $deepseekUrl https://api.qnaigc.com/v1/chat/completions;private $deepseekKey 秘钥;// 流式调用pub…

IIS asp.net权限不足

检查应用程序池的权限 IIS 应用程序池默认使用一个低权限账户&#xff08;如 IIS_IUSRS&#xff09;&#xff0c;这可能导致无法删除某些文件或目录。可以通过以下方式提升权限&#xff1a; 方法 1&#xff1a;修改应用程序池的标识 打开 IIS 管理器。 在左侧导航树中&#x…