1. Spring概述
1.1 Spring概述
1.1.1 Spring介绍
Spring是分层的Java SE/EE应用 full-stack轻量级开源框架,以IoC(Inverse Of Control:反转控制)和AOP(Aspect Oriented Programming:面向切面编程)为内核,提供了展现层Spring MVC和持久层Spring JDBC以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库,逐渐成为使用最多的Java EE企业应用开源框架。
1.1.2 Spring的发展历程
1997年IBM提出了EJB的思想
1998年,SUN制定开发标准规范EJB1.0
1999年,EJB1.1发布
2001年,EJB2.0发布
2003年,EJB2.1发布
2006年,EJB3.0发布
Rod Johnson(spring之父)
Expert One-to-One J2EE Design and Development(2002)
阐述了J2EE使用EJB开发设计的优点及解决方案
Expert One-to-One J2EE Development without EJB(2004)
阐述了J2EE开发不使用EJB的解决方式(Spring雏形)
1.1.3 Spring的优势
方便解耦,简化开发
通过Spring提供的IoC容器,可以将对象间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。用户也不必再为单例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。
AOP编程的支持
通过Spring的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。
声明式事务的支持
可以将我们从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活的进行事务的管理,提高开发效率和质量。
方便程序的测试
可以用非容器依赖的编程方式进行几乎所有的测试工作,测试不再是昂贵的操作,而是随手可做的事情。
方便集成各种优秀框架
Spring可以降低各种框架的使用难度,提供了对各种优秀框架(Struts、Hibernate、Hessian、Quartz等)的直接支持。
降低JavaEE API的使用难度
Spring对JavaEE API(如JDBC、JavaMail、远程调用等)进行了薄薄的封装层,使这些API的使用难度大为降低。
Java源码是经典学习范例
Spring的源代码设计精妙、结构清晰、匠心独用,处处体现着大师对Java设计模式灵活运用以及对Java技术的高深造诣。它的源代码无意是Java技术的最佳实践的范例。
1.1.4 Spring的体系结构
1.2 程序的耦合和解耦
1.2.1 什么是程序的耦合
我们在开发中,会写很多的类,而有些类之间不可避免的产生依赖关系,这种依赖关系称之为耦合。
有些依赖关系是必须的,有些依赖关系可以通过优化代码来解除的。请看下面的示例代码:
1 | /** |
上面的代码表示:业务层调用持久层,并且此时业务层在依赖持久层的接口和实现类。如果此时没有持久层实现类,编译将不能通过。这种依赖关系就是我们可以通过优化代码解决的。
再比如:
下面的代码中,我们的类依赖了MySQL的具体驱动类,如果这时候更换了数据库品牌,我们需要改源码来修改数据库驱动。这显然不是我们想要的。
1 | public class JdbcDemo1 { |
1.2.2 解决程序耦合的思路
当是我们讲解jdbc时,是通过反射来注册驱动的,代码如下:
1 | Class.forName("com.mysql.jdbc.Driver"); |
这时的好处是,我们的类中不再依赖具体的驱动类,此时就算删除mysql的驱动jar包,依然可以编译。但是因为没有驱动类,所以不能运行。
不过,此处也有个问题,就是我们反射类对象的全限定类名字符串是在java类中写死的,一旦要改还是要修改源码。
解决这个问题也很简单,使用配置文件配置。
1.2.3 工厂模式解耦
在实际开发中我们可以把所有的dao和service和action对象使用配置文件配置起来,当启动服务器应用加载的时候,通过读取配置文件,把这些对象创建出来并存起来。在接下来的使用的时候,直接拿过来用就好了。
1.2.4 控制反转-Inversion Of Control
上面解耦的思路有2个问题:
1、存哪去?
分析:由于我们是很多对象,肯定要找个集合来存。这时候有Map和List供选择。
到底选Map还是List就看我们有没有查找需求。有查找需求,选Map。
所以我们的答案就是:
在应用加载时,创建一个Map,用于存放action,Service和dao对象。
我们把这个map称之为容器。
2、还是没解释什么是工厂?
工厂就是负责给我们从容器中获取指定对象的类。这时候我们获取对象的方式发生了改变。
原来:
我们在获取对象时,都是采用new的方式。是主动的。
现在:
我们获取对象时,同时跟工厂要,有工厂为我们查找或者创建对象。是被动的。
这种被动接收的方式获取对象的思想就是控制反转,它是Spring框架的核心之一。
它的作用只有一个:削减计算机程序的耦合。
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
2. 使用Spring的IOC解决程序耦合
2.1 案例的前期准备
本章我们使用的案例是,客户的业务层和持久层的依赖关系解决。在开始Spring的配置之前,我们要先准备一下环境。由于我们是使用Spring解决依赖关系,并不是真正的要做增伤改查操作,所以此时我们没必要写实体类。并且我们在此处使用的是java工程,不是java web工程。
2.1.1 准备Spring的开发包
1 | 官网:http://spring.io/ |
2.1.2 创建业务层接口和实现类
1 | /** |
1 | /** |
2.1.3 创建持久层接口和实现类
1 | /** |
1 | /** |
2.2 基于XML的配置(入门案例)
2.2.1 拷贝必备的jar包
2.2.2 在类根路径下创建任意名称的xml文件
1 |
|
2.2.3 把资源交给spring来管理
1 |
|
2.2.4 测试配置是否成功
1 | /** |
2.3 Spring基于XML的IOC细节
2.3.1 Spring中工厂的类结构图
2.3.1.1 Bean创建的两种规则
1 | BeanFactory: |
1 | public static void main(String[] args) { |
2.3.2 IOC中bean标签和管理对象细节
2.3.2.1 bean标签
1 | 作用: |
1 | /** |
2.3.2.2 Bean的作用范围
1 | Bean的作用范围: |
2.3.2.3 Bean的生命周期
1 | Bean的生命周期: |
2.3.2.4 Bean的三种创建方式
第一种方式:调用默认无参构造函数创建 此种方式用的最多
1 | <!--在默认情况下: |
第二种方式:使用静态工厂中的方法创建对象
1 | /** |
1 | <!-- 此种方式是: |
第三种方式:使用实例工厂中的方法创建
1 | /** |
1 | <!-- 此种方式是: |
2.3.3 Spring的依赖注入
它是spring框架核心ioc的具体实现方式。简单的说,就是坐等框架把对象传入,而不用我们自己去获取。
1 | Spring的依赖注入: |
2.3.3.1 构造函数注入
就是使用类中的构造函数,给成员变量赋值。注意,赋值的操作不是我们自己做的,而是通过配置的方式,让Spring框架来为我们注入。具体代码如下:
1 | /** |
1 | <!-- 构造函数注入: |
2.3.3.2 set方法注入
就是在类中提供需要注入成员的set方法。具体代码如下:
1 | /** |
1 | <!-- set方法注入 |
2.3.3.3 复杂类型的注入
就是给类中的集合成员传值,它用的也是set方法注入的方式,只不过变量的数据类型都是集合。我们这里介绍注入数组,List,Set,Map,Properties。具体代码如下:
1 | /** |
1 | <!-- 复杂类型的注入 |
-------------本文结束感谢您的阅读-------------
本文标题: Spring(一)
本文链接: https://wgy1993.gitee.io/archives/b9cbcaed.html
版权声明: 本作品采用 CC BY-NC-SA 4.0 进行许可。转载请注明出处!
