Spring
Spring概述
Spring 是分层的 Java SE/EE 应用 全栈式(full-stack)轻量级开源框架,以 IoC(Inverse Of Control: 控制反转)和 AOP(Aspect Oriented Programming:面向切面编程)为内核,提供了表现层 Spring MVC 和持久层 Spring JDBC 以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多 著名的第三方框架和类库,逐渐成为使用最多的 Java EE 企业应用开源框架。
Spring的发展历程
1997 年 IBM 提出了 EJB 的思想
Spring 诞生于2002,成型与2003,作者是Rod Johnson,他写了两本书
- 《Expert One-to-One J2EE Desion and Development》
- 《Expert One-to-One J2EE Development without EJB》(2004)
阐述了 J2EE 开发不使用 EJB 的解决方式(Spring 雏形)
2017年9月份发布了Spring的最新版本Spring 5.0通用版(GA) JDK版本要求1.8及以上
Spring的优势
- 方便解耦,简化开发
- 通过 Spring 提供的 IoC 容器,可以将对象间的依赖关系交由 Spring 进行控制,避免硬编码所造成的过度程序耦合。用户也不必再为单例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。
- AOP 编程的支持
- 通过 Spring 的 AOP 功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过 AOP 轻松应付。
- 声明式事务的支持
- 可以将我们从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活的进行事务的管理,提高开发效率和质量。
- 方便程序的测试
- 可以用非容器依赖的编程方式进行几乎所有的测试工作,测试不再是昂贵的操作,而是随手可做的事情。
- 方便集成各种优秀框架
- Spring 可以降低各种框架的使用难度,提供了对各种优秀框架(Struts、Hibernate、Hessian、Quartz等)的直接支持。
- 降低 JavaEE API 的使用难度
- Spring 对 JavaEE API(如 JDBC、JavaMail、远程调用等)进行了薄薄的封装层,使这些API的使用难度大为降低。
- Spring 源码是经典学习范例
- Spring 的源代码设计精妙、结构清晰、匠心独用,处处体现着大师对 Java 设计模式灵活运用以及对 Java 技术的高深造诣。它的源代码无意是 Java 技术的最佳实践的范例。
Spring的体系结构
IoC的概念及作用
什么是程序的耦合
耦合性(Coupling),也叫耦合度,是对模块间关联程度的度量。
简单来说,耦合就是:程序间的依赖关系。它包括:
- 类之间的依赖
- 方法间的依赖
程序间的耦合不可能完全消除,只能降低程序间的依赖关系,这叫做解耦
解决程序耦合的思路
开发中要做到:编译期不依赖,运行时才依赖
比如:
- 数据库驱动加载,我们一般都这么写:
Class.forName("com.mysql.jdbc.Driver"); //参数是字符串,利用反射加载的数据库驱动
- 其实注册驱动可以这么写:
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
- 为什么我们平常都按照上面的写呢?
- 因为下面这句带了new关键字,如果数据库驱动文件不在了,程序在编译的时候就通过不了;而上面那句是按照字符串来的,就算数据库驱动文件不在,也可以通过编译,这就降低了程序间的耦合度。
工厂模式解耦
在我们普通的Servlet、Service、Dao三层架构中,表现层Servlet必须要new一个业务层Service的实现类,而业务层Service也必须要new一个持久层Dao的实现类;这就出现了耦合!解决办法是用工厂模式解耦!
控制反转(IOC)
控制反转是一种设计思想。
就是将你设计好的对象交给Spring控制new出来,而不是由你自己直接new,从而达到降低耦合的目的。所以叫做控制反转。
IOC的使用
准备spring的开发包
Spring官网:https://spring.io/
jar包下载地址:https://repo.spring.io/release/org/springframework/spring/
Spring项目入门
- 首先创建简单的Servlet、Service、Dao三层架构的接口以及其实现类。
- 创建Spring的配置文件(叫什么都行,一般叫applicationContext.xml),记得导入约束。(idea可以直接new一个自带约束的Spring Config.xml文件)
<?xml version="1.0" encoding="UTF-8"?>
- 获取Spring new的bean对象
package xyz.sky03.servlet; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import xyz.sky03.dao.IUserDao; import xyz.sky03.service.IUserService; public class UserServlet { public static void main(String[] args){ //1.获取核心容器对象 ApplicationContext ac= new ClassPathXmlApplicationContext("bean.xml"); //2.根据id获取Bean对象 以下两种方式都可以 //这里没有返回指定类型,所以需要强转类型 IUserService service = (IUserService) ac.getBean("userService"); //这里第一个参数填配置文件中的id,因为参数里指定了class,所以可以直接得到对应的类型 IUserDao dao = ac.getBean("UserDao