简单模拟IOC容器:为添加了@Autowired的属性赋值(初始值)

创建@Autowired注解

package com.zzj.test;

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

//设置范围和生存周期
@Target({ElementType.TYPE,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Autowired {

}

创建UserInfo并且为添加了@Autowired的成员变量赋值

package com.zzj.test;

import java.lang.reflect.Field;
import java.util.Date;

//UserInfo类含有两个成员变量
class UserInfo{

    @Autowired
    private Date birth;
    @Autowired
    private String name;

    public Date getBirth() {
        return birth;
    }

    public void setBirth(Date birth) {
        this.birth = birth;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

//给有AutoWired注释的成员变量赋值
public class Test {

    public static void main(String[] args)throws Exception{

        Class clazz = UserInfo.class;
        //反射创建userinfo对象
        Object object = clazz.newInstance();
        //获取成员变量
        Field[] fields = clazz.getDeclaredFields();

        for(Field field: fields){

            //获取成员变量上的注释,如果有autowired注释则赋初始值
            Autowired autowired = field.getAnnotation(Autowired.class);

            if(autowired != null){
                //获取成员变量的类型
                clazz = field.getType();
                //调用类型的默认构造方法String是"",Date是当前时间
                Object value = clazz.newInstance();
                //私有成员变量解锁权限
                field.setAccessible(true);
                //设置初始值,
                field.set(object, value);

            }

        }

        //类型强转,并输出确认结果
        UserInfo ui = (UserInfo)object;
        System.out.println(ui.getName());
        System.out.println(ui.getBirth());

    }

}
            

输出结果如下(由于String初始值为""所以第一行为空)

原文地址:https://www.cnblogs.com/yimengxianzhi/p/12207814.html

时间: 2024-10-06 14:55:26

简单模拟IOC容器:为添加了@Autowired的属性赋值(初始值)的相关文章

简单模拟IOC容器:返回对象并能抛出异常

本次要求:已知com.zzj.vo包下分别有Tiger.lion.Elephant三个Java源文件,请据此实现以下功能:①.自定义一个名为Component的注解,要求该注解只能用于类且代码运行时该注解依然有效:②.为Tiger和Lion类添加component注解③.在Application类中定义静态代码块,该代码块可自动将有Component注解修饰的类创建对象并放在Map集合中:然后定义一个名为getBean的static方法,要求传入Class类实例时返回该Class类对应类的对象,

几句代码简单实现IoC容器

前言 最近在调试EasyNetQ代码的时候发现里面有一段代码,就是IoC容器的简单实现,跟着他的代码敲了一遍,发现了奇妙之处.当然也是因为我才疏学浅导致孤陋寡闻了.他的思路就是通过动态调用构造函数生成对象,然后将对象保存,调用的时候进行单例调用,而且,代码中不会存在 new 字眼.所有实例对象的创建和映射都在容器中实现.当然,还是用第三方的容器比较稳妥,本文中只是很简单的一个示范.具体理解的是否正确,我也不敢说,只不过,能达到一些预期的效果,功能不够强大. 解析 首先,我们先添加几个接口.ISe

比Spring简单的IoC容器

比Spring简单的IoC容器 Spring 虽然比起EJB轻量了许多,但是因为它需要兼容许多不同的类库,导致现在Spring还是相当的庞大的,动不动就上40MB的jar包, 而且想要理解Spring的内部运行机制,阅读它的代码非常重要, 但是往往它的代码非常的"多". 现在根据Spring对Bean的生命周期的处理, 编写出一款非常小的IoC容器, 没有了对XML的解析,而是通过对Config对象的构造而完成IoC配置文件的声明, 相比较XML的方式, 对重构软件非常具有好处, 并且

最简单的ioc容器代码(低仿Spring )

Spring 的一大核心就是IOC,控制反转(依赖注入). 对象交由容器去控制,降低耦合性. Spring 的ioc实现原理其实很简单,容器启动后读取并解析配置文件,根据配置文件中<bean>标签的class属性,通过反射生成类,将各个属性都通过反射设置好值,最后将已经创建好的bean保存到容器中,等待注入. 详细的说明在这里:http://www.bccn.net/Article/web/jsp/jszl/200810/8059.html 参考这个帖子自己动手写了写,感觉对ioc理解又深入了

使用反射机制简单模拟IOC效果

package anno; import java.lang.annotation.Annotation; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Arrays; /** * @program: tx_annotation_demo * @description: 使用反射机制模拟实现IOC(控制反

Spring(1)--在IoC容器中添加bean

〇.整体架构 一.装配Bean 1 <bean id="Foo" class="com.will.Foo"/> <!--使用id命名,不可id相同--> 2 <bean name="#Foo" class="com.will.Foo"/> <!--使用name命名,没有规范限制,而且可以重复,返回后面一个--> 3 <bean class="com.will.Fo

模拟服务容器Ioc

服务容器是一个用于管理类依赖和执行依赖注入的强大工具. 一个类要被容器所能够提取,必须要先注册至这个容器.既然称这个容器叫做服务容器,那么我们需要某个服务,就得先注册.绑定这个服务到容器,那么提供服务并绑定服务至容器的东西就是服务提供器(ServiceProvider). 依赖注入和控制反转是对同一件事情的不同描述,它们描述的角度不同.依赖注入是从应用程序的角度在描述,应用程序依赖容器创建并注入它所需要的外部资源.而控制反转是从容器的角度在描述,容器控制应用程序,由容器反向的向应用程序注入应用程

Spring框架—— IOC容器和Bean的配置

 1 IOC和DI ①IOC(Inversion of Control):反转控制. 在应用程序中的组件需要获取资源时,传统的方式是组件主动的从容器中获取所需要的资源,在这样的模式下开发人员往往需要知道在具体容器中特定资源的获取方式,增加了学习成本,同时降低了开发效率. 反转控制的思想完全颠覆了应用程序组件获取资源的传统方式:反转了资源的获取方向--改由容器主动的将资源推送给需要的组件,开发人员不需要知道容器是如何创建资源对象的,只需要提供接收资源的方式即可,极大的降低了学习成本,提高了开发的效

Spring框架学习[IoC容器高级特性]

1.通过前面4篇文章对Spring IoC容器的源码分析,我们已经基本上了解了Spring IoC容器对Bean定义资源的定位.读入和解析过程,同时也清楚了当用户通过getBean方法向IoC容器获取被管理的Bean时,IoC容器对Bean进行的初始化和依赖注入过程,这些是Spring IoC容器的基本功能特性.Spring IoC容器还有一些高级特性,如使用lazy-init属性对Bean预初始化.FactoryBean产生或者修饰Bean对象的生成.IoC容器初始化Bean过程中使用Bean