点击查看更多Spring文章
目录
3.1、使用Idea或者Eclipse创建Gradle项目并且导入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包管理工具主要有三种,Maven
、Gradle
和Ant
,现在我用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的真真切切的技术!