2019独角兽企业重金招聘Python工程师标准>>>
1:什么是springIoc?
就是每个bean与bean的关系交给Spring第三方容器来管理。
2:如何实现?
1.利用传入的参数获取xml文件的流,并且利用dom4j解析成Document对象
2.对于Document对象获取根元素对象后对下面的标签进行遍历,判断是否有符合的id.
3.如果找到对应的id,相当于找到了一个Element元素,开始创建对象,先获取class属性,根据属性值利用反射建立对象.
4.遍历标签下的property标签,并对属性赋值.注意,需要单独处理int,float类型的属性.因为在xml配置中这些属性都是以字符串的形式来配置的,因此需要额外处理.
5.如果属性property标签有ref属性,说明某个属性的值是一个对象,那么根据id(ref属性的值)去获取ref对应的对象,再给属性赋值.
6.返回建立的对象,如果没有对应的id,或者下没有子标签都会返回null
3:代码如下
user实体类 public class User { private Integer userId; private String userName; public Integer getUserId() { return userId; } public void setUserId(Integer userId) { this.userId = userId; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } } application.xml配置 public class ClassPathXmlApplication { private String xmlPath; public ClassPathXmlApplication(String xmlPath){ this.xmlPath=xmlPath; } public Object getBeans(String beanId) throws Exception{ //如何实现springIoc的底层原理 /** * 1:解析xml配置文件 * 2:读取bean配置获取class属性路径 * 3:根据反射原理对class路径进行实例化,为私有属性赋值。 * @return */ SAXReader reader= new SAXReader(); Document document= reader.read(this.getClass().getClassLoader().getResourceAsStream(xmlPath)); Element beansElement= document.getRootElement(); List beanList= beansElement.elements(); Object obj=null; for (Element beanElement : beanList) { String beanId1= beanElement.attributeValue("id"); if(!beanId1.equals(beanId)){ continue; } //获取bean中的class String classPath= beanElement.attributeValue("class"); //进行实例化拿到对象 Class forName= Class.forName(classPath); obj=forName.newInstance(); List beanSonElement= beanElement.elements(); for (Element sonElement : beanSonElement) { String name= sonElement.attributeValue("name"); String value= sonElement.attributeValue("value"); //使用反射未私有属性赋值 Field field=forName.getDeclaredField(name); field.setAccessible(true); System.out.println(field.getType()); if(field.getType().toString().equals("class java.lang.Integer")){//对非String类型的特殊处理 field.set(obj, Integer.parseInt(value)); }else{ field.set(obj, value); } } } return obj; } public static void main(String[] args) throws Exception { ClassPathXmlApplication classPath=new ClassPathXmlApplication("applicationContext.xml"); User user= (User) classPath.getBeans("user1"); System.out.println(user.getUserName());张三 } } |