Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >手写Spring的@Autowired注解

手写Spring的@Autowired注解

作者头像
Defu Li
发布于 2020-05-28 01:18:13
发布于 2020-05-28 01:18:13
77300
代码可运行
举报
文章被收录于专栏:斜述视角斜述视角
运行总次数:0
代码可运行

在使用Spring框架时,我们经常会用到@Autowired注解,也就是自动装配的意思。

当在一个类中需要另一个类时,可是在Spring中使用@Autowired注解。

类B

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package otherexperiment.createautowired;

public class B {
    public String name = "defuli";
}

类A

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package otherexperiment.createautowired;

public class A {
    @Autowired
    public B b;

    public void printBName() {
        System.out.println(b.name);
    }
}

类Test

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package otherexperiment.createautowired;

public class Test {
    public static void main(String[] args) {
        A a = new A();
        a.printBName();  // 可以正常打印出 defuli
    }
}

看到这,有没有觉得很奇怪,在类A中,我们并没有创建B对象,仅仅是创建了B的一个引用而已,为什么在类Test中可以正常的打印出"defuli"字符串?

原因在@Autowired注解这里,使用了该注解,Spring框架会自动创建B的对象然后装配给类A中的b引用。

手写@Autowired注解

首先创建一个名为Autowired的注解,创建注解和创建接口很像,就是在接口的前面加@。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package otherexperiment.createautowired;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface Autowired {
}

类Main

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package otherexperiment.createautowired;

import java.lang.reflect.Field;

public class Main {
    public static void main(String[] args) throws IllegalAccessException, InstantiationException {
        // 自动装配的过程
        A a = new A();
        Class<? extends A> clazz = a.getClass();
        Field[] fields = clazz.getFields();
        for (Field field : fields) {
            Autowired autowired = field.getAnnotation(Autowired.class);
            if (autowired != null) {
                Class fieldClass = field.getType();  // 在这里就是B.class
                B b = (B) fieldClass.newInstance();
                field.set(a, b);
            }
        }

        // 测试 打印输出
        a.printBName();  // defuli
    }


}

在类Main中,运行的结果就是正常的打印出了“defuli”字符串。

总结

之所以我们能实现@Autowired注解的功能,是利用了Java反射的原理。在程序运行时,可以在Jvm中动态的创建出B的对象,然后赋值给对象a的b属性。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 斜述视角 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
面试官:Spring中的注解@Autowired是如何实现的
现在面试,基本上都是面试造火箭????,工作拧螺丝????。而且是喜欢问一些 Spring 相关的知识点,比如 @Autowired 和 @Resource 之间的区别。魔高一丈,道高一尺。很快不少程
业余草
2021/12/06
4110
面试官:Spring中的注解@Autowired是如何实现的
注解@Autowired是如何实现的
使用spring开发时,进行配置主要有两种方式,一是xml的方式,二是java config的方式。spring技术自身也在不断的发展和改变,从当前springboot的火热程度来看,java config的应用是越来越广泛了,在使用java config的过程当中,我们不可避免的会有各种各样的注解打交道,其中,我们使用最多的注解应该就是@Autowired注解了。这个注解的功能就是为我们注入一个定义好的bean。那么,这个注解除了我们常用的属性注入方式之外还有哪些使用方式呢?它在代码层面又是怎么实现的呢?这是本篇文章着重想讨论的问题。
chengcheng222e
2021/11/04
7450
@Autowired注解到底怎么实现的,你能说清楚么?
使用spring开发时,进行配置主要有两种方式,一是xml的方式,二是java config的方式。
Java小咖秀
2021/07/12
6810
Spring(下)
Spring 提供了以下多个注解,这些注解可以直接标注在 Java 类上,将它们定义成 Spring Bean。
用户8126523
2023/04/25
4320
【Spring注解驱动开发】使用@Autowired@Qualifier@Primary三大注解自动装配组件,你会了吗?
作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:
冰河
2020/10/29
6420
Spring中@Autowired和@Resource的区别
最近有非常多的小伙伴从大厂毕业了,导致招聘也卷得相当厉害,不管是应届生、中开、高开,都会问技术原理。还经常问一些日常开发不太需要了解的知识点对比。今天,就给大家分享一个应届生被问到的一道面试题,在Spring中,@Autowired注解和@Resource注解的区别。
Tom弹架构
2022/08/22
3360
Spring中@Autowired和@Resource的区别
面试官问我咋实现Spring框架IOC和DI好吧打趴下,深度解析手动实现Spring框架的IOC与DI功能
面试官问我咋实现Spring框架IOC和DI好吧打趴下,深度解析手动实现Spring框架的IOC与DI功能
杨不易呀
2023/09/26
4240
面试官问我咋实现Spring框架IOC和DI好吧打趴下,深度解析手动实现Spring框架的IOC与DI功能
理解SpringIOC原理手写SpringIOC
我们都知道,Spring框架的IOC是基于Java反射机制实现的,下面我们先回顾一下java反射。
小小程序员
2023/03/15
2870
Spring注解
自动按照类型注入。当ioc容器中有且只有一个类型匹配时可以直接注入成功。当有超过一个匹配时,则使用变量名称(写在方法上就是方法名称)作为bean的id,在符合类型的bean中再次匹配,能匹配上就可以注入成功。当匹配不上时,是否报错要看required属性的取值。
酒楼
2023/11/13
2120
对控制反转理解不深?带你手写一个基于注解的IOC容器 加深对spring底层代码的理解
提到spring 不可避免的就是两个核心组件 IOC 和 AOP 这里我们主要实现的是 IOC
冷环渊
2022/03/30
3580
对控制反转理解不深?带你手写一个基于注解的IOC容器 加深对spring底层代码的理解
聊聊Spring中的@Autowired注解
今天来跟大家聊聊简单聊聊@Autowired,Autowired翻译过来为自动装配,也就是自动给Bean对象的属性赋值。
每周聚焦
2023/02/14
3960
Spring 中 @Autowired 和 @Resource 的区别
@Autowired注解是由Spring提供的,它可以用来对构造方法、成员变量及方法参数进行标注,它能够根据对象类型完成自动注入,代码如下。
程序猿DD
2023/08/09
2480
Spring 中 @Autowired 和 @Resource 的区别
手写Spring-ioc 注入 jdk反射实现 绝对满足你的好奇心哦 解决怎么我写了一个注解就可以直接注入了?
我们学完Spring后,大都就直接接着学习之后的内容啦,但是我想偶尔回过头来看一看,才能走的更远啊。
宁在春
2022/10/31
1890
手写Spring-ioc 注入 jdk反射实现 绝对满足你的好奇心哦 解决怎么我写了一个注解就可以直接注入了?
【Spring注解驱动开发】你还不会使用@Resource和@Inject注解?那你就out了!!
作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:
冰河
2020/10/29
7750
手写迷你Spring框架
Spring最初的时候,其功能远远不如现在强大,甚至我在看Spring最初版本的时候有种这就是所谓的Spring?的疑问,但随后便恍然大悟,我是站立在历史的下游,用后人的眼光去看前人的作品,当然有种站在制高点俯视的感觉,当我一步一步深入学习Spring的设计思想设计理念以及实现方式的时候,无不为前人那惊天地泣鬼神的思想所震撼。
向着百万年薪努力的小赵
2022/12/02
1K0
手写迷你Spring框架
手写IOC
咱们主要基于java中的反射,再加注解,来实现spring框架中IOC的这个效果。
叫我阿杰好了
2023/10/30
2020
手写IOC
手写 mini SpringMVC 核心代码
定制初始化参数:可以定制servlet、JSP、Context的初始化参数,然后可以再servlet、JSP、Context中获取这些参数值。下面拿servlet来举例:
大忽悠爱学习
2021/11/15
1K0
动手实现AOP
“ 在前面的两篇文章中,我们了解了Spring AOP的应用以及两种动态代理的实现,但是如何实现AOP我想小伙伴应该会很疑惑,所以今天我们自己来动手撸代码简单的实现一下AOP。”
每天学Java
2020/06/02
2990
【Spring注解驱动开发】如何实现方法、构造器位置的自动装配?我这样回答让面试官很满意!
作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:
冰河
2020/10/29
4590
Spring6-IoC(Inversion of Control)控制反转和DI(Dependency Injection)依赖注入,手动实现IOC
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为Java语言的 <font color="blue">反射机制</font> 。简单来说,反射机制指的是程序在运行时能够获取自身的信息。
鱼找水需要时间
2023/06/11
2670
Spring6-IoC(Inversion of Control)控制反转和DI(Dependency Injection)依赖注入,手动实现IOC
推荐阅读
相关推荐
面试官:Spring中的注解@Autowired是如何实现的
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档