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. Windows/office常用的激活工具有哪些

    Windows/office常用的激活方式 Windows激活方式有两种 Kms激活与数字权利永久激活,这两种激活方式各有优势,KMS激活通用性强(支持Windows+Office),但只能激活180 ...

  2. jmeter做性能测试

    一.线程与进程 一个软件/程序,是以进程的方式存在的,一个进程可含多个线程(一个软件可以做多个事情,就是基于线程而实现的) 二.并发的基本概念 并发: 并发用户数:同一时刻,服务器/接口接收到的用户量 ...

  3. 安装和配置Java开发环境JDK

    我们通常软件开发的操作系统选择Windows,生产环境选择linux或windows Server.移动开发可能是安卓或IOS和鸿蒙系统等. Windows下一般选择的是64位的操作系统,一般建议CP ...

  4. C++练习3 定义带默认值的参数

    通过void func 定义函数的默认值和其可以容纳多少个实参 1 #include <iostream> 2 using namespace std; 3 void func(int a ...

  5. linux下删除文件夹的软链接时注意千万不能在后面加反斜杠,千万不要用强制删除,否则下面2种场景,你会把源文件删除,要闯祸的

    今天遇到一个坑,自己在子目录下创建了父目录的软链接,导致可以无限循环进入父目录 [clouder@ana53 dir1]$ ll total 8 -rw-rw-r-- 1 clouder cloude ...

  6. 东方CannonBall

    代码 #include<cstdio> using namespace std; const int N = 1e5; double fx[N + 5] , fy[N + 5] , g[N ...

  7. FreeFileSync:开源的文件同步工具 | Linux 中国

    转载知乎: https://zhuanlan.zhihu.com/p/194778373

  8. Vulhub 漏洞学习之:DNS

    Vulhub 漏洞学习之:DNS 1 DNS域传送漏洞 DNS协议支持使用axfr类型的记录进行区域传送,用来解决主从同步的问题.如果管理员在配置DNS服务器的时候没有限制允许获取记录的来源,将会导致 ...

  9. CCRD_TOC_2008年第11期

    中信国健临床通讯 2008年第11期(总第24期) 目 录   脊柱关节炎 1. 一项多中心.大型.随机.双盲.对照试验证实依那西普治疗AS的疗效优于柳氮磺吡啶 Braun J, et al. ACR ...

  10. python批量修改一个文件夹下含多个文件夹中的所有图片名称

    网上能找到的,大多是只对一个文件夹下所有图片进行重命名的代码. 这边实现的是,一个文件夹下有多个文件夹内图片的重命名. rename.py #!/usr/bin/python # -*- coding ...