Java实现Autowired自动注入

简介: Test2正常 Test3空指针 因为不在容器里

首发于Enaium的个人博客


继续使用上个文章的类容器

创建一个注解

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

遍历所有字段包括私有的

private void autowired() {
   
        for (Map.Entry<Class<?>, Object> classObjectEntry : classes.entrySet()) {
   
            for (Field declaredField : classObjectEntry.getKey().getDeclaredFields()) {
   
                declaredField.setAccessible(true);
                if (classes.get(declaredField.getType()) != null) {
   //容器内是否有这个类的对象
                    try {
   
                        //赋值
                        declaredField.set(classObjectEntry.getValue(), classes.get(declaredField.getType()));
                    } catch (IllegalAccessException e) {
   
                        e.printStackTrace();
                    }
                }
            }
        }
    }

在加入到容器后就调用autowired

    public ClassContainer() {
   
        List<Class<?>> scanClasses = new ArrayList<>(List.of(Test1.class, Test2.class));//注意这里Test2也被加入到了容器里
        scanClasses.forEach(it -> {
   
            try {
   
                classes.put(it, it.getConstructor().newInstance());
            } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
   
                e.printStackTrace();
            }
        });
        autowired();
    }
    public <T> T create(Class<T> klass, Object instance) {
   
        classes.put(klass, instance);
        autowired();
        return (T) classes.get(klass);
    }

创建Test3

public class Test3 {
   
    public void render() {
   
        System.out.println("Test3");
    }
}

Test1使用Autowired

public class Test1 {
   
    @Autowired
    private Test2 test2;

    @Autowired
    private Test3 test3;

    public void render() {
   
        test2.render();
        test3.render();
    }
}

测试一下

public class Main {
   

    private static final ClassContainer classContainer = new ClassContainer();

    public static void main(String[] args) {
   
        classContainer.create(Test1.class).render();
    }
}

Test2正常 Test3空指针 因为不在容器里

目录
相关文章
|
2月前
|
SQL Java 应用服务中间件
Java项目防止SQL注入的四种方案
Java项目防止SQL注入的四种方案
41 0
|
5月前
|
Java
Java【代码分享 11】yaml配置List和Map参数对象的配置信息及类文件实例分享(效仿GatewayDynamic+DynamicDataSource的注入方法)
Java【代码分享 11】yaml配置List和Map参数对象的配置信息及类文件实例分享(效仿GatewayDynamic+DynamicDataSource的注入方法)
54 0
|
5月前
|
SQL Java 数据库连接
Java【付诸实践 01】使用org.apache.ibatis.plugin.Interceptor拦截器实现全局mapper.xml参数注入(可用于切换数据库实例schema)源码实例分享
Java【付诸实践 01】使用org.apache.ibatis.plugin.Interceptor拦截器实现全局mapper.xml参数注入(可用于切换数据库实例schema)源码实例分享
41 0
|
6月前
|
XML 开发框架 Java
spring框架,以及和spring框架相关的Java面试题和spring ioc的注入方式
spring框架,以及和spring框架相关的Java面试题和spring ioc的注入方式
|
7月前
|
Java Spring
【Java注解用法】@Autowired 与@Resource的区别以及@Qualifier的介绍
【Java注解用法】@Autowired 与@Resource的区别以及@Qualifier的介绍
59 0
|
8月前
|
SQL 安全 Java
java springboot sql防注入的6种方式
java springboot sql防注入的6种方式
459 1
|
9月前
java202304java学习笔记第六十天-ssm-spring配置文件-集合注入7
java202304java学习笔记第六十天-ssm-spring配置文件-集合注入7
24 0
|
10月前
|
开发框架 Java Spring
【Java面试】Spring中Autowired和Resource关键字的区别
【Java面试】Spring中Autowired和Resource关键字的区别
89 0
|
10月前
|
Java
java SpringBoot 静态方法中获取@Value注入的值
java SpringBoot 静态方法中获取@Value注入的值
|
12月前
java202304java学习笔记第六十天-ssm-spring配置文件-集合注入8
java202304java学习笔记第六十天-ssm-spring配置文件-集合注入8
29 0