springIOC的核心:反射,以及我们如何用反射实现依赖注入

前言:
最近在一些腾讯课堂上看了一些大佬的讲解,就是在马士兵教育的连老师的讲完的spring源码课程对自己有很深的触动,首先我们来聊一下,我们知道springIOC的核心是java反射,是一个很基础的知识点。我们可以用反射来创建Class对象,以及获取一些类型的属性和类型,那么首先我们代码如何实现:
首先我们创建两个包:
cn.jbit.service/cn.jbit.controller:对应UserService接口和UserServiceImpl,还有UserController.下图是我们Controller的内容:
在这里插入图片描述
看上图,我们基本知道我们要做什么了,因为UserService是一个接口,我们要在UserController里实现UserService类型的注入,首先要用setter()方法来注入,接下来我们该怎么实现呢?平常我们都是使用spring给我们实现好的,那我们自己如何实现呢?下图:我写了一个测试类叫MyTest
在这里插入图片描述
首先我们拿到Controller对象,再根据我们对象的getClass()生成一个Class对象,也就是我们的UserController这个类型clazz,由于我们的要在UserController里面注入UserService对象,所以我们先new出来,再获取所有属性:
Filed serviceFiled=clazz.getDeclaredFiled(“userService”);
再给这些属性设置可用:
serviceFiled.setAccessible(true);
//通过UserController方法设置具体的属性
String name=serviceFiled.getName();
由于我们是set方法,得进行字符串的拼接
name=name.substring(0,1).toUpperCase()+name.substring(1,name.length());
//拼接
String setMethodName=“set”+name;
//通过方法注入属性对象
Method method=clazz.getMethod(setMethdName,UserService.class);
//反射生成对象
method.invoke(userController,userService);
那么我们又知道spring中不止set方法注入,还有注解的方式注入,那么注解的方式该怎么进行注入呢?看下面代码再进行解释:
在这里插入图片描述
我们只是在原有的属性上加了@AutoWired注解,平时我们用是spring自行给我们封装好的,而这次是我们自己写的一个注解,进行注入,看下面注解的实现方式:
在这里插入图片描述
写一个类,我们把class替换成@interface了,然后注解上面我们加了两个注解:
1.可以指定我们的一个注解环境(这里设置为运行时环境)
2.我们的目标是什么?获取属性,所以说节点里是获取节点类型的属性
其余的我们可以不用写
现在注解也写好了,我们只需引入我们的反射类中,生成对象即可:
在这里插入图片描述
和set方法一样,首先我们需要实例我们的Controller类,在进行类型的获取,再实例化UserService,然后进行属性的获取(通过lamda表达式):

Stream.of(aClass.getDeclaredFileds()).forEach(filed -> {
//获取属性名
String name=filed.getName();
//获取注解
AutoWired autoWired=filed.getAnnotation(AutoWired.class);
if(autoWired!=null){
//获取属性类型,进行对象创建
Class<?> clazz=filed.getType();
Object o=clazz.newInstance();
filed.set(userController,o);

		}

});

以上就进行完注解的注入,也就是我们spring的底层就是基本这样的实现的,但是spring的内容多,我们理解了,就已经知道spring底层如何创建对象了,上面如果能
出现:
在这里插入图片描述
证明我们就注入成功。这也是学到一些大佬的精华了,才知道自己有很大的不足啊。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值