前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >手写Spring的@Autowired注解

手写Spring的@Autowired注解

作者头像
Defu Li
发布2020-05-28 09:18:13
7040
发布2020-05-28 09:18:13
举报
文章被收录于专栏:斜述视角斜述视角

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

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

类B

代码语言:javascript
复制
package otherexperiment.createautowired;

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

类A

代码语言:javascript
复制
package otherexperiment.createautowired;

public class A {
    @Autowired
    public B b;

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

类Test

代码语言:javascript
复制
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
复制
package otherexperiment.createautowired;

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

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

类Main

代码语言:javascript
复制
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 删除。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档