最简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相关 ,这篇博文适合初 ...
随机推荐
- 2022.2.1最新版本的IDEA
一.下载破解工具.激活码 激活工具下载链接:https://note.youdao.com/s/1ANz2F3o 6G5NXCPJZB-eyJsaWNlbnNlSWQiOiI2RzVO ...
- ASP.NET Core开发者指南(2022版路线图)
ASP.NET Core开发者指南 2022年 ASP.NET Core 开发者指南: 在下面,您可以看到一个图,说明可以采用的路径以及要成为ASP.NET Core开发人员所想要学习的库.我将此图作 ...
- 详解神经网络基础部件BN层
摘要:在深度神经网络训练的过程中,由于网络中参数变化而引起网络中间层数据分布发生变化的这一过程被称为内部协变量偏移(Internal Covariate Shift),而 BN 可以解决这个问题. 本 ...
- 【KAWAKO】MNN-1.2.0版本交叉编译遇到的错误与解决方法
目录 在使用gcc-linaro-7.5.0-aarch64-linux-gnu.gcc-linaro-6.3.1-aarch64-linux-gnu交叉编译链对MNN1.2.0进行交叉编译的过程中, ...
- C# Socket 通信时,怎样判断 Socket 双方是否断开连接
参考内容: C#socket通信时,怎样判断socket双方是否断开连接 C#之Socket断线和重连 Socket.Poll 方法 Socket.Blocking 属性 最近需要写个网口通信的上位机 ...
- Java面向对象进阶第一天
面向对象高级第一天 static关键字 是静态的意思,可以修饰成员变量,也可以修饰成员方法 成员变量的分类 静态成员变量 有static修饰,属于类,与类一起加载,内存中只有一份,可以被共享访问. 什 ...
- Git基础操作及协作流程
一整套流程帮你实践整个 Git 操作基础流程. 来源:https://docs.microsoft.com/zh-cn/learn/paths/intro-to-vc-git/ Git 介绍 配置 G ...
- slate源码解析(二)- 基本框架与数据模型
源码架构 首先来看下最核心的slate包下的目录: 可以看到,作为一个开源富文本库,其源码是相当之少.在第一篇文章中说过,Slate没有任何开箱即用的功能,只提供给开发者用于构建富文本所需的最基本的一 ...
- Wpf Border圆角 设置不成功
//错误的用法 这样子是不会出现圆角的,哪怕你把CornerRadius设置到1000 <Border CornerRadius="3" Width="100&qu ...
- C - Functions again CodeForces - 789C
C - Functions again CodeForces - 789C 这道题考查了对Map的运用 #include<iostream> #include<cstdio> ...