数据交换格式json与spring ioc的原理(手写demo)

1.数据交换格式

由于服务端(现在趋于提供接口),使用接口通信,故现在通信过程中,针对电脑端和移动端的请求,都是以http+json格式进行传输,即RestFul API。

xml与json的区别,为什么现在主要用json不是用xml

xml是重量级的语言,占带宽比较大,在传输中效率不高,一般在webservice与银行项目中使用;

json是轻量级的数据交换格式,占带宽比较小,在传输效率上会比xml高,互联网项目一般都用json。

常用json解析框架

fastjson(阿里),gson(谷歌),jackson(Springmvc自带)

使用fastjson解析json

2. java反射机制

2.1什么是java反射?

正在运行,动态获取这个类的所有信息。

2.2反射的作用?

反编译: .class –>java

通过反射机制,访问java对象的属性,方法,构造方法等;

2.3反射机制的应用场景

jdbc加载驱动、spring IoC、框架

2.4 反射机制获取类的三种方法

package classforname;

import entity.UserEntity;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @Description TODO
 * @Author haydon
 * @Date 2019/8/22 19:46
 */
public class ClassForName {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        //①使用无参构造器进行创建对象
        //1.除了new创建对象,还可以使用反射机制创建对象
        //2.forName必须传入class类的全限定类名
        Class<?> aClass = Class.forName("entity.UserEntity");
        //3.newInstance使用无参构造器创建对象实例
        Object o = aClass.newInstance();
        UserEntity userEntity = (UserEntity) o;
        userEntity.setId(123);
        System.out.println(userEntity);
        /*
            使用反射技术创建对象和new哪个效率高?
            new效率高,因为反射还需要解析类的全限定类名,然后再创建实例;而new只需要再堆里直接创建对象就可以。
         */

        //②使用有参构造器进行创建对象
        Constructor<?> constructor = aClass.getConstructor(String.class);
        Object hw = constructor.newInstance("hw");
        UserEntity entity = (UserEntity) hw;
        System.out.println(entity);

        //③获取该类的所有方法
        Method[] declaredMethods = aClass.getDeclaredMethods();
        for(Method method : declaredMethods){
            System.out.println(method.getName() + "-----" + method.getReturnType());
        }

        //④获取所有的属性
        Field[] declaredFields = aClass.getDeclaredFields();
        for(Field field : declaredFields){
            System.out.println(field.getName());
        }

        Field name = aClass.getDeclaredField("name");
        //允许访问私有成员变量
        name.setAccessible(true);
        name.set(userEntity, "hhh");
        System.out.println(userEntity);
    }
}

UserEntity

package entity;

/**
 * @Description TODO
 * @Author haydon
 * @Date 2019/8/22 19:44
 */
public class UserEntity {
    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public UserEntity(){
        System.out.println("无参构造器");
    }

    public UserEntity(String name){
        this.name = name;
        System.out.println("有参构造器" + name);
    }

    @Override
    public String toString() {
        return "UserEntity{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

3.spring IoC概述

反射+dom4j

3.1 引入依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.1.9.RELEASE</version>
</dependency>

<dependency>
    <groupId>dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>1.6.1</version>
</dependency>

3.2 创建实体类对象

package springdemo;

/**
 * @Description TODO
 * @Author huangwei
 * @Date 2019/8/23 19:43
 */
public class UserBean {
    private String id;
    private String name;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public UserBean(){
        System.out.println("无参构造器");
    }

    @Override
    public String toString() {
        return "UserBean{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}

3.3 创建xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<beans>
    <bean id="user1" class="springdemo.UserBean">
        <property name="id" value="111"></property>
        <property name="name" value="hw"></property>
    </bean>
    <bean id="user2" class="springdemo.UserBean">
        <property name="id" value="2221"></property>
        <property name="name" value="hw2"></property>
    </bean>
</beans>

3.4 创建spring的容器context

package springdemo;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.lang.reflect.Field;
import java.util.List;

/**
 * @Description TODO
 * @Author huangwei
 * @Date 2019/8/23 19:49
 */
public class ClasspathApplicationContextDemo {
    private String xmlPath;

    public ClasspathApplicationContextDemo(String xmlPath) {
        this.xmlPath = xmlPath;
    }

    public Object getBean(String beanId) throws DocumentException, ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchFieldException {
        //spring加载过程或者spring ioc 原理

        //1.读取xml配置文件
        //1.1获取xml解析器,解析xmlPath下的xml文件
        SAXReader saxReader = new SAXReader();
        //this.getClass().getClassLoader().getResourceAsStream获取当前项目路径
        Document read = saxReader.read(this.getClass().getClassLoader().getResourceAsStream(xmlPath));
        Element rootElement = read.getRootElement();
        //1.2得到所有的bean配置
        List<Element> elements = rootElement.elements();
        Object o = null;
        for (Element e : elements) {
            //2.获取每个bean配置,如果beanId匹配,那么获取class地址,生成对象实例
            String id = e.attributeValue("id");
            if (!beanId.equals(id)) {
                continue;
            }
            String classPath = e.attributeValue("class");
            Class<?> userClass = Class.forName(classPath);
            o = userClass.newInstance();
            //2.1获取property节点中的name和value属性值,然后使用反射为私有属性赋值
            List<Element> sons = e.elements();
            for (Element son : sons) {
                String fieldName = son.attributeValue("name");
                String fieldValue = son.attributeValue("value");
                Field declaredField = userClass.getDeclaredField(fieldName);
                declaredField.setAccessible(true);
                declaredField.set(o, fieldValue);
            }
        }
        return o;
    }
}

3.5编写测试类

package springdemo;

import org.dom4j.DocumentException;

/**
 * @Description TODO
 * @Author huangwei
 * @Date 2019/8/23 20:15
 */
public class TestIoC {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, InstantiationException, DocumentException, IllegalAccessException {
        ClasspathApplicationContextDemo cac = new ClasspathApplicationContextDemo("user.xml");
        UserBean user = (UserBean)cac.getBean("user1");
        System.out.println(user);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值