手写spring3-createBean()、@Autowired

难点:创建对象之后,对象里的属性都是空的,没有复制,那要给哪些属性复制呢

spring创建bean的详细步骤,即creatBean方法的实现

在zhouyu包里新加了一个类,叫orderService

然后注入到UserService中,orderService是userService的属性值,所以创建userService了之后,调用test()方法,orderService也能被打印出来。

需要在spring包中写@Autowired注解

在createBean中,把类的beanDefinition传进来,然后就能拿到userService的类clazz,然后根据clazz对象,通过构造方法反射,可以得到userService的对象,instance。但这时候userService对象里面的属性,都是空的,还没有赋值(包括orderService属性),因为调用的是无参构造方法。

 对象里面有很多属性,哪些属性需要赋值呢,所以先进行判断。

1.遍历当前类型中所有的属性

clazz.getDeclaredFields()是拿出这个类的所有属性。

2.判断属性是否加了 Autowired 注解

declaredField.isAnnotationPresent(Autowired.class):如果属性加了Autowired注解。

就会给这个属性赋值。

3.set() 方法给属性赋值

declaredField.set(instance,?):给对象instance的declaredField属性赋值。赋的值从哪里来?

可以根据类型type赋值,也可以属性名赋值。

在这里采用根据属性名找。调用getBean方法。所以调用getBean方法,getBean方法可以看如果是单例,就从spring单例池中拿对象,否则就是原型bean,就创建一个对象,然后返回结果。

下图表示,从单例池中取对象

 

getBean方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值