Spring Framework(2)-Spring与开发模式演进

点击查看更多Spring文章

目录

一、 JavaEE开发模式的演变

1.1、Model1时代

1.2、Model2时代

二、Spring:JavaEE开发者的春天到来

2.1、Spring如何通过IOC来达到解耦合的目的?

2.2、那么,怎么理解控制反转和依赖注入之间的关系?

2.3、依赖注入有什么好处?

三、 用Gradle构建Spring应用

3.1、使用Idea或者Eclipse创建Gradle项目并且导入Spring依赖

3.2、建立Spring配置文件

3.3、测试通过Spring获取实例

总结

 


 


在这里插入图片描述

 

一、 JavaEE开发模式的演变

系统地学习过Java的朋友肯定知道或者了解过,JavaEE的开发模式有着一系列的演变过程,如果简单地梳理,可以大概总结为:

 Model1时代
 Model2时代
 Spring时代
 EJB时代
 SSH时代
 SSM时代
 SpringBoot时代
 其他分布式、微服务开发....

1.1、Model1时代

Model1时代和Model2时代已经被视为JavaEE开发的老古董了,我们可以从下面的两张图来解释在没有Spring之前,JavaEE的传统开发模式:

  • Model1时代的开发模式
    在这里插入图片描述

Model1时代中,所有的客户端请求都由JSP的内嵌代码块进行处理,JSP中的内嵌代码块调用JavaBean来进行相应的业务处理,再由JavaBean调用数据库,最后再依次返回处理结果响应给客户端。这种模式只适合小型的项目开发,对于业务逻辑复杂,业务处理多的情况下,在JSP中书写的内嵌代码将十分混乱,难以维护。

1.2、Model2时代

  • Model2时代
    在这里插入图片描述

由于Model1的开发模式中,JSP页面嵌入过多的业务处理代码,造成了视图和逻辑混合,杂乱无章,难以维护。这时,Model2模式应运而生,这个开发模式采用的Servlet作为一个控制器(后来出现了经典的Structs1、Structs2、SpringMVC框架等将其封装取代),用来接收所有来自客户端的请求,并且对请求进行转发给JavaBean,而最后又JavaBean请求数据库并且将结果响应给JSP页面中。

这时的JSP只负责视图层,即只负责”展示数据“,而Servlet复制“接收请求和处理请求”,这时候JavaEE项目的开发出现规范化的趋势,三层架构(3-tier architecture)的开发模式被采用,即将整个Web应用分为了三个大层次进行开发:界面层(User Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data access layer)。区分层次的目的即为了“高内聚低耦合”的思想。

在Spring出现之前的JavaEE开发模式一直为这种模式,所以这被称为了“Model2时代”。在这时,一个Java Web项目的项目结构通常为下图:

在这里插入图片描述
这时,所有层次的调用都是通过手动创建的方式去获得的,例如一个Servlet请求一个Service接口,可能会这么写:


public class DemoServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		//创建一个DemoService
		DemoService service = new DemoService();
		//获得ID
		String pid = request.getParameter("pid");
		//通过ID查询
		Product product = service.findProductInfoById(pid);
		//....
}

二、Spring:JavaEE开发者的春天到来

Spring诞生于2003年,它颠覆了传统的Model2开发方式;因为Model2开发方式下,所有的实例都需要手动去创建,可是这引发了一系列问题:

1、每次都创建一个新的实例,实例的生命周期不一,过多的实例被创建会引发内存不足;
2、每次都需要手动地为其注入一些参数;
3、尽管可以使用单例模式来管理实例,让其全局只有唯一的实例,但是当实例数目多了以后,单例模式的应用将十分庞大
4、所有实例的关系错综复杂,不能很好地去管理
5、等等…

通过上述缺点,我们会想到如果将实例采用单例模式来管理,并且结合一个实例工厂形成一个“池子”是不是就更好去获取实例了呢?没错,这个池子就是Spring框架的最早原型了。

Spring是一个开放源代码的设计层面框架,它解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。

Spring的出现 ,代表着JavaEE开发春天的来临,它给JavaEE开发者带来许多便利:让Spring来管理常用的Bean、依赖关系更加清楚、通过元数据配置解耦合、提高了代码的整洁度和开发的效率等等。可以说,没有了Spring框架,就没有之后流行的EJB、SSH、SSM乃至今天的SpringBoot,这一点就可见其在JavaEE开发中的重要性了。

 

 

2.1、Spring如何通过IOC来达到解耦合的目的?

解耦合不代表着对象之间完全没有关联,而是存在一种弱关联关系,而不是强关联关系。如下面的齿轮:强关联齿轮改变了任何一个齿轮,其他齿轮都需要和它配合改变;而弱关联齿轮由于存在着中间适配齿轮的作用,其他齿轮改变了只需要和中间齿轮适配就可以了,不需要改变所有齿轮。

2.2、那么,怎么理解控制反转和依赖注入之间的关系?

DI指的是Dependency Injection,即依赖注入,它是Spring实现控制反转的基础,一般可以通过构造方法注入、setter方法注入。

也就是说,依赖注入是实现控制反转的基础,控制反转是一种思想,而不是一种技术;而依赖注入才是真真切切的技术!

2.3、依赖注入有什么好处?

依赖注入最大的作用是松掉上层类与下层依赖类的耦合,使我们无需从下层类开始手动地创建直到上层类,而是通过依赖注入关系,先创建上层类,再层层往下去创建所需的下层类依赖。这一系列过程都依赖于Spring IOC核心容器。

三、 用Gradle构建Spring应用

目前市场上的Jar包管理工具主要有三种,MavenGradleAnt,现在我用Gradle来构建一个Spring应用:

3.1、使用Idea或者Eclipse创建Gradle项目并且导入Spring依赖

  • build.gradle
dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    //spring的依赖
    //Spring核心工具包
    compile group: 'org.springframework', name: 'spring-core', version: '4.3.18.RELEASE'
	//Spring配置相关
    compile group: 'org.springframework', name: 'spring-context', version: '4.3.17.RELEASE'
	//Spring Beans相关
    compile group: 'org.springframework', name: 'spring-beans', version: '4.3.12.RELEASE'
	//Spring配置支持
    compile group: 'org.springframework', name: 'spring-context-support', version: '4.3.14.RELEASE'
	//Spring AOP相关
    compile group: 'org.springframework', name: 'spring-aop', version: '4.3.18.RELEASE'
}

3.2、建立Spring配置文件

一般将Spring的主配置文件命名为applicationContext.xml,将其放在resource资源文件下,并且在文件里头添加以下头代码,引入命名空间,方便提示:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://www.springframework.org/schema/beans" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd 
">

 <!--bean--!>

</beans>

3.3、测试通过Spring获取实例

  • entity/Person
/**
 * @Auther: ARong
 * @Date: 2019/1/9 16:28
 * @Description: Person类
 */
public class Person implements Serializable{

    //id
    private int id;
    //name
    private String name;
    //age
    private int age;


    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 int getAge() {
        return age;
    }

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

    public Person() {
    }

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

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
  • applicationContext.xml
<!--注册Person实体类-->
    <bean class="entity.Person" name="person" scope="prototype">
        <!--从setter注入-->
        <property name="id" value="1"/>
        <property name="name" value="arong"/>
        <property name="age" value="20"/>
    </bean>
  • BeansGetAndSetTest
@Test
    public void testGetBeans(){
        //读取配置中的元数据,并获得Spring工厂
         ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
         //获得person
        Person person = (Person) ac.getBean("person");
        //打印
        System.out.println(person.toString());
    }

出现以下结果,,基于Gradle的Spring应用已经构建完成:
在这里插入图片描述

 

总结

总结一下,使用Spring的最重要原因在于,它能够解除类与类、接口与接口之间复杂的耦合关系,让开发者无需理会依赖细节,我们只需要把对象交给Spring容器管理就可以了,而IOC是整个Spring的核心,但IOC是一种思想,而不是一种技术,所以DI才是支撑起IOC的真真切切的技术!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BoringError

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值