初始 Spring 的一些小问题

1. Java 创建对象有哪四种方式?

1.1 使用 new 创建对象

使用 new 关键字创建对象是最常见的方式,但是使用 new 创建对象会增加耦合度。无论使用什么框架,都要减少 new 的使用以降低耦合度。

学生类:

package com.su.homework;

public class Student {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void say(){
        System.out.println("你好");
    }
    
    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

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

使用 new 关键创建对象

package com.su.homework;

public class creatMethod1 {
    public static void main(String[] args) {
        Student st01 = new Student();
        st01.say();
    }
}
1.2 使用反射机制创建对象

学生类的代码如上不变;

使用 Class 类的 newInstance 方法

package com.su.homework;

public class creatMethod02 {
    public static void main(String[] args) {
        try {
            Class aClass = Class.forName("com.su.homework.Student");
            Student st02 = (Student) aClass.newInstance();
            st02.say();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

1.3 采用 clone

clone 时,需要已经有一个分配了内存的源对象,创建新对象时,首先应该分配一个和源对象一样大的内存空间;由于 Object 对象有个 clone() 方法,实现了对象中各个属性的复制,但是它的可见范围时 protected 的,所以实体类使用克隆的前提是:需要实现 Cloneable 接口,并且覆盖 clone() 方法,可见性提升为 public;

学生类

package com.su.homework;

public class Student implements Cloneable{
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void say(){
        System.out.println("你好");
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

使用 clone 方法实现创建对象

package com.su.homework;

public class createMethod03 {
    public static void main(String[] args) {
        Student st = new Student("张三",11);

        try {
            Student st03 = (Student) st.clone();
            st03.say();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }
}
1.4 采用序列化机制

使用序列化时,要实现实现 Serializable 接口,将一个对象序列化到磁盘上,而采用反序列化可以将磁盘上的对象信息转化到内存中。

package com.su.homework;

import java.io.*;

public class createMthod04 {
    public static void main(String[] args) {
        Student st = new Student();

        // 准备一个文件存储该对象的信息
        File f = new File("student.txt");

        try {
            FileOutputStream fos = new FileOutputStream(f);
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            FileInputStream fis = new FileInputStream(f);
            ObjectInputStream ois = new ObjectInputStream(fis);
            //序列化对象,写入磁盘
            oos.writeObject(st);
            // 反序列化对象
            Student st04 = (Student) ois.readObject();

            st04.say();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

2.什么是 maven ? maven 的核心功能有哪些?

  • 什么是 Maven:

    • 百度百科:Maven,是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。
    • 在说 maven 之前,我们需要一个例子,加如有两个 Java 项目,A,B,其中项目 A中的一些功能依赖于项目 B 中的某些类,以往的操作就是将 B 打成 jar 包,然后在项目 A 的 library 下导入 B 的 jar 包,这样项目 A 就可以使用项目 B 的某些类,但是这样做很有缺陷 ,如果 B 中有 bug,还得将项目 B 重新修改,在导入到 A 中,非常麻烦。
    • Maven 的功能便是合理叙述项目间的依赖关系,通过 pom.xml 文件的配置获取 jar 包,而不用你手动去添加 jar 包,所谓的 maven 项目,就是在 java 和 web 项目上面包裹一层 maven,本质上 java 项目还是 java 项目,web 项目还是 web 项目,但是因为包裹在 maven 内,所以可以使用 maven 的一些功能了,比如通过 pom.xml 添加 jar 包,而不用手动去添加。
  • 核心功能:

    • 构建工具:打项目包;
    • 依赖管理工具:集成资源;
    • 项目信息聚合工具:

3.什么是 MVC ?说说分层的好处。

  • MVC:

    • MVC 是一种软件设计模式,也可以说为一个架构,它就是强制性使应用程序的输入,处理和输出分开,将一个应用程序分为三个不浮粉:Model(模型)、View(视图)、Controller(控制器);
      在这里插入图片描述

    • 用户首先在界面中进行人机交互,然后请求发送到控制器,控制器根据请求类型和请求的指令发送到相应的模型,模型可以与数据库进行交互,进行增删改查的操作,完成之后,根据业务的逻辑选择响应的视图进行显示,此时用户获得此次交互的反馈信息,用户可以进行下一步交互,如此循环。

  • MVC 的优势:

    • 耦合性低:视图层和业务层分离,这样允许更改视图层代码而不用重新编译模型和控制器代码。
    • 重用性高:MVC 模式,允许使用各种不同央视的视图来访问同一个服务器端的代码,比如,可以在手机和电脑上购物,虽然订购方式不同,但是处理订购产品的方式是一样的。
    • 部署快,生命周期成本低:开发人员和维护人员分别将精力分在自己岗位就行。
    • 可维护性高:分离视图层和业务逻辑层也使得 web 应用更易维护和修改。

4. Spring 的两大核心技术是什么?

  • IOC(Inversion of Control)

    控制反转,在 Spring 里的实现是 Dependency Injection(依赖注入),就是说对象之间的依赖关系在后期哦通过配置文件 pom.xml 生成,优势在于,前期只需要关注单个对象的功能实现,具体的业务实现是后期配置完成的,不同的配置可以产生不同的功能;

  • AOP(Aspect oriented programming)

    面向方面的编程,用来降低对象之间的耦合程度,在 Spring 中,AOP 不需要借助专门的 AOP 定义语言,只需要普通的 Java 对象和 XML 配置文件即可。

5.什么是 IOC/DI ?

  • IOC:
    • IOC 中文简称为控制反转,是用来降低耦合度的,问题在于,谁控制谁控制了什么如何反转
      • 谁控制谁:若将 IOC 当作一个存储对象的容器,那么开发中的所有对象都可以交给 IOC 容器去做一个统一的规范管理;
      • 控制了什么:既然开发中的对象已经交给了 IOC 管理,那么当我们在获取对象的时候就需要由 IOC 容器来给我们提供,那么 IOC 容器也就是控制了对象的获取权;
      • 如何反转:假如我们需要的 A 类需要 B 类的一个实例,一般情况就是在 A 类中直接 new 一个 B 的实例来使用,但是现在 A 需要告诉 IOC 容器,它需要 B 的实例,然后 IOC 容器将 B 的实例给 A 类,就是对实例对象的控制权力发生了一个反转;
    • IOC 就是一种设计思想,帮助哦我们实现程序之间的解耦,设计出耦合性更低的程序,相对于传统的 new 对象来说,有了 IOC 容器之后,我们把对象的控制权交给容器,让容器去管理对象,会降低对象之间的耦合性。
  • DI:
    • DI中文是依赖注入,在容器运行的时候,扫描所有的依赖关系,并为之冬天的注入对应的依赖关系,比如,我们去借书,告诉管理员我们需要唐朝的历史书,然后管理员把书给我们,我们拿书的过程就是依赖注入;其中也有三个问题:谁依赖谁谁注入了谁注入了什么
      • 谁依赖谁:程序依赖于 IOC 容器,上例中,就是我们依赖于管理员;
      • 谁注入了谁:IOC 容器把对象注入了程序中,上例中,就是管理员将书给我们;
      • 注入了什么:IOC 容器把依赖的对象注入了程序,上例中,就是我们请求的书,管理员给了我们。
  • 其实,IOC 和 DI 就是同一个问题的不同描述,总的来说, IOC/DI 就是一个公共的管理平台,管理对象之间的依赖关系,需要什么对象,就直接拿来用,而不用考虑什么时候去创建,什么时候销毁,只管用就行了。

6.谈谈面向对象编程与面向接口编程的区别。

  • 都是设计模式的一种体现;
  • 面向对象编程就是一堆对象,通过封装、继承、多态等更加有效的组织程序。
  • 面向接口编程就是一堆接口,通过接口规约对象的属性和方法,是面向对象的一部分。不过面向接口的好处就是低耦合。

7.什么是反射?说说反射是如何应用到 spring 框架上。

  • 反射:

    • 在运行时期,动态地去获取类中的信息(类的信息,方法的信息,构造器信息,字段等信息的操做)

    • 正常方式:通过完整的类名->通过 new 实例化->取得实例化对象;

    • 反射方式:实例化对象-> getClass() 方法->通过完整的类名;

    • 反射优点:提高了程序的灵活性和扩展性,降低耦合性,提高自适应能力;允许程序创建和控制任何类的对象,无需提前硬编码目标类;

  • Spring:

    • Spring 的目的就是让对象与对象(模块与模块)之间的关系没有通过代码来关联,都是通过配置类说明管理的。
  • 通过 Java 的反射机制,将属性配置参数转化为相应的类型,然后再调用规定的方法设置参数。

8.说说 java 解析 xml 有哪些技术?

  • DOM:

    • DOM 是 W3C 处理 XML 的标准 API,处理方式是将 XML 整个作为类似树结构的方式读入内存中以便操作及解析,因此支持应用程序对 XML 数据的内容和结构进行修改;
    • 优点:操作简单快捷,
    • 缺点:但是由于其需要处理开始时将整个 XML 文件读入内存中去分析,因此其在解析大量的 XML 文件时会遇到内存泄漏以及程序崩溃的风险;
    • 适用范围:小型 XML 文件解析、需要全解析或者大部分解析 XML、需要修改 XML 树内容以生成自己的对象模型
  • SAX:

    • SAX 从根本上解决了 DOM 在解析 XML 文档时产生的占用大量资源的问题。其实现是通过类似于流解析的技术,通读整个 XML 文档树,通过事件处理器来响应程序员对于 XML 数据解析的需求。
    • 优点:由于其不需要将整个 XML 文档读入内存当中,它对系统资源的节省是十分显而易见的,它在一些需要处理大型 XML 文档以及性能要求较高的场合有起了十分重要的作用。
    • 缺点:首先是它十分复杂的 API 接口令人望而生畏,其次由于其是属于类似流解析的文件扫描方式,因此不支持应用程序对于 XML 树内容结构等的修改,可能会有不便之处。
    • 适用范围:大型 XML 文件解析、只需要部分解析或者只想取得部分 XML 树内容、有 XPath 查询需求、有自己生成特定 XML 树对象模型的需求。
  • Digester:

    • 是在上述两者的基础上衍生出来的工具类,为的是满足将 XML 转换为 JavaBean 的特殊需求;
    • 适用范围:有将 XML 文档直接转换为 JavaBean 需求。

9.抽象类与接口的区别。

  • 抽象类:用来捕捉子类的通用特性,它不能被实例化,只能被用作子类的超类;
  • 接口:接口是抽象方法的集合,如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法。这就像契约模式,如果实现了这个接口,那么就必须确保使用这些方法。接口只是一种形式,接口自身不能做任何事情。
  • 对比:
参数抽象类接口
默认的实现方法可以有默认的实现方法接口完全是抽象的,不存在方法的实现
实现子类使用 extends 继承抽象类,如果子类不是抽象类,那么需要提供抽象类中所有声明的方法的实现子类使用 implements 来实现接口,它需要提供接口中所有声明的方法实现
构造器抽象类可以有构造器接口不能有构造器
与正常 Java的区别处理不能实例化抽象类之外没有区别接口是完全不同的类型
访问修饰符抽象方法可以有 public、protected 和 default 这些修饰符接口方法默认修饰符是 public ,也可以不使用其他修饰符
main() 方法抽象方法可以有 main 方法并且可以运行接口没有 main 方法,因此不可以运行
多继承抽象方法可以继承一个类和实现多个接口接口只能继承一个或多个其他接口
速度它比接口速度快接口时稍微有点慢,因为它需要时间去寻找在类中实现的方法
添加新方法如果往抽象类中添加新的方法,可以提供默认的实现,不需要改变现在的代码如果往接口中添加方法,那么必须改变实现该接口的类
  • 适用:
    • 如果拥有一些方法,并且想让它们中的一些有默认实现,那么使用抽象类;
    • 如果想实现多继承,那么必须使用接口;
    • 如果基本功能在不断改变,那么就需要使用抽象类;

10.谈谈表单的同步提交与异步提交的区别。

  • 同步:

    <form id="register_form" method="post" action="/register">
        
          <div class="form-group">
            <label for="email">邮箱</label>
            <input type="email" class="form-control" id="email" name="email" placeholder="Email" autofocus>
          </div>
    
          <div class="form-group">
            <label for="password">密码</label>
            <input type="password" class="form-control" id="password" name="password" placeholder="Password">
          </div>
        
          <button type="submit" class="btn btn-success btn-block">注册</button>
        </form>
    

    表单具有默认的提交行为,默认是同步的,同步表单提交,浏览器会锁死(转圈儿)等待服务端的响应结果。
    表单的同步提交之后,无论服务端响应的是什么,都会直接把响应的结果覆盖掉当前页面。(服务器重定向只针对同步提交有效)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值