1.spring简介
1.1Spring概念
spring是分层的JavaSE及JavaEE应用于全栈的轻量级开源框架,IoC(Inverse Of Control:控制反转/反转控制)和AOP(Aspact Oriented Programming:面向切面编程)为核心,提供了表现层SpringMVC和持久层Spring JDBC以及业务层事务管理等众多模块的企业级应用技术,还能整合开源世界中众多著名的第三方框架和类库,逐渐成为使用最多的JavaEE企业应用开源框架。
Spring的本质是管理软件中的对象,即创建对象和维护对象之间的关系.
1.2Spring优势
1. 方便解耦,简化开发
通过Spring提供的IoC容器,可以将对象间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。用户也不必再为较为底层的需求编写代码,可以更专注于上层的应用。
2. AOP编程的支持
通过 Spring的 AOP 功能,方便进行面向切面的编程,许多不容易用传统OOP(Object Oriented Programming:面向对象编程) 实现的功能可以通过 AOP 轻松应付。
3. 声明式事务的支持
可以将我们从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活的进行事务的管理,提高开发效率和质量。
4. 方便程序的测试
可以用非容器依赖的编程方式进行几乎所有的测试工作,测试不再是昂贵的操作,而是随手可做的事情。
5. 方便集成各种优势框架
Spring可以降低各种框架的使用难度,提供了对各种优秀框架(Struts、Hibernate、Hessian、Quartz等)的直接支持。
6. 降低JavaEE API的使用难度
Spring对 JavaEE API(如 JDBC、JavaMail、远程调用等)进行了薄薄的封装层,使这些API 的使用难度大为降低。
7. Spring框架源码是经典学习范例
Spring的源代码设计精妙、结构清晰、匠心独用,处处体现着大师对Java设计模式灵活运用以及对 Java技术的高深造诣。它的源代码无疑是Java技术的最佳实践的范例。
1.3Spring的架构
模块 | 说明 |
---|---|
核心容器Spring Core | 核心容器,提供Spring框架的基本功能。核心容器的主要组件是BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转(IOC)模式,将应用程序的配置和依赖性规范与实际的应用程序代码分开。 |
SpringContext | Spring上下文,是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。 |
Spring AOP | 通过配置管理特性,Spring AOP 模块直接将面向切面的编程功能集成到了 Spring 框架中。可以很容易地使 Spring框架管理的任何对象支持AOP。Spring AOP模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,就可以将声明性事务管理集成到应用程序中。 |
SpringDAO | JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构. |
Spring ORM | Spring 框架插入了若干个ORM 框架,从而提供了ORM的对象关系工具,其中包括JDO、Hibernate和iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。 |
Spring Web | Web上下文模块建立在应用程序上下文模块之上,为基于 Web的应用程序提供了上下文。所以Spring框架支持与 Jakarta Struts的集成。Web模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作. |
Spring MVC框架 | MVC框架是一个全功能的构建Web应用程序的 MVC实现。通过策略接口,MVC框架变成为高度可配置的,MVC容纳了大量视图技术,其中包括JSP、Velocity、Tiles、iText和POI。 |
2.spring中的耦合和解耦
2.1耦合的概念
耦合性(Coupling),也叫耦合度,是对模块间关联程度的度量。耦合的强弱取决于模块间接口的复杂性、调用模块的方式以及通过界面传送数据的多少。模块间的耦合度是指模块之间的依赖关系,包括控制关系、调用关系、数据传递关系。模块间联系越多,其耦合性越强,同时表明其独立性越差(降低耦合性,可以提高其独立性)。耦合性存在于各个领域,而非软件设计中独有的,但是我们只讨论软件工程中的耦合。
耦合指的就是指对象之间的依赖关系。对象之间的依赖程度越高,耦合度就越高。对象之间的耦合越高,维护成本越高。
降低程序之间的依赖程度,即降低程序之间的耦合度的过程就叫做解耦。
2.2工厂模式解耦的介绍
在开发中可以将三层(表现层(view)、业务层(controller)、持久层(dao))的对象都使用配置文件配置起来,当启动服务器加载应用时,可以通过工厂读取配置文件,根据配置文件中的配置将这些对象创建出来,直接使用。
工厂:根据配置文件创建并返回这些对象的类就是工厂
解耦:可以通过【工厂+接口+配置文件】的方式解除程序中的耦合。
2.3工厂模式解耦示例
解耦程序编写步骤:
1. 创建一个Maven的Java工程
2. 创建持久层接口和接口实现类
com.yl.dao.EmpDao(接口)
com.yl.dao.EmpDaoImpl(实现类)
3. 创建业务接口和接口实现类
com.yl.service.EmpService(接口)
com.yl.service.EmpServiceImpl(实现类)
4. 创建表现层测试程序并运行测试程序
com.yl.controller.EmpController
5. 通过工程+配置文件+接口(已有)方式解耦
(1)创建工厂类并实现(2)提供配置文件,将service接口和dao接口实现类的全限定类名编码写到配置文件去
6. 使用工厂获取service接口和dao接口的实例,替换使用new的方式获取接口的实例
3.Spring IOC控制反转
3.1控制反转的概念
IOC(Inverse Of Control)控制反转,即,把创建对象的权利交给框架。也就是指将对象的创建、对象的存储、对象的管理交给了spring容器。(spring容器是spring中的一个核心模块,用于管理对象,底层可以理解为是一个map集合)
3.2控制反转的概念图与使用
(1)控制反转概念图:
(2)控制反转使用
传统创建对象:`private EmpService service \= new EmpServiceImpl();`
使用框架创建对象:`private EmpService service =(EmpService)BeanFactory.getBean("EmpService");`
4.IOC入门案例
4.1创建工程引入jar包
- 创建Maven工程,引入spring相关依赖
- 在maven工程的pom.xml文件中引入junit、spring的jar包
4.2创建Spring配置文件
创建Spring核心配置文件---applicationContext.xml
1.在工程的src/main/resources源码目录下,创建applicationContext.xml文件:
2.在appilcationContext.xml中添加文件头信息:
3、将EmpService接口的实现类的实例
以及EmpDao接口的实现类的实例交给Spring容器创建,在核心配置文件中添加如下配置:
4.3创建测试进行解耦
创建测试类—TestSpring,通过spring的IOC解决程序中的耦合问题
5.Bean对象的单例和多例
5.1Bean对象的单例和多例的概述
在Spring容器中管理的Bean对象的作用域,可以通过scope属性或用相关注解指定其作用域。
最常用是singleton(单例)或prototype(多例)。其含义如下:1.singleton:单实例,是默认值。这个作用域标识的对象具备全局唯一性。2.prototype:多实例。这个作用域标识的对象每次获取都会创建新的对象。
5.2单实例与多实例的用法
单例:在没有线程安全问题的前提下,没必要每个请求都创建一个对象,这样子既浪费CPU又浪费内存
多例:是为了防止并发问题;即一个请求改变了对象的状态(例如,可改变的成员变量),此时对象又处理另一个请求,而之前请求对对象状态的改变导致了对象对另一个请求做了错误的处理;
6.Spring DI依赖注入
依赖注入:即组件之间的依赖关系由容器在应用系统运行期来决定,也就是由容器动态地将某种依赖关系的目标对象实例注入到应用系统中的各个关联的组件之中。所谓的依赖注入其实就是,在创建对象的同时或之后,如何给对象的属性赋值。
6.1.set方式注入
1普通注入
* 创建User类,声明name和age属性,并添加对应的setter和getter方法,以及toString方法
* 在applicationContext.xml中声明User类的bean实例
* 创建测试类—TestDI
* 修改applicationContext.xml中User实例的声明,为User实例注入属性
2.对象注入
* 创建UserInfo类
* 在applicationContext.xml中,声明UserInfo类的bean实例
* 修改User类,声明userInfo属性,添加对应的setter和getter方法,并重新生成toString方法
* 在applicationContext.xml中,将UserInfo对象作为值,赋值给User对象的userInfo属性
6.2.构造方法注入
1、为User类声明构造函数
2、修改applicationContext.xml文件,将set方式修改为构造方法注入。