难点:创建对象之后,对象里的属性都是空的,没有复制,那要给哪些属性复制呢?
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方法