最简spring IOC实现
public class Main {
public static void main(String[] args) throws Exception {
Class<Address> addressClass = Address.class;
Constructor<Address> declaredConstructor = addressClass.getDeclaredConstructor();
Field field1 = addressClass.getDeclaredField("address");
field1.setAccessible(true);
MyValue myValue = field1.getAnnotation(MyValue.class);
String value = myValue.value();
Address address = declaredConstructor.newInstance();
field1.set(address, value);
field1.setAccessible(false);
MyComponent annotation1 = addressClass.getAnnotation(MyComponent.class);
Map<String, Object> container = new HashMap<>();
container.put(annotation1.name(), address);
Class<MyService> myServiceClass = MyService.class;
Constructor<MyService> declaredConstructor1 = myServiceClass.getDeclaredConstructor();
MyService myService = declaredConstructor1.newInstance();
Field field2 = myServiceClass.getDeclaredField("name");
field2.setAccessible(true);
MyValue annotation = field2.getAnnotation(MyValue.class);
field2.set(myService, annotation.value());
field2.setAccessible(false);
Field field3 = myServiceClass.getDeclaredField("address");
field3.setAccessible(true);
field3.set(myService, container.get(field3.getAnnotation(MyResource.class).name()));
field3.setAccessible(false);
container.put(myServiceClass.getAnnotation(MyComponent.class).name(), myService);
for (Map.Entry<String, Object> entry : container.entrySet()) {
String key = entry.getKey();
Object value1 = entry.getValue();
System.out.println(key + " => " + value1);
}
}
}
@MyComponent(name="myService")
class MyService {
@MyValue(value="yury")
private String name;
@MyResource(name="address")
private Address address;
@Override
public String toString() {
return "MyService{" +
"name='" + name + '\'' +
", address=" + address +
'}';
}
}
@MyComponent(name="address")
class Address {
@MyValue(value="shanghai")
private String address;
@Override
public String toString() {
return "Address{" +
"address='" + address + '\'' +
'}';
}
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface MyComponent {
String name();
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface MyValue {
String value();
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface MyResource {
String name();
}
最简spring IOC实现的更多相关文章
- 最简 Spring IOC 容器源码分析
前言 BeanDefinition BeanFactory 简介 Web 容器启动过程 bean 的加载 FactoryBean 循环依赖 bean 生命周期 公众号 前言 许多文章都是分析的 xml ...
- Spring(2)——Spring IoC 详解
Spring IoC 概述 IoC:Inverse of Control(控制反转) 读作"反转控制",更好理解,不是什么技术,而是一种设计思想,就是将原本在程序中手动创建对象的控 ...
- 【死磕 Spring】----- IOC 之深入理解 Spring IoC
在一开始学习 Spring 的时候,我们就接触 IoC 了,作为 Spring 第一个最核心的概念,我们在解读它源码之前一定需要对其有深入的认识,本篇为[死磕 Spring]系列博客的第一篇博文,主要 ...
- 关于Spring IOC (DI-依赖注入)需要知道的一切
关联文章: 关于Spring IOC (DI-依赖注入)你需要知道的一切 关于 Spring AOP (AspectJ) 你该知晓的一切 <Spring入门经典>这本书无论对于初学者或者有 ...
- IOC 之深入理解 Spring IoC
在一开始学习 Spring 的时候,我们就接触 IoC 了,作为 Spring 第一个最核心的概念,我们在解读它源码之前一定需要对其有深入的认识,本篇为[死磕 Spring]系列博客的第一篇博文,主要 ...
- 关于Spring IOC (DI-依赖注入)
<Spring入门经典>这本书无论对于初学者或者有经验的工程师还是很值一看的,最近花了点时间回顾了Spring的内容,在此顺带记录一下,本篇主要与spring IOC相关 ,这篇博文适合初 ...
- Spring IOC容器启动流程源码解析(四)——初始化单实例bean阶段
目录 1. 引言 2. 初始化bean的入口 3 尝试从当前容器及其父容器的缓存中获取bean 3.1 获取真正的beanName 3.2 尝试从当前容器的缓存中获取bean 3.3 从父容器中查找b ...
- Spring IOC 巨多 非常 有用
关联文章: 关于Spring IOC (DI-依赖注入)你需要知道的一切 关于 Spring AOP (AspectJ) 你该知晓的一切 <Spring入门经典>这本书无论对于初学者或者有 ...
- 从零开始手写 spring ioc 框架,深入学习 spring 源码
IoC Ioc 是一款 spring ioc 核心功能简化实现版本,便于学习和理解原理. 创作目的 使用 spring 很长时间,对于 spring 使用非常频繁,实际上对于源码一直没有静下心来学习过 ...
- 关于Spring IOC (DI-依赖注入)你需要知道的一切
<Spring入门经典>这本书无论对于初学者或者有经验的工程师还是很值一看的,最近花了点时间回顾了Spring的内容,在此顺带记录一下,本篇主要与spring IOC相关 ,这篇博文适合初 ...
随机推荐
- 学习Java Day28
今天简单的学习了一下文档的注释,注释插入以/**开始,以*/结束,每个/**...*/文档注释包含标记以及之后紧跟着的自由格式文本 然后类注释必须放在import语句之后,类定义之前: 方式注释必须放 ...
- ArcGIS Pro SDK 002 对数据文件的读取和操作
做系统开发或者数据处理的时候,我一般还是喜欢使用文件数据源,例如矢量用.shp文件存储,栅格数据用.tif或者.img文件存储.ArcGIS Pro SDK中对数据源操作的API和ArcObjects ...
- CCRD_TOC_2007年11月_总第12期
中信国健临床通讯 2007年11月, 总第12期 目 录 类风湿关节炎 1 MRI证实Etanercept治疗的RA患者中尽管关节炎症还在持续但是骨侵蚀进展停止 Dohn UM, et al. C ...
- js根据指定字段数据去重
//根据id去重 function unique(arr1) { const res = new Map(); return arr1.filter((a) => !res.has(a.id) ...
- corundum:100G NIC 学习:(一)
2021-10-03 17:13:47 目标:在Linux环境下,基于VCU118板卡恢复出100G corundum NIC. 一.Corundum简介 GitHub repository: htt ...
- Vue进度条组件
1.进度条颜色是渐变的 <template> <div id="progress_bar" ref="myChart"></div ...
- Linux 磁盘扩容
原文链接:https://blog.csdn.net/zzq100zzq/article/details/125178843 一.查看系统磁盘1.使用df -hl ,查看系统的磁盘使用情况二.linu ...
- ModuleNotFoundError:No module named 'past' 问题及解决方法
训练YOLOX时报错 ModuleNotFoundError:No module named 'past' 解决方法 使用pip安装对应的package:future pip install futu ...
- 安装完IDEA后无法打开
安装完IDEA后无法打开 一.现象 安装完IDEA2021.3版本后,无论用什么办法都无法打开 二.原因 原先有安装过idea,里面有加载过一些插件,或者是破解过,会生成一些文件,导致IDEA无法运行 ...
- C++ MFC学习 (三)
视窗口覆盖在框架窗口之上 如果有了 OnDraw 不要再用OnPaint OnPaint会覆盖掉OnDraw所画内容 1 // MFC_Demo1View.cpp : CMFC_Demo1View ...