SpringIOC框架

一、什么是SpringIOC

SpringIOC就是把每一个bean(实体类)与bean(实体类)之间的关系交给第三方容器进行管理。

二、Xml配置

项目中的位置是:/demo/src/main/resources/applicationContext.xml




      
            
            
      
   

三、Java代码

	  @Test
      public void testSpringIOC() {
            //1.读取springxml配置
            ClassPathXmlApplicationContext  classPathXmlApplicationContext = new ClassPathXmlApplicationContext(
                        "applicationContext.xml");
            //2.获取bean对象
            User user = (User)  classPathXmlApplicationContext.getBean("user1");
            System.out.println(user.toString());
      }

运行结果:
SpringIOC框架_第1张图片

四、什么是SpringIOC底层实现原理

1.读取bean的XML配置文件
2.使用beanId查找bean配置,并获取配置文件中class地址。
3.使用Java反射技术实例化对象
4.获取属性配置,使用反射技术进行赋值。
详细步骤:

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

五、手写SpringIOC框架

1、建立实体类

package com.example.demo.json;
import java.util.List;
/**
* @Description 用户类
* @author 大都督
* @date 2019年5月11日
*/
public class User {
      private Long id;
      
      private String name;
      
      private List hobbies;
      
      public User() {
            System.out.println("无参构造函数");
      }
      public User(Long id, String name) {
            System.out.println("有参构造函数, id:"+id+",name:"+name);
      }
      public Long getId() {
            return id;
      }
      public void setId(Long id) {
            this.id = id;
      }
      public String getName() {
            return name;
      }
      public void setName(String name) {
            this.name = name;
      }
      public List getHobbies() {
            return hobbies;
      }
      public void setHobbies(List hobbies) {
            this.hobbies = hobbies;
      }
      @Override
      public String toString() {
            return "User [id=" + id + ", name=" + name + ", hobbies=" +  hobbies
                        + "]";
      }
      
      
}

2、xml配置


      
            
      
   

3、maven坐标


        
        
            org.apache.commons
            commons-lang3
            3.4
        
        
            org.dom4j
            dom4j
            2.0.0
        
    

4、使用反射技术完成Java代码
package com.example.demo.fanshe;
import java.lang.reflect.Field;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import com.example.demo.json.User;
/**
* @Description
* @author 大都督
* @date 2019年5月12日
*/
public class ClassPathXmlApplicationContext {
      private String pathXml = null;
      public ClassPathXmlApplicationContext(String pathXml) {
            this.pathXml = pathXml;
      }
      public Object getBean(String beanId) throws Exception {
            if (StringUtils.isEmpty(beanId)) {
                  throw new Exception("beanId is null");
            }
            SAXReader saxReader = new SAXReader();
            Document read =  saxReader.read(this.getClass().getClassLoader().getResource(pathXml));
            // 获取到根节点
            Element rootElement = read.getRootElement();
            // 根节点下所有的子节点
            List elements = rootElement.elements();
            for (Element element : elements) {
                  // 获取到节点上的属性
                  String id = element.attributeValue("id");
                  if (StringUtils.isEmpty(id)) {
                        continue;
                  }
                  if (!id.equals(beanId)) {
                        continue;
                  }
                  // 使用java反射机制初始化对象
                  String beanClass = element.attributeValue("class");
                  Class forName = Class.forName(beanClass);
                  Object newInstance = forName.newInstance();
                  List propertyElementList =  element.elements();
                  for (Element el : propertyElementList) {
                        String name = el.attributeValue("name");
                        String value = el.attributeValue("value");
                        Field declaredField =  forName.getDeclaredField(name);
                        declaredField.setAccessible(true);
                        declaredField.set(newInstance, value);
                  }
                  return newInstance;
            
            }
            return null;
      }
      public static void main(String[] args) throws Exception {
            ClassPathXmlApplicationContext classPath = new  ClassPathXmlApplicationContext("applicationContext.xml");
            User user = (User) classPath.getBean("user1");
            System.out.println(user.getName());
      }
}

运行结果:
SpringIOC框架_第2张图片

你可能感兴趣的:(面试题,Java反射,SpringIOC,Java面试题)