Spring工厂API与原理

文章目录

  • 1. Spring 核心 API
  • 2. 程序开发
  • 3. 细节分析
    • 3.1 名词解释
    • 3.2 Spring⼯⼚的相关的⽅法
    • 3.3 配置⽂件中需要注意的细节
  • 4. Spring⼯⼚的底层实现原理(简易版)
  • 5. 思考


在这里插入图片描述

1. Spring 核心 API

ApplicationContext

作⽤:Spring 提供的 ApplicationContext 这个⼯⼚,⽤于对象的创建

好处:解耦合

ApplicationContext 接⼝类型

接⼝:屏蔽实现的差异

⾮web环境 : ClassPathXmlApplicationContext (main junit)

web环境 : XmlWebApplicationContext

在这里插入图片描述

ApplicationContext 是重量级资源。会占用大量内存。

So 不会频繁的创建对象 : ⼀个应⽤只会创建⼀个⼯⼚对象。

一定是线程安全的。


2. 程序开发

  1. 创建类型

  2. 配置⽂件的配置 applicationContext.xml

    <bean id="person" class="com.snow.po.Person"/>
    
  3. 通过⼯⼚类,获得对象

    ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml"); Person person = (Person)ctx.getBean("person"); 
    

3. 细节分析

3.1 名词解释

Spring⼯⼚创建的对象,叫做 bean 或者组件(componet)

3.2 Spring⼯⼚的相关的⽅法

//	通过这种⽅式获得对象,就不需要强制类型转换
Person person = ctx.getBean("person", Person.class);
System.out.println("person = " + person);//	当前Spring的配置⽂件中 只能有⼀个<bean class是Person类型
Person person = ctx.getBean(Person.class);
System.out.println("person = " + person);//	获取的是 Spring⼯⼚配置⽂件中所有bean标签的id值 person person1
String[] beanDefinitionNames = ctx.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {System.out.println("beanDefinitionName = " +beanDefinitionName);
}//	根据类型获得Spring配置⽂件中对应的id值集合
String[] beanNamesForType = ctx.getBeanNamesForType(Person.class);
for (String id : beanNamesForType) {System.out.println("id = " + id);
}//	⽤于判断是否存在指定id值的bean
//	⽤于判断是否存在指定id值得bean,不能判断name值
if (ctx.containsBeanDefinition("a")) {System.out.println("true = " + true);
}else{System.out.println("false = " + false);
}//	⽤于判断是否存在指定id值的bean
//	⽤于判断是否存在指定id值得bean,也可以判断name值
if (ctx.containsBean("person")) {System.out.println("true = " + true);
}else{System.out.println("false = " + false);
}

3.3 配置⽂件中需要注意的细节

1. 只配置class属性
<bean class="com.snow.po.Person"/>a) 上述这种配置 有没有id值 有 -> 默认:com.snow.po.Person#0b) 应⽤场景: 如果这个bean只需要使⽤⼀次,那么就可以省略id值如果这个bean会使⽤多次,或者被其他bean引⽤则需要设置id值2. name属性
作⽤:⽤于在Spring的配置⽂件中,为bean对象定义别名(⼩名)
相同:
1. ctx.getBean("id|name")-->object
2. <bean id="student" class=""等效<bean name="student,stu,xuesheng" class=""
区别:别名可以定义多个, 但是id属性只能有⼀个值
//⽤于判断是否存在指定id值得bean,不能判断name值
if (ctx.containsBeanDefinition("person")) {System.out.println("true = " + true);
}else{System.out.println("false = " + false);
}
//⽤于判断是否存在指定id值得bean,也可以判断name值
if (ctx.containsBean("p")) {System.out.println("true = " + true);
}else{System.out.println("false = " + false);
}

4. Spring⼯⼚的底层实现原理(简易版)

Spring⼯⼚是可以调⽤对象私有的构造⽅法创建对象(反射

在这里插入图片描述


5. 思考

问题:在开发过程中,是不是所有的对象,都会交给 Spring ⼯⼚来创建呢?

回答:理论上 是的,但是有特例 :实体对象(entity)是不会交给 Spring 创建,它是由持久层框架进⾏创建。


在这里插入图片描述



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

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

相关文章

【Java程序设计】【C00267】基于Springboot的在线考试系统(有论文)

基于Springboot的在线考试系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 本系统是基于Springboot的在线考试系统&#xff1b;本系统主要分为管理员、教师和学生三种角色&#xff1b; 管理员登录系统后&#xff0c;可以对首页&#x…

vue 手势解锁功能

效果 实现 <script setup lang"ts"> const canvasRef ref<HTMLCanvasElement>() const ctx ref<CanvasRenderingContext2D | null>(null) const width px2px(600) const height px2px(700) const radius ref(px2px(50))const init () > …

Java字符集【ASCII,GBK,Unicode】

1.常见字符集 1.标准ASCII字符集 美国信息交换标准代码&#xff0c;包括了英文、符号等。 标准ASCII使用1个字节存储一个字符&#xff0c;首位是0&#xff0c;总共可表示128个字符&#xff0c;对美国人来说完全够用。 2.GBK&#xff08;汉字内码扩展规范&#xff0c;国标&#…

【GB28181】wvp-gb28181-Pro 运行错误汇总避坑大全(持续更新)

快捷查找 1、【问题】终端控制台打印的日志乱码 1、【问题】终端控制台打印的日志乱码 【解决】 由于windows系统默认编码是gbk,导致jar包在windows系统运行中文会导致乱码 控制台日志乱码&#xff1a; 打开cmd命令框&#xff0c;输入以下命令 chcp 65001 更改cmd的编码为UTF-8…

反序列化 [NPUCTF2020]ReadlezPHP1

打开题目 直接查看源代码 打开源代码发现了个./time.php?source 访问一下 审计代码&#xff1a; 现存在反序列化语句&#xff1a;$ppp unserialize($_GET["data"]);和执行漏洞&#xff1a;echo $b($a); 发现在__destruct()方法里面有 echo $b($a); 这个是php的…

Vue3项目结构分析

node_modules: 是项目npm install下载的node依赖库。 public&#xff1a; favicon.ico: 网页图标logo图片。index.html: 入口html。是一个基础的html页面&#xff0c;其中进行网页最基础的设置&#xff0c;并且设置了id为app的div盒子。该页面即为Vue单页面应用的基础页面。后…

基于Springboot实现课程评分系统设计和实现

基于java Springboot实现课程评分系统设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获取源码…

大数据-数据可视化-环境部署vue+echarts+显示案例

文章目录 一、安装node.js1 打开火狐浏览器,下载Node.js2 进行解压3 配置环境变量4 配置生效二、安装vue脚手架1 下载vue脚手架,耐心等待。三、创建vue项目并启动1 创建2 启动四、下载echarts.js与axios.js到本地。五、图表显示demo【以下所有操作均在centos上进行】 一、安…

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

目录 地址转换函数 字符串IP转整数IP 整数IP转字符串IP 关于inet_ntoa 简单的单执行流TCP网络程序 TCP socket API 详解及封装TCP socket 服务端创建套接字 服务端绑定 服务端监听 服务端获取连接 服务端处理请求 客户端创建套接字 客户端连接服务器 客户端…

Web3之光:揭秘数字创新的未来

随着数字化时代的深入发展&#xff0c;Web3正以其独特的技术和理念&#xff0c;为我们打开数字创新的崭新视角。作为数字化时代的新兴力量&#xff0c;Web3将深刻影响着我们的生活、工作和社会。本文将揭秘Web3的奥秘&#xff0c;探讨其在数字创新领域的前景和潜力。 1. 重新定…

Day22_JDK新特性(Lambda表达式,Optional类,StreamAPI,方法引用与构造器引用,java9-17新特性)

文章目录 Day22 JDK新特性学习目标1 Lambda表达式1.1 函数式编程思想1.2 函数接口的概念1.3 Java8之前的函数式接口1.4 Lambda表达式语法1、标准格式演示2、Lambda表达式的简化 1.5 Java8之后引入的函数式接口**1、消费型接口****2、供给型接口****3、判断型接口****4、功能型接…

浅析SpringBoot框架常见未授权访问漏洞

文章目录 前言Swagger未授权访问RESTful API 设计风格swagger-ui 未授权访问swagger 接口批量探测 Springboot Actuator未授权访问数据利用未授权访问防御手段漏洞自动化检测工具 CVE-2022-22947 RCE漏洞原理分析与复现漏洞自动化利用工具 其他常见未授权访问Druid未授权访问漏…