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

简单实现Spring容器(二)

阶段2:

 // 1.编写自己的Spring容器,实现扫描包,得到bean的class对象.2.扫描将 bean 信息封装到 BeanDefinition对象,并放入到Map.

思路:

1.将 bean 信息封装到 BeanDefinition对象中,再将其放入到BeanDefinitionMap集合中,集合的结构大概是
key[beanName]–value[beanDefintion]
key--------->对应指定的名字,未指定则以类的首字母小写为其名字
value------->对应封装好的BeanDefintion对象

2.因为bean的作用域可能是singleton,也可能是prototype,所以Spring需要扫描到bean信息,保存到集合,这样当getBean()根据实际情况处理.

具体实现

1.加一个自定义Scope注解

package com.elf.spring.annotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** @author 45~* @version 1.0* Scope 可以指定一个Bean的作用范围[singleton,prototype]*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Scope {//通过value可以指定singleton,prototypeString value() default "";
}

2.在MonsterService.java上加上@Scope多实例注解

package com.elf.spring.component;
import com.elf.spring.annotation.Component;
import com.elf.spring.annotation.Scope;/*** @author 45~* @version 1.0* 说明 MonsterService 是一个Servic*/
@Component //把MonsterService注入到我们自己的spring容器中
@Scope(value = "prototype")
public class MonsterService {}

3.准备ioc包下写一个BeanDefinition.java 用于封装记录Bean信息.

package com.elf.spring.ioc;/*** @author 45~* @version 1.0* BeanDefinition 用于封装和记录Bean的信息 [1.scope 2.存放bean对应的Class对象,反射可以生成对应的对象]*  2:因为将来getBean()时有可能是多实例,有可能是动态生成的,还要存放bean的class对象*/
public class BeanDefinition {private String scope;private Class clazz;public String getScope() {return scope;}public void setScope(String scope) {this.scope = scope;}public Class getClazz() {return clazz;}public void setClazz(Class clazz) {this.clazz = clazz;}@Overridepublic String toString() {return "BeanDefinition{" +"scope='" + scope + '\'' +", clazz=" + clazz +'}';}
}

相关文章:

  • uniapp 显示文件流图片
  • 利用ElementUI配置商品的规格参数
  • Spring Security6 快速实战
  • webrtc网之sip转webrtc
  • windows11 调整鼠标灵敏度方法
  • 在线html地址转html文本
  • 外置固态硬盘配置
  • C语言基础概念考查备忘 - 标识符、关键字、预定义标识符、语法检查、语义检查 ... 左值、右值、对象、副作用、未定义行为、sizeof是什么等等
  • 连接服务器的ssh终端自动断开解放方法
  • 商家门店小程序怎么做?门店小程序的优势和好处
  • 微服务的流量管理-服务网格
  • 说说React jsx转换成真实DOM的过程?
  • C++ vector基本操作
  • es6 语法 解构 拼接 扩展运算 数组降为 symbol 迭代器 生成器 定时器 map 映射 对象字面量 私有属性 构造函数继承
  • 【【FPGA的 MicroBlaze 的 介绍与使用 】】
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 2019.2.20 c++ 知识梳理
  • Android Studio:GIT提交项目到远程仓库
  • angular组件开发
  • codis proxy处理流程
  • JavaScript DOM 10 - 滚动
  • mysql innodb 索引使用指南
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • Vue全家桶实现一个Web App
  • 工作中总结前端开发流程--vue项目
  • 今年的LC3大会没了?
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • #include<初见C语言之指针(5)>
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (zt)最盛行的警世狂言(爆笑)
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (接口封装)
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (一)u-boot-nand.bin的下载
  • (转)Sql Server 保留几位小数的两种做法
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .cn根服务器被攻击之后
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .gitattributes 文件
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net core 6 redis操作类
  • .NET Core 中的路径问题
  • .NET Core跨平台微服务学习资源
  • .net framework 4.0中如何 输出 form 的name属性。
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .net MVC中使用angularJs刷新页面数据列表
  • .NetCore 如何动态路由
  • .NET设计模式(11):组合模式(Composite Pattern)
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • ?
  • ??myeclipse+tomcat