spring ioc 自动装配原理(读书笔记)

xiaoxiao2021-02-28  64

首先看例子:

package com.thread; public interface CarRepo { String runCar(); } package com.thread; public class CarRepoImpl implements CarRepo { @Override public String runCar() { return null; } } package com.thread; public class CarServiceImpl implements CarService { private CarRepo carRepo; public CarRepo getCarRepo() { return carRepo; } public void setCarRepo(CarRepo carRepo) { this.carRepo = carRepo; } @Override public String runCarservice() { return carRepo.runCar(); } }

XML文件配置》》》》》》》》》》》》》》》》》》》》

<bean id="carService" class="com.thread.CarServiceImpl"> <property name="carRepo" ref="carRepo" /> </bean> <bean id="carRepo" class="com.thread.CarRepoImpl" />

该模式下(xml),spring ioc通过xml把对象bean化并交给spring容器来管理里。 对象之间的互相调用不用自己去new,而且只要调用 对应的接口即可,这是怎么实现的呢? //存放每个Bean的信息 Map<String,Objcet> listMap 1、spring 容器开始读取xml中配置的bean然后把每个对象做成Map,key=id,value=通过全包名路径反射出来的类对象。 //反射获得CarRepoImpl类 Class clazz=class.forName("com.thread.CarRepoImpl"); //创建CarRepoImpl类的对象 Object obj=clazz.newInstance(); //把CarRepoImpl对象放入集合中去 listMap.put("carRepo",obj); **同理CarServiceImpl对象也是放入这个map。 现在这个map容器中就有2个参数了。 listMap.put("carService",CarServiceImpl); 2、通过get set方法把repo注入到service中使用。 spring还会解析xml中property中的属性: 分别获得:name='carRepo' , ref="carRepo" 对name做首字符小写变大写转换:carRepo>CarRepo(为了给这个接口类指明他的实现类) //从map中获取key=ref中对应的carRepo Object obj1=listMap.get("carRepo");//这个对象就是CarRepoImpl //从容器中获取service Object obj2=listMap.get("carService"); //获取serviceImpl对象中的set方法 Method setterMethod=obj2.getMethod("setCarRepo",obj2.class); //调用反射方法,塞值 setterMethod.invoke(obj2,obj1);
转载请注明原文地址: https://www.6miu.com/read-2632058.html

最新回复(0)