Spring入门
课程目录
1.Spring 简介
2.Spring 使用入门
3.BeanFactory for Spring
4.Spring Config
5.Spring bean manager
6.Spring Module development
1.1Spring 历史
这是一个最好的时代,也是一个最坏的时代;
——《双城记》狄更斯
Java从诞生之日到如今已经历时了20多年。它经历过异军突起、风靡全球的时代;它也有过让人不满、饱受诟病的时候;直到现在它仍然牢牢坐在全球开发者使用量第一的位置上。在这样一段丰富多彩的历史中,Java从开始受到质疑到再次走向高峰,Spring框架起到了非常重要的作用。
(1)Java在最初10年辉煌后的痛点
Java从94年诞生之日起,借助于当时它的 语法简单、面向对象、跨平台、安全健壮等特性迅速得到业内欢迎,很快攀升到使用率No1的位置。基于Java实现的各种应用、各种服务、各种框架和第三方工具包开始出现爆炸性增长。虽然,这一方面代表了Java在行业内得到的肯定(当时已经是第一开发语言)与火热,但另一方面也在不断增加程序员开发的复杂度与时间成本、代码的体量也越来越大,这就带来了很多问题。其中最为突出的是如下几个:
在分层架构中,上层调用者与下层实现者之间形成代码级关联,这无疑增加了设计的耦合度;大部分第三方框架通过强迫使用者继承指定父类或实现指定接口,从而导致应用与框架绑定死板,形成“侵入性”编程;散布在应用各个模块中的非功能性重复模块,没有得到充分且灵活的复用;这些问题导致Java在做开发的时候(特别是Web开发)越发显得臃肿繁琐,将其进行“轻量化”成为业内的一致的呼声。为解决这个问题,行内提出了各种各样的解决方式,包括SUN公司也不断在JavaEE平台上做着各式各样的改进、优化、推新(EJB),但最终历史选择了“Spring”。
(2)Spring的出现
Spring 框架最开始的部分是由Rod Johnson于2000年为伦敦金融界提供独立咨询业务时写出来的。在《Expert One-On-One J2EE Development Without EJB》一书中,他进一步拓展了他的代码,以阐述“如何让应用程序能以超出当时大众所惯于接受的易用性和稳定性与J2EE平台上的不同组件合作”的观点。
一批自愿拓展Spring框架的程序开发人员组成了团队,2003年2月在Sourceforge上构建了一个项目。在Spring框架上工作了一年之后,这个团队在2004年3月发布了第一个版本(1.0)。这个版本之后,Spring框架在Java社区里变得异常流行,当然这也要部分的归功于它不错的文档功能和详尽的参考文献,特别是对于一个开源项目而言尤其如此。Spring框架的一个重要设计目标就是更容易地与已有的J2EE(现在称之为JavaEE或JEE)标准和商用工具整合。简单说来,Spring在最初的目标中(至少Rod大叔一开始是这么说的),并不是致力于打造又一个大而全的新框架。而是希望Spring框架就像一个大容器一样,能够快速方便地集成各种应用(牢记:不仅仅是Web应用,就算一个普通的Java应用也可以)中各种现有技术,对它们进行支持,让开发人员在实现过程中感觉就像使用简单JavaBean一样,在必要的时候还能轻松完成同类框架和工具的替换。而Spring达到这一目标的两大关键手段就是:控制反转/依赖注入(IOC/DI),和面向切面编程(AOP)。其中,IOC/DI是Spring最基本的底层;而AOP是Spring强大的亮点。它们也是我们一开始学习Spring的起点。
(3)Spring的发展
在诞生之初,Spring就是为了简化替代日益重量级的企业级Java技术。但随着时间的推移,JavaEE自身也在不断的演化,面向简单JavaBean模型、依赖注入、面向切面也都逐渐融入,这无疑是受到了Spring成功的启发。
在被模仿的同时,Spring并没有停下脚步。它继续在其它领域不断发展:移动开发,社交API集成、安全管理、NoSQL数据库、云计算和大数据等等都是它正在涉足和创新的领域,其前景更加广阔,甚至已经形成与传统的JavaEE平台分庭抗礼之势。
我们可以看到Spring已经打造出了一个自己专属的Spring生态帝国(Spring全家桶)。在这里,我们可以找到几乎所有Web开发所需要的一切解决方案,所以Spring是每个Java程序员都必须要掌握学习的重点内容!
(4)Spring技术演变历程
2002 年 10 月,Rod Johnson 撰写了一本名为 Expert One-on-One J2EE 设计和开发的书。本书由 Wrox出版,介绍了当时 Java 企业应用程序开发的情况,并指出了 Java EE 和 EJB 组件框架中的存在的一些主要缺陷。在这本书中,他提出了一个基于普通 Java 类和依赖注入的更简单的解决方案。
在本书发布后不久,开发者 Juergen Hoeller 和 Yann Caroff 说服 Rod Johnson 创建一个基于基础结构代码的开源项目。Rod,Juergen 和 Yann 于 2003 年 2 月左右开始合作开发该项目 。Yann 为新框架创造了“Spring”的名字。Yann Caroff 在早期离开了团队,Rod Johnson 在 2012 年离开,Juergen Hoeller 仍然是 Spring 开发团队的积极成员。
自 2004 年 1.0 版本发布以来,Spring 框架迅速发展。Spring 2.0 于 2006 年 10 月发布,到那时,Spring的下载量超过了 100 万。Spring 2.0 具有可扩展的 XML 配置功能,用于简化 XML 配置,支持 Java 5,额外的 IoC 容器扩展点,支持动态语言。
在 Rod 领导下管理 Interface21 项目于 2007 年 11 月更名为 SpringSource。同时发布了 Spring 2.5。Spring 2.5 中的主要新功能包括支持 Java 6 / Java EE 5,支持注释配置,classpath 中的组件自动检测和兼容 OSGi 的 bundle。
2007 年,SpringSource 从基准资本获得了 A 轮融资(1000万美元)。SpringSource 在此期间收购了多家公司,如Hyperic,G2One 等。2009年8月,SpringSource 以 4.2 亿美元被 VMWare 收购。SpringSource 在几周内收购了云代工厂,这是一家云 PaaS 提供商。2015 年,云代工厂转型成了非营利云代工厂。
2009 年 12 月,Spring 3.0 发布。Spring 3.0 具有许多重要特性,如重组模块系统,支持 Spring 表达式语言,基于 Java 的 bean 配置(JavaConfig),支持嵌入式数据库(如 HSQL,H2 和 Derby),模型验证/ REST 支持和对 Java EE 的支持。
2011 年和 2012 年发布了许多 3.x 系列的小版本。2012 年 7 月,Rod Johnson 离开了团队。2013 年 4月,VMware 和 EMC 通过 GE 投资创建了一家名为 Pivotal 的合资企业。所有的 Spring 应用项目都转移到了 Pivotal。
2013 年 12 月,Pivotal 宣布发布 Spring 框架 4.0。Spring 4.0 是 Spring 框架的一大进步,它包含了对Java 8 的全面支持,更高的第三方库依赖性(groovy 1.8+,ehcache 2.1+,hibernate 3.6+等),Java EE 7 支持,groovy DSL for bean 定义,对 websockets 的支持以及对泛型类型的支持作为注入 bean 的限定符。
2014 年至 2017 年期间发布了许多 Spring 框架 4.xx 系列版本。
Spring 5.0 GA版本于2017年9月28日发布。Spring 5.0开始支持JDK 8和Java EE 7,同时兼容JDK9。全面支持Servlet 3.1,还引入了一个全新的模块Spring WebFlux用于替代老话的 spring-webmvc;对Kotlin也有了更好的支持。
1.2Spring的概述
1.2.1Spring的概述
1.2.1.1什么是Spring
Spring:SE/EE开发的一站式框架。
一站式框架:有EE开发的每一层解决方案。
WEB层 :SpringMVC
Service层 :Spring的Bean管理,Spring声明式事务
DAO层 :Spring的Jdbc模板,Spring的ORM模块
1.2.1.2为什么学习Spring
1.2.1.3Spring的版本
Spring3.x和Spring4.x
1.2.2Spring的入门(IOC)
1.2.2.1什么IOC
IOC: Inversion of Control(控制反转)。
控制反转:将对象的创建权反转给(交给)Spring。
1.2.2.2下载Spring的开发包
官网:http://spring.io/
第一种直接
http://repo.springsource.org/libs-release-local/org/springframework/spring/3.2.8.RELEASE/spring-framework-3.2.8.RELEASE-dist.zip
http://repo.spring.io/libs-release-local/org/springframework/security/spring-security/3.2.3.RELEASE/spring-security-3.2.3.RELEASE-dist.zip
直接粘到地址栏或者下载工具里,每次有更新只要改版本号就可以;
第二种
http://repo.springsource.org/libs-release-local/
把这个粘到地址栏里,你会看到一个树型目录,然后就是一级一级往下点了;
第三种
你要在官网的projects里找到spring framework,然后左侧的"小猫"图标,跳到github,
找到 Spring Framework Artifacts这个连接,然后进入这个连接。
找到如下的连接:http://repo.spring.io 这个地址和下面第四种方法的地址是一样的,需要通过关键字去查询项目,然后下载项目的jar包。
1.2.2.3解压Spring的开发包
docs :Spring的开发规范和API
libs :Spring的开发的jar和源码
schema :Spring的配置文件的约束
1.2.2.4创建web项目,引入jar包
Spring, web项目环境配置
Spring, 普通项目入门环境:
1.2.2.5创建接口和类(原始编写程序)
问题:
如果底层的实现切换了,需要修改源代码,能不能不修改程序源代码对程序进行扩展?
1.2.2.6将实现类交给Spring管理
在spring的解压路径下spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html
1.2.2.7编写测试类
1.2.2.8IOC和DI(*****)
IOC:控制反转,将对象的创建权反转给了Spring。
DI:依赖注入,前提必须有IOC的环境,Spring管理这个类的时候将类的依赖的属性注入(设置)进来。
面向对象的时候
依赖
Class A{
}
Class B{
public void xxx(A a){
}
}
继承:is a
Class A{
}
Class B extends A{
}
聚合:has a
1.3Spring的工厂类
1.3.1Spring的工厂类
1.3.1.1Spring工厂类的结构图
ApplicationContext继承BeanFactory。
1.3.1.2BeanFactory :老版本的工厂类
BeanFactory:调用getBean的时候,才会生成类的实例。
EG:
/**
spring-beans-4.2.4.RELEASE.jar beans管理包
spring-core-4.2.4.RELEASE.jar 核心包
4.1根据模板来设置xml约束
4.2根据
4.3以上就是DI/IOC概念,依赖注入,吧new对象的控制权反转给Spring
*/
public class Entrance {
public static void main(String[] args) {
Resource resource = new ClassPathResource("bean.xml");
BeanFactory bf = new XmlBeanFactory(resource);
SayInterfaceImpl obj = (SayInterfaceImpl)bf.getBean("hi1");
obj.sayHiCn();
/*
* SayInterfaceImpl sayInterfaceImpl = new SayInterfaceImpl();
* sayInterfaceImpl.setMsg("打倒美帝国主义!!"); sayInterfaceImpl.sayHiCn();
*/
}
}
1.3.1.3ApplicationContext :新版本的工厂类
通过结构图发现,ApplicationContext 继承了Beanfactory 接口
(1)ApplicationContext and Beanfactory difference(区别)
beanFactory是在使用getBean时创建实例对象
ApplicationContext是在Spring工厂启动时加载对象
(2)我们使用ApplicationContext ,功能更多
(3)ApplicationContext 使用
ApplicationContext:加载配置文件的时候,就会将Spring管理的类都实例化。
ApplicationContext有两个实现类
ClassPathXmlApplicationContext :加载类路径下的配置文件
FileSystemXmlApplicationContext :加载文件系统下的配置文件
EG:
ApplicationContext appClass = new ClassPathXmlApplicationContext(“applicationConext.xml”);
ApplicationContext fxml = new FileSystemXmlApplicationContext(“f:/applicationConext.xml”);
1.3.1.4Spring包的认识
1.3.1.5SpringDI/IOC区别
IOC:控制反转,我们将创建对象等一系列的操作交给spring去管理。
DI依赖注入:前提,有IOC环境,面向对象时候,有多个类相互依赖,类交给Spring管理时,里面需要用到的属性我们让Spring给我们注入
①依赖
Class A{
Private C c;
Void mothed(B b){
b.say();
c.length();
}
}
Class B{
}
Class c{
}
②继承
Is a
Class a extends b{
}
③聚合 has a
松散聚合
紧密聚合
1.4Spring的配置
1.4.1XML的提示配置
1.4.1.1Schema的配置
当我们需要提示时,Schema约束起到提示作用,当我们没有联网时,就需要手动配置本地.xsd文件。
1.4.2Bean的相关的配置
1.4.2.1标签的id和name的配置
id :使用了约束中的唯一约束。里面不能出现特殊字符的。
name :没有使用约束中的唯一约束(理论上可以出现重复的,但是实际开发不能出现的)。里面可以出现特殊字符。
Spring和其他框架整合的时候
1.4.2.2Bean的生命周期的配置(了解)
init-method :Bean被初始化的时候执行的方法
destroy-method :Bean被销毁的时候执行的方法(Bean是单例创建,工厂关闭)
Eg:
/**
*/
public class customerDAOTest {
@Test
public void testSave() {
//创建工厂
ClassPathXmlApplicationContext application = new ClassPathXmlApplicationContext(“applicationConext.xml”);
//通过工厂拿到getBean
CustomerDAO bean = (CustomerDAO)application.getBean(“customer”);
//调用对象方法
bean.save();
//关闭工厂
application.close();
}
}
1.4.2.3Bean的作用范围的配置(重点)
scope :Bean的作用范围
singleton :默认的,Spring会采用单例模式创建这个对象。
prototype :多例模式。(SpringMVC和Spring整合一定会用到)
request :应用在web项目中,Spring创建这个类以后,将这个类存入到request范围中。
session :应用在web项目中,Spring创建这个类以后,将这个类存入到session范围中。
globalsession :应用在web项目中,必须在porlet环境下使用。但是如果没有这种环境,相对于session。
lazy-init=“true” : 懒加载 Spring初始化时不创建管理bean的对象,在getBean(“beanname”)调用时,创建对象
测试:
1.多创建几个对象
2.查看地址是否一致
1.5Spring的Bean管理(XML方式)
1.5.1Spring的Bean的实例化方式(了解)
Bean已经都交给Spring管理,Spring创建这些类的时候,有几种方式:
1.5.1.1无参构造方法的方式(默认)
编写类
编写配置
1.5.1.2静态工厂实例化的方式
编写Bean2的静态工厂
配置
1.5.1.3实例工厂实例化的方式
Bean3的实例工厂
配置
1.5.2Spring的属性注入
1.5.2.1构造方法的方式的属性注入
构造方法的属性注入
1.5.2.2Set方法的方式的属性注入
Set方法的属性注入
Set方法设置对象类型的属性
1.5.2.3P名称空间的属性注入(Spring2.5以后,Spring提供)
通过引入p名称空间完成属性的注入:
写法:
普通属性 p:属性名=”值”
对象属性 p:属性名-ref=”值”
P名称空间的引入
使用p名称空间
1.5.2.4SpEL的属性注入(Spring3.0以后)
SpEL:Spring Expression Language,Spring的表达式语言。
语法:
#{SpEL}
1.5.3数组、集合类型属性注入(了解)
1.5.3.1配置
王东
赵洪
李冠希
李兵
赵如何
邓凤
aaa
bbb
ccc
1.6Spring的分模块开发的配置
1.6.1分模块配置
1.6.1.1在加载配置文件的时候,加载多个
1.6.1.2在一个配置文件中引入多个配置文件
1.7CRM的综合案例 1.7.1代码实现 1.7.1.1创建数据库和表 1.7.1.2创建web项目,引入jar包 引入struts2的开发的jar包 引入struts2的配置文件 web.xmlstruts.xml
1.7.1.3引入页面
1.7.1.4编写Action类
1.7.1.5配置Action
1.7.1.6修改页面提交到Action
1.7.1.7编写Action的save方法
不在Action中直接创建Service,将Service交给Spring管理。
创建Service接口和实现类
1.7.1.8引入Spring的环境
引入jar包
引入配置文件
1.7.1.9将Service交给Spring
1.7.1.10在Action中调用Service
1.7.1.11编写DAO并且完成配置
编写DAO的接口和实现类
将DAO交给Spring管理
1.7.1.12在Service中使用DAO
1.7.2问题描述
1.7.2.1程序问题
每次请求都会创建一个Spring的工厂,这样浪费服务器资源,应该一个项目只有一个Spring的工厂。
在服务器启动的时候,创建一个Spring的工厂。
创建完工厂,将这个工厂类保存到ServletContext中。
每次使用的时候都从ServletContext中获取。
*****使用ServletContextListener
监听ServletContext对象的创建和销毁。
1.7.2.2解决方案:使用Spring核心监听器ContextLoaderListener(整合web项目)
引入jar包
spring-web.jar
配置监听器
在Action中获取工厂
3.课后作业与练习
课后练习:
(1)作业 使用Spring配置一个类,依赖注入属性,属性有Spring 自定义类 时间类
(2)配置一个类为懒加载
(3)配置一个类为多例 ,证明是多例
(4)写一篇心得:Spring是什么?
面试题:
(1)什么是IOC
(2)什么是DI
(3)BeanFactory 与 applicationContext的关系与区别
(4)Spring创建对象的执行流程
(5)如何配置懒加载
(6)如何配置多例
(7)如何加载多个Spring的配置文件
(8)Spring与Spring MVC 与SpringFarmework 的关系
(9)Spring 与SpringBoot的关系(选做)
Day01-Interface21 Spring
王老师
QQ:372661197
课程目录
1.Spring 简介
2.Spring 使用入门
3.BeanFactory for Spring
4.Spring Config
5.Spring bean manager
6.Spring Module development
1.1Spring 历史
这是一个最好的时代,也是一个最坏的时代;
——《双城记》狄更斯
Java从诞生之日到如今已经历时了20多年。它经历过异军突起、风靡全球的时代;它也有过让人不满、饱受诟病的时候;直到现在它仍然牢牢坐在全球开发者使用量第一的位置上。在这样一段丰富多彩的历史中,Java从开始受到质疑到再次走向高峰,Spring框架起到了非常重要的作用。
(1)Java在最初10年辉煌后的痛点
Java从94年诞生之日起,借助于当时它的 语法简单、面向对象、跨平台、安全健壮等特性迅速得到业内欢迎,很快攀升到使用率No1的位置。基于Java实现的各种应用、各种服务、各种框架和第三方工具包开始出现爆炸性增长。虽然,这一方面代表了Java在行业内得到的肯定(当时已经是第一开发语言)与火热,但另一方面也在不断增加程序员开发的复杂度与时间成本、代码的体量也越来越大,这就带来了很多问题。其中最为突出的是如下几个:
在分层架构中,上层调用者与下层实现者之间形成代码级关联,这无疑增加了设计的耦合度;大部分第三方框架通过强迫使用者继承指定父类或实现指定接口,从而导致应用与框架绑定死板,形成“侵入性”编程;散布在应用各个模块中的非功能性重复模块,没有得到充分且灵活的复用;这些问题导致Java在做开发的时候(特别是Web开发)越发显得臃肿繁琐,将其进行“轻量化”成为业内的一致的呼声。为解决这个问题,行内提出了各种各样的解决方式,包括SUN公司也不断在JavaEE平台上做着各式各样的改进、优化、推新(EJB),但最终历史选择了“Spring”。
(2)Spring的出现
Spring 框架最开始的部分是由Rod Johnson于2000年为伦敦金融界提供独立咨询业务时写出来的。在《Expert One-On-One J2EE Development Without EJB》一书中,他进一步拓展了他的代码,以阐述“如何让应用程序能以超出当时大众所惯于接受的易用性和稳定性与J2EE平台上的不同组件合作”的观点。
一批自愿拓展Spring框架的程序开发人员组成了团队,2003年2月在Sourceforge上构建了一个项目。在Spring框架上工作了一年之后,这个团队在2004年3月发布了第一个版本(1.0)。这个版本之后,Spring框架在Java社区里变得异常流行,当然这也要部分的归功于它不错的文档功能和详尽的参考文献,特别是对于一个开源项目而言尤其如此。Spring框架的一个重要设计目标就是更容易地与已有的J2EE(现在称之为JavaEE或JEE)标准和商用工具整合。简单说来,Spring在最初的目标中(至少Rod大叔一开始是这么说的),并不是致力于打造又一个大而全的新框架。而是希望Spring框架就像一个大容器一样,能够快速方便地集成各种应用(牢记:不仅仅是Web应用,就算一个普通的Java应用也可以)中各种现有技术,对它们进行支持,让开发人员在实现过程中感觉就像使用简单JavaBean一样,在必要的时候还能轻松完成同类框架和工具的替换。而Spring达到这一目标的两大关键手段就是:控制反转/依赖注入(IOC/DI),和面向切面编程(AOP)。其中,IOC/DI是Spring最基本的底层;而AOP是Spring强大的亮点。它们也是我们一开始学习Spring的起点。
(3)Spring的发展
在诞生之初,Spring就是为了简化替代日益重量级的企业级Java技术。但随着时间的推移,JavaEE自身也在不断的演化,面向简单JavaBean模型、依赖注入、面向切面也都逐渐融入,这无疑是受到了Spring成功的启发。
在被模仿的同时,Spring并没有停下脚步。它继续在其它领域不断发展:移动开发,社交API集成、安全管理、NoSQL数据库、云计算和大数据等等都是它正在涉足和创新的领域,其前景更加广阔,甚至已经形成与传统的JavaEE平台分庭抗礼之势。
我们可以看到Spring已经打造出了一个自己专属的Spring生态帝国(Spring全家桶)。在这里,我们可以找到几乎所有Web开发所需要的一切解决方案,所以Spring是每个Java程序员都必须要掌握学习的重点内容!
(4)Spring技术演变历程
2002 年 10 月,Rod Johnson 撰写了一本名为 Expert One-on-One J2EE 设计和开发的书。本书由 Wrox出版,介绍了当时 Java 企业应用程序开发的情况,并指出了 Java EE 和 EJB 组件框架中的存在的一些主要缺陷。在这本书中,他提出了一个基于普通 Java 类和依赖注入的更简单的解决方案。
在本书发布后不久,开发者 Juergen Hoeller 和 Yann Caroff 说服 Rod Johnson 创建一个基于基础结构代码的开源项目。Rod,Juergen 和 Yann 于 2003 年 2 月左右开始合作开发该项目 。Yann 为新框架创造了“Spring”的名字。Yann Caroff 在早期离开了团队,Rod Johnson 在 2012 年离开,Juergen Hoeller 仍然是 Spring 开发团队的积极成员。
自 2004 年 1.0 版本发布以来,Spring 框架迅速发展。Spring 2.0 于 2006 年 10 月发布,到那时,Spring的下载量超过了 100 万。Spring 2.0 具有可扩展的 XML 配置功能,用于简化 XML 配置,支持 Java 5,额外的 IoC 容器扩展点,支持动态语言。
在 Rod 领导下管理 Interface21 项目于 2007 年 11 月更名为 SpringSource。同时发布了 Spring 2.5。Spring 2.5 中的主要新功能包括支持 Java 6 / Java EE 5,支持注释配置,classpath 中的组件自动检测和兼容 OSGi 的 bundle。
2007 年,SpringSource 从基准资本获得了 A 轮融资(1000万美元)。SpringSource 在此期间收购了多家公司,如Hyperic,G2One 等。2009年8月,SpringSource 以 4.2 亿美元被 VMWare 收购。SpringSource 在几周内收购了云代工厂,这是一家云 PaaS 提供商。2015 年,云代工厂转型成了非营利云代工厂。
2009 年 12 月,Spring 3.0 发布。Spring 3.0 具有许多重要特性,如重组模块系统,支持 Spring 表达式语言,基于 Java 的 bean 配置(JavaConfig),支持嵌入式数据库(如 HSQL,H2 和 Derby),模型验证/ REST 支持和对 Java EE 的支持。
2011 年和 2012 年发布了许多 3.x 系列的小版本。2012 年 7 月,Rod Johnson 离开了团队。2013 年 4月,VMware 和 EMC 通过 GE 投资创建了一家名为 Pivotal 的合资企业。所有的 Spring 应用项目都转移到了 Pivotal。
2013 年 12 月,Pivotal 宣布发布 Spring 框架 4.0。Spring 4.0 是 Spring 框架的一大进步,它包含了对Java 8 的全面支持,更高的第三方库依赖性(groovy 1.8+,ehcache 2.1+,hibernate 3.6+等),Java EE 7 支持,groovy DSL for bean 定义,对 websockets 的支持以及对泛型类型的支持作为注入 bean 的限定符。
2014 年至 2017 年期间发布了许多 Spring 框架 4.xx 系列版本。
Spring 5.0 GA版本于2017年9月28日发布。Spring 5.0开始支持JDK 8和Java EE 7,同时兼容JDK9。全面支持Servlet 3.1,还引入了一个全新的模块Spring WebFlux用于替代老话的 spring-webmvc;对Kotlin也有了更好的支持。
1.2Spring的概述
1.2.1Spring的概述
1.2.1.1什么是Spring
Spring:SE/EE开发的一站式框架。
一站式框架:有EE开发的每一层解决方案。
WEB层 :SpringMVC
Service层 :Spring的Bean管理,Spring声明式事务
DAO层 :Spring的Jdbc模板,Spring的ORM模块
1.2.1.2为什么学习Spring
1.2.1.3Spring的版本
Spring3.x和Spring4.x
1.2.2Spring的入门(IOC)
1.2.2.1什么IOC
IOC: Inversion of Control(控制反转)。
控制反转:将对象的创建权反转给(交给)Spring。
1.2.2.2下载Spring的开发包
官网:http://spring.io/
第一种直接
http://repo.springsource.org/libs-release-local/org/springframework/spring/3.2.8.RELEASE/spring-framework-3.2.8.RELEASE-dist.zip
http://repo.spring.io/libs-release-local/org/springframework/security/spring-security/3.2.3.RELEASE/spring-security-3.2.3.RELEASE-dist.zip
直接粘到地址栏或者下载工具里,每次有更新只要改版本号就可以;
第二种
http://repo.springsource.org/libs-release-local/
把这个粘到地址栏里,你会看到一个树型目录,然后就是一级一级往下点了;
第三种
你要在官网的projects里找到spring framework,然后左侧的"小猫"图标,跳到github,
找到 Spring Framework Artifacts这个连接,然后进入这个连接。
找到如下的连接:http://repo.spring.io 这个地址和下面第四种方法的地址是一样的,需要通过关键字去查询项目,然后下载项目的jar包。
1.2.2.3解压Spring的开发包
docs :Spring的开发规范和API
libs :Spring的开发的jar和源码
schema :Spring的配置文件的约束
1.2.2.4创建web项目,引入jar包
Spring, web项目环境配置
Spring, 普通项目入门环境:
1.2.2.5创建接口和类(原始编写程序)
问题:
如果底层的实现切换了,需要修改源代码,能不能不修改程序源代码对程序进行扩展?
1.2.2.6将实现类交给Spring管理
在spring的解压路径下spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html
1.2.2.7编写测试类
1.2.2.8IOC和DI(*****)
IOC:控制反转,将对象的创建权反转给了Spring。
DI:依赖注入,前提必须有IOC的环境,Spring管理这个类的时候将类的依赖的属性注入(设置)进来。
面向对象的时候
依赖
Class A{
}
Class B{
public void xxx(A a){
}
}
继承:is a
Class A{
}
Class B extends A{
}
聚合:has a
1.3Spring的工厂类
1.3.1Spring的工厂类
1.3.1.1Spring工厂类的结构图
ApplicationContext继承BeanFactory。
1.3.1.2BeanFactory :老版本的工厂类
BeanFactory:调用getBean的时候,才会生成类的实例。
EG:
/**
spring-beans-4.2.4.RELEASE.jar beans管理包
spring-core-4.2.4.RELEASE.jar 核心包
4.1根据模板来设置xml约束
4.2根据
4.3以上就是DI/IOC概念,依赖注入,吧new对象的控制权反转给Spring
*/
public class Entrance {
public static void main(String[] args) {
Resource resource = new ClassPathResource("bean.xml");
BeanFactory bf = new XmlBeanFactory(resource);
SayInterfaceImpl obj = (SayInterfaceImpl)bf.getBean("hi1");
obj.sayHiCn();
/*
* SayInterfaceImpl sayInterfaceImpl = new SayInterfaceImpl();
* sayInterfaceImpl.setMsg("打倒美帝国主义!!"); sayInterfaceImpl.sayHiCn();
*/
}
}
1.3.1.3ApplicationContext :新版本的工厂类
通过结构图发现,ApplicationContext 继承了Beanfactory 接口
(1)ApplicationContext and Beanfactory difference(区别)
beanFactory是在使用getBean时创建实例对象
ApplicationContext是在Spring工厂启动时加载对象
(2)我们使用ApplicationContext ,功能更多
(3)ApplicationContext 使用
ApplicationContext:加载配置文件的时候,就会将Spring管理的类都实例化。
ApplicationContext有两个实现类
ClassPathXmlApplicationContext :加载类路径下的配置文件
FileSystemXmlApplicationContext :加载文件系统下的配置文件
EG:
ApplicationContext appClass = new ClassPathXmlApplicationContext(“applicationConext.xml”);
ApplicationContext fxml = new FileSystemXmlApplicationContext(“f:/applicationConext.xml”);
1.3.1.4Spring包的认识
1.3.1.5SpringDI/IOC区别
IOC:控制反转,我们将创建对象等一系列的操作交给spring去管理。
DI依赖注入:前提,有IOC环境,面向对象时候,有多个类相互依赖,类交给Spring管理时,里面需要用到的属性我们让Spring给我们注入
①依赖
Class A{
Private C c;
Void mothed(B b){
b.say();
c.length();
}
}
Class B{
}
Class c{
}
②继承
Is a
Class a extends b{
}
③聚合 has a
松散聚合
紧密聚合
1.4Spring的配置
1.4.1XML的提示配置
1.4.1.1Schema的配置
当我们需要提示时,Schema约束起到提示作用,当我们没有联网时,就需要手动配置本地.xsd文件。
1.4.2Bean的相关的配置
1.4.2.1标签的id和name的配置
id :使用了约束中的唯一约束。里面不能出现特殊字符的。
name :没有使用约束中的唯一约束(理论上可以出现重复的,但是实际开发不能出现的)。里面可以出现特殊字符。
Spring和其他框架整合的时候
1.4.2.2Bean的生命周期的配置(了解)
init-method :Bean被初始化的时候执行的方法
destroy-method :Bean被销毁的时候执行的方法(Bean是单例创建,工厂关闭)
Eg:
/**
*/
public class customerDAOTest {
@Test
public void testSave() {
//创建工厂
ClassPathXmlApplicationContext application = new ClassPathXmlApplicationContext(“applicationConext.xml”);
//通过工厂拿到getBean
CustomerDAO bean = (CustomerDAO)application.getBean(“customer”);
//调用对象方法
bean.save();
//关闭工厂
application.close();
}
}
1.4.2.3Bean的作用范围的配置(重点)
scope :Bean的作用范围
singleton :默认的,Spring会采用单例模式创建这个对象。
prototype :多例模式。(SpringMVC和Spring整合一定会用到)
request :应用在web项目中,Spring创建这个类以后,将这个类存入到request范围中。
session :应用在web项目中,Spring创建这个类以后,将这个类存入到session范围中。
globalsession :应用在web项目中,必须在porlet环境下使用。但是如果没有这种环境,相对于session。
lazy-init=“true” : 懒加载 Spring初始化时不创建管理bean的对象,在getBean(“beanname”)调用时,创建对象
测试:
1.多创建几个对象
2.查看地址是否一致
1.5Spring的Bean管理(XML方式)
1.5.1Spring的Bean的实例化方式(了解)
Bean已经都交给Spring管理,Spring创建这些类的时候,有几种方式:
1.5.1.1无参构造方法的方式(默认)
编写类
编写配置
1.5.1.2静态工厂实例化的方式
编写Bean2的静态工厂
配置
1.5.1.3实例工厂实例化的方式
Bean3的实例工厂
配置
1.5.2Spring的属性注入
1.5.2.1构造方法的方式的属性注入
构造方法的属性注入
1.5.2.2Set方法的方式的属性注入
Set方法的属性注入
Set方法设置对象类型的属性
1.5.2.3P名称空间的属性注入(Spring2.5以后,Spring提供)
通过引入p名称空间完成属性的注入:
写法:
普通属性 p:属性名=”值”
对象属性 p:属性名-ref=”值”
P名称空间的引入
使用p名称空间
1.5.2.4SpEL的属性注入(Spring3.0以后)
SpEL:Spring Expression Language,Spring的表达式语言。
语法:
#{SpEL}
1.5.3数组、集合类型属性注入(了解)
1.5.3.1配置
王东
赵洪
李冠希
李兵
赵如何
邓凤
aaa
bbb
ccc
1.6Spring的分模块开发的配置
1.6.1分模块配置
1.6.1.1在加载配置文件的时候,加载多个
1.6.1.2在一个配置文件中引入多个配置文件
1.7CRM的综合案例 1.7.1代码实现 1.7.1.1创建数据库和表 1.7.1.2创建web项目,引入jar包 引入struts2的开发的jar包 引入struts2的配置文件 web.xmlstruts.xml
1.7.1.3引入页面
1.7.1.4编写Action类
1.7.1.5配置Action
1.7.1.6修改页面提交到Action
1.7.1.7编写Action的save方法
不在Action中直接创建Service,将Service交给Spring管理。
创建Service接口和实现类
1.7.1.8引入Spring的环境
引入jar包
引入配置文件
1.7.1.9将Service交给Spring
1.7.1.10在Action中调用Service
1.7.1.11编写DAO并且完成配置
编写DAO的接口和实现类
将DAO交给Spring管理
1.7.1.12在Service中使用DAO
1.7.2问题描述
1.7.2.1程序问题
每次请求都会创建一个Spring的工厂,这样浪费服务器资源,应该一个项目只有一个Spring的工厂。
在服务器启动的时候,创建一个Spring的工厂。
创建完工厂,将这个工厂类保存到ServletContext中。
每次使用的时候都从ServletContext中获取。
*****使用ServletContextListener
监听ServletContext对象的创建和销毁。
1.7.2.2解决方案:使用Spring核心监听器ContextLoaderListener(整合web项目)
引入jar包
spring-web.jar
配置监听器
在Action中获取工厂
3.课后作业与练习
课后练习:
(1)作业 使用Spring配置一个类,依赖注入属性,属性有Spring 自定义类 时间类
(2)配置一个类为懒加载
(3)配置一个类为多例 ,证明是多例
(4)写一篇心得:Spring是什么?
面试题:
(1)什么是IOC
(2)什么是DI
(3)BeanFactory 与 applicationContext的关系与区别
(4)Spring创建对象的执行流程
(5)如何配置懒加载
(6)如何配置多例
(7)如何加载多个Spring的配置文件
(8)Spring与Spring MVC 与SpringFarmework 的关系
(9)Spring 与SpringBoot的关系(选做)