Spring入门

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:

/**

  • 1.导入Spring 的 jar包
  •  spring-beans-4.2.4.RELEASE.jar  beans管理包
    
  •  spring-core-4.2.4.RELEASE.jar   核心包
    
  • 2.项目交给Spring管理,需要Spring容器 ,BeanFactory
  • BeanFactory为接口需要一个实现类XmlBeanFactory(resource)
  • 创建一个new ClassPathResource() 对象
  • 3希望查看源码
  • 导入xsd
  • 4配置bean.xml
  •  4.1根据模板来设置xml约束
    
  •  4.2根据<bean id="" class="">
    
  •  		  <property name="" value="">
    
  •  	  </bean>
    
  •  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:
/**

  • Spring 在启动时创建与初始化对象方法
  • Spring 在关闭时销毁对象

*/
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配置






王东
赵洪
李冠希

	<!-- 注入list集合 -->
	<property name="list">
		<list>
			<value>李兵</value>
			<value>赵如何</value>
			<value>邓凤</value>
		</list>
	</property>
	
	<!-- 注入set集合 -->
	<property name="set">
		<set>
			<value>aaa</value>
			<value>bbb</value>
			<value>ccc</value>
		</set>
	</property>
	
	<!-- 注入Map集合 -->
	<property name="map">
		<map>
			<entry key="aaa" value="111"/>
			<entry key="bbb" value="222"/>
			<entry key="ccc" value="333"/>
		</map>
	</property>
</bean>

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.xml

struts.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:

/**

  • 1.导入Spring 的 jar包
  •  spring-beans-4.2.4.RELEASE.jar  beans管理包
    
  •  spring-core-4.2.4.RELEASE.jar   核心包
    
  • 2.项目交给Spring管理,需要Spring容器 ,BeanFactory
  • BeanFactory为接口需要一个实现类XmlBeanFactory(resource)
  • 创建一个new ClassPathResource() 对象
  • 3希望查看源码
  • 导入xsd
  • 4配置bean.xml
  •  4.1根据模板来设置xml约束
    
  •  4.2根据<bean id="" class="">
    
  •  		  <property name="" value="">
    
  •  	  </bean>
    
  •  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:
/**

  • Spring 在启动时创建与初始化对象方法
  • Spring 在关闭时销毁对象

*/
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配置






王东
赵洪
李冠希

	<!-- 注入list集合 -->
	<property name="list">
		<list>
			<value>李兵</value>
			<value>赵如何</value>
			<value>邓凤</value>
		</list>
	</property>
	
	<!-- 注入set集合 -->
	<property name="set">
		<set>
			<value>aaa</value>
			<value>bbb</value>
			<value>ccc</value>
		</set>
	</property>
	
	<!-- 注入Map集合 -->
	<property name="map">
		<map>
			<entry key="aaa" value="111"/>
			<entry key="bbb" value="222"/>
			<entry key="ccc" value="333"/>
		</map>
	</property>
</bean>

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.xml

struts.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的关系(选做)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值