前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >手写Spring-ioc 注入 jdk反射实现 绝对满足你的好奇心哦 解决怎么我写了一个注解就可以直接注入了?

手写Spring-ioc 注入 jdk反射实现 绝对满足你的好奇心哦 解决怎么我写了一个注解就可以直接注入了?

作者头像
宁在春
发布2022-10-31 14:26:36
1740
发布2022-10-31 14:26:36
举报
文章被收录于专栏:关于Java学习@宁在春

Spring-Ioc原理 解析

我们学完Spring后,大都就直接接着学习之后的内容啦,但是我想偶尔回过头来看一看,才能走的更远啊。

温故而知新。

关于Spring是怎么实现的?怎么我写了一个注解就可以直接注入了?

这种问题,我开始学的时候就好奇了,当时懂的比较少,查完也就给忘记了。

随着学的越来越多,就越来越感觉到基础的重要性,所以就想再抽空来复习一遍。

本文写的是一个小demo,并不是从Spring的架构去谈Spring。

只对Spring的ioc的注入用java的反射做了一个简单的理解。

我想可以满足许多同我一样产生过好奇心的同学一个满足。

全部代码都可以直接copy测试,仅仅导入了junit。其余都是使用jdk反射实现的。

代码

首先写一个类 UserService

代码语言:javascript
复制
/**
 * @Author: crush
 * @Date: 2021-05-27 10:36
 * version 1.0
 */
public class UserService {

    public void test(){
        System.out.println("这是一个测试!!!");
    }
}

再像Spring一样 来写个注解

代码语言:javascript
复制
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @Author: crush
 * @Date: 2021-05-27 10:36
 * version 1.0
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface AutoWired {
}

接着 写一个UserController

代码语言:javascript
复制
/**
 * @Author: crush
 * @Date: 2021-05-27 10:36
 * version 1.0
 */
public class UserController {

    @AutoWired
    private UserService userService;


    public UserService getUserService() {
        return userService;
    }

    public void test(){
        userService.test();
    }

}

最后的就是测试

代码语言:javascript
复制
import org.junit.Test;
import java.util.stream.Stream;

/**
 * @Author: crush
 * @Date: 2021-05-27 10:40
 * version 1.0
 */
public class MyTest {

    @Test
    public void iocTest() {
        UserController userController = new UserController();
        Class<? extends UserController> clazz = userController.getClass();

        // 获取所有属性值  
        Stream.of(clazz.getDeclaredFields()).forEach(field -> {
            String name = field.getName();
            AutoWired annotation = field.getAnnotation(AutoWired.class);
            if (annotation != null) {
                // 防止私有属性 也称暴力反射
                field.setAccessible(true);
                // 获取属性的类型
                Class<?> type = field.getType();
                try {
                    //创建此Class对象表示的类的新实例。 就像通过带有空参数列表的new表达式实例化该类一样。
                    // 如果尚未初始化该类,则将其初始化。
                    Object o = type.newInstance();
                    field.set(userController,o);
                } catch (InstantiationException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        });
        // 这里是测试
        System.out.println(userController.getUserService());
        userController.test();
    }
}
在这里插入图片描述
在这里插入图片描述

自言自语

我觉得Spring真的很多,看到都会产生一种恐惧,最近在对Spring进行深一步的了解,会接着发博客。

可是就是因为人对世间事物的好奇,才能走的更远吧,我已经感觉对Spring产生极大的兴趣啦。

大家一起加油哦

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-05-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Spring-Ioc原理 解析
  • 代码
  • 自言自语
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档