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实现的更多相关文章

  1. 最简 Spring IOC 容器源码分析

    前言 BeanDefinition BeanFactory 简介 Web 容器启动过程 bean 的加载 FactoryBean 循环依赖 bean 生命周期 公众号 前言 许多文章都是分析的 xml ...

  2. Spring(2)——Spring IoC 详解

    Spring IoC 概述 IoC:Inverse of Control(控制反转) 读作"反转控制",更好理解,不是什么技术,而是一种设计思想,就是将原本在程序中手动创建对象的控 ...

  3. 【死磕 Spring】----- IOC 之深入理解 Spring IoC

    在一开始学习 Spring 的时候,我们就接触 IoC 了,作为 Spring 第一个最核心的概念,我们在解读它源码之前一定需要对其有深入的认识,本篇为[死磕 Spring]系列博客的第一篇博文,主要 ...

  4. 关于Spring IOC (DI-依赖注入)需要知道的一切

    关联文章: 关于Spring IOC (DI-依赖注入)你需要知道的一切 关于 Spring AOP (AspectJ) 你该知晓的一切 <Spring入门经典>这本书无论对于初学者或者有 ...

  5. IOC 之深入理解 Spring IoC

    在一开始学习 Spring 的时候,我们就接触 IoC 了,作为 Spring 第一个最核心的概念,我们在解读它源码之前一定需要对其有深入的认识,本篇为[死磕 Spring]系列博客的第一篇博文,主要 ...

  6. 关于Spring IOC (DI-依赖注入)

    <Spring入门经典>这本书无论对于初学者或者有经验的工程师还是很值一看的,最近花了点时间回顾了Spring的内容,在此顺带记录一下,本篇主要与spring IOC相关 ,这篇博文适合初 ...

  7. Spring IOC容器启动流程源码解析(四)——初始化单实例bean阶段

    目录 1. 引言 2. 初始化bean的入口 3 尝试从当前容器及其父容器的缓存中获取bean 3.1 获取真正的beanName 3.2 尝试从当前容器的缓存中获取bean 3.3 从父容器中查找b ...

  8. Spring IOC 巨多 非常 有用

    关联文章: 关于Spring IOC (DI-依赖注入)你需要知道的一切 关于 Spring AOP (AspectJ) 你该知晓的一切 <Spring入门经典>这本书无论对于初学者或者有 ...

  9. 从零开始手写 spring ioc 框架,深入学习 spring 源码

    IoC Ioc 是一款 spring ioc 核心功能简化实现版本,便于学习和理解原理. 创作目的 使用 spring 很长时间,对于 spring 使用非常频繁,实际上对于源码一直没有静下心来学习过 ...

  10. 关于Spring IOC (DI-依赖注入)你需要知道的一切

    <Spring入门经典>这本书无论对于初学者或者有经验的工程师还是很值一看的,最近花了点时间回顾了Spring的内容,在此顺带记录一下,本篇主要与spring IOC相关 ,这篇博文适合初 ...

随机推荐

  1. 学习Java Day28

    今天简单的学习了一下文档的注释,注释插入以/**开始,以*/结束,每个/**...*/文档注释包含标记以及之后紧跟着的自由格式文本 然后类注释必须放在import语句之后,类定义之前: 方式注释必须放 ...

  2. ArcGIS Pro SDK 002 对数据文件的读取和操作

    做系统开发或者数据处理的时候,我一般还是喜欢使用文件数据源,例如矢量用.shp文件存储,栅格数据用.tif或者.img文件存储.ArcGIS Pro SDK中对数据源操作的API和ArcObjects ...

  3. CCRD_TOC_2007年11月_总第12期

    中信国健临床通讯 2007年11月, 总第12期 目 录   类风湿关节炎 1 MRI证实Etanercept治疗的RA患者中尽管关节炎症还在持续但是骨侵蚀进展停止 Dohn UM, et al. C ...

  4. js根据指定字段数据去重

    //根据id去重 function unique(arr1) { const res = new Map(); return arr1.filter((a) => !res.has(a.id) ...

  5. corundum:100G NIC 学习:(一)

    2021-10-03 17:13:47 目标:在Linux环境下,基于VCU118板卡恢复出100G corundum NIC. 一.Corundum简介 GitHub repository: htt ...

  6. Vue进度条组件

    1.进度条颜色是渐变的 <template> <div id="progress_bar" ref="myChart"></div ...

  7. Linux 磁盘扩容

    原文链接:https://blog.csdn.net/zzq100zzq/article/details/125178843 一.查看系统磁盘1.使用df -hl ,查看系统的磁盘使用情况二.linu ...

  8. ModuleNotFoundError:No module named 'past' 问题及解决方法

    训练YOLOX时报错 ModuleNotFoundError:No module named 'past' 解决方法 使用pip安装对应的package:future pip install futu ...

  9. 安装完IDEA后无法打开

    安装完IDEA后无法打开 一.现象 安装完IDEA2021.3版本后,无论用什么办法都无法打开 二.原因 原先有安装过idea,里面有加载过一些插件,或者是破解过,会生成一些文件,导致IDEA无法运行 ...

  10. C++ MFC学习 (三)

    视窗口覆盖在框架窗口之上 如果有了 OnDraw 不要再用OnPaint  OnPaint会覆盖掉OnDraw所画内容 1 // MFC_Demo1View.cpp : CMFC_Demo1View ...