2023年3月

JavaFX教程™ --必看
https://www.yiibai.com/javafx

/=================

富互联网应用
是那些提供与
Web应用程序
类似的功能,并可作为桌面应用程序体验的应用。与用户的正常网络应用程序
相比
,它们
提供
更好的视觉体验。这些应用程序可作为
浏览器插件
或作为
虚拟机
提供,用于将传统静态应用程序转换为更加
增强,流畅,动画
和引人入胜的应用程序。---
这样的优势明显吗?比得上C#桌面程序?

与传统的桌面应用程序不同,
RIA
不需要任何额外的软件来运行。作为替代需要安装一些软件,如:
ActiveX

Java

Flash
,这取决于应用程序使用的组件。
--javafx不需要 jdk??

在RIA中,图形表示在客户端处理,因为它有一个丰富的图形提供支持的插件。 简而言之,
RIA中的数据操作在服务器端执行
,而相关对象操纵在客户端端执行。
-- 类似多层架构??

有三个主要技术可使用于开发RIA。这些三个技术以下 -

  • Adobe Flash
  • Microsoft Silverlight
  • JavaFX


JavaFX

JavaFX是一个Java库,可以使用它开发富互联网应用程序。通过使用Java技术,这些应用程序的浏览器渗透率为
76%


JavaFX是什么?

JavaFX是用于构建富互联网应用程序的Java库。 使用此库编写的应用程序可以
跨多个平台一致运行
。使用JavaFX开发的应用程序可以在各种设备上运行,如
台式计算机,手机,电视,平板电脑等。

要使用Java编程语言开发GUI应用程序,程序员依赖于诸如高级窗口工具包(AWT)和Swings之类的库。在JavaFX出现之后,这些Java程序开发就可以有效地利用丰富的类库来开发GUI应用程序。

JavaFX
是Java的
下一代图形用户界面工具包

JavaFX
是一组
图形和媒体API,
我们可以用它们来创建和部署富客户端应用程序。

JavaFX
允许开发人员快速构建丰富的
跨平台应用程序

JavaFX
通过硬件加速图形
支持现代GPU

-- 直接通过GPU加速 貌似不错,怎么设定??

JavaFX
允许开发人员在
单个编程接口
中组合图形,动画和UI控件。

图表编程语言可用于开发互联网应用程序(RIA)。
JavaFX
技术主要应用于创建Rich Internet applications(RIAs)。当前的JavaFX包括JavaFX脚本和JavaFX Mobile(一种运营于行动装置的操作系统),今后JavaFX将包括更多的产品。JavaFX Script编程语言(以下称为JavaFX)是一种声明性的、静态类型脚本语言。

JavaFX
技术有着良好的前景,包括可以
直接调用Java API的能力
。因为 JavaFX Script是静态类型,它同样具有结构化代码、重用性和封装性,如包、类、继承和单独编译和发布单元,这些特性使得
使用JavaFX技术创建和管理大型程序变为可能。
-- 意思是现在是做小型的软件咯 ??

  • 最新版本JavaFX8,在2014年3月18日作为Java的一个组成部分一起发布。

  • 从Java8开始,JDK(Java开发工具包)包括了JavaFX库。 因此,要运行JavaFX应用程序,您只需要在系统中安装Java8或更高版本。

想要在
Eclipse
中开发 JavaFX,

1、安装 JavaFX 的开发工具,安装 e(fx)clipse到Eclipse中

2、安装 JavaFX Scene Builder


1-JavaFX Scene Builder是什么?

JavaFX Scene Builder
是一种可视布局工具,允许用户快速设计
JavaFX
应用程序用户界面,而无需编码。用户可以将
UI
组件拖放到工作区,修改其属性,应用样式表,并且它们正在创建的布局的
FXML
代码将在后台自动生成。它的结果是一个
FXML
文件,然后可以通过绑定到应用程序的逻辑与Java项目组合。

JavaFX Scene Builder
的开发界面如下
-  IDEA自带的 和eclipse 安装的不一样


http://www.17sucai.com/pins/demo-show?id=2459

http://www.17sucai.com/pins/demo-show?id=2458

很多资料 ,前端代码,网站代码 要钱的也不贵,买点来玩玩,很妥

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>原生js canvas实现苹果电脑mac OS窗口最小化效果</title>

    <link href="http://www.17sucai.com/static/css/demo.css" rel="stylesheet" media="all" />

    <!--[if IE]>

    <style type="text/css">li.remove_frame a {
padding
-top: 5px;
background
-position: 0px -3px;
}
</style> <![endif]--> <script type="text/javascript" src="http://www.17sucai.com/static/js/jquery.min.js"></script> <script type="text/javascript" src="http://www.17sucai.com/static/js/jquery.qrcode.min.js"></script> <script type="text/javascript">$(document).ready(function() {functionfixHeight() {var headerHeight = $("#switcher").height();
$(
"#iframe").attr("height", $(window).height()-54+ "px");
}
$(window).resize(
function() {
fixHeight();
}).resize();

$(
'.icon-monitor').addClass('active');

$(
".icon-mobile-3").click(function() {
$(
"#by").css("overflow-y", "auto");
$(
'#iframe-wrap').removeClass().addClass('mobile-width-3');
$(
'.icon-tablet,.icon-mobile-1,.icon-monitor,.icon-mobile-2,.icon-mobile-3').removeClass('active');
$(
this).addClass('active');return false;
});

$(
".icon-mobile-2").click(function() {
$(
"#by").css("overflow-y", "auto");
$(
'#iframe-wrap').removeClass().addClass('mobile-width-2');
$(
'.icon-tablet,.icon-mobile-1,.icon-monitor,.icon-mobile-2,.icon-mobile-3').removeClass('active');
$(
this).addClass('active');return false;
});

$(
".icon-mobile-1").click(function() {
$(
"#by").css("overflow-y", "auto");
$(
'#iframe-wrap').removeClass().addClass('mobile-width');
$(
'.icon-tablet,.icon-mobile,.icon-monitor,.icon-mobile-2,.icon-mobile-3').removeClass('active');
$(
this).addClass('active');return false;
});

$(
".icon-tablet").click(function() {
$(
"#by").css("overflow-y", "auto");
$(
'#iframe-wrap').removeClass().addClass('tablet-width');
$(
'.icon-tablet,.icon-mobile-1,.icon-monitor,.icon-mobile-2,.icon-mobile-3').removeClass('active');
$(
this).addClass('active');return false;
});

$(
".icon-monitor").click(function() {
$(
"#by").css("overflow-y", "hidden");
$(
'#iframe-wrap').removeClass().addClass('full-width');
$(
'.icon-tablet,.icon-mobile-1,.icon-monitor,.icon-mobile-2,.icon-mobile-3').removeClass('active');
$(
this).addClass('active');return false;
});
});
</script> <script type="text/javascript"> functionResponsive($a) {if ($a == true) $("#Device").css("opacity", "100");if ($a == false) $("#Device").css("opacity", "0");
$(
'#iframe-wrap').removeClass().addClass('full-width');
$(
'.icon-tablet,.icon-mobile-1,.icon-monitor,.icon-mobile-2,.icon-mobile-3').removeClass('active');
$(
this).addClass('active');return false;
};
</script> </head> <body id="by"> <div id="switcher"> <div class="center"> <ul> <div id="Device"> <li class="device-monitor"><a href="javascript:"><div class="icon-monitor"></div></a></li> <li class="device-mobile"><a href="javascript:"><div class="icon-tablet"></div></a></li> <li class="device-mobile"><a href="javascript:"><div class="icon-mobile-1"></div></a></li> <li class="device-mobile-2"><a href="javascript:"><div class="icon-mobile-2"></div></a></li> <li class="device-mobile-3"><a href="javascript:"><div class="icon-mobile-3"></div></a></li> </div> <li class="top2"> <a href="#">手机二维码预览</a> <div class="vm"> <div id="output"></div> <p style="color:#808080;margin:10px 0 0 0;">扫一扫,直接在手机上打开</p> </div> </li> <li class="logoTop"> <a href="http://www.17sucai.com/pins/2459.html">原生js canvas实现苹果电脑mac OS窗口最小化效果</a> <script type="text/javascript">
jQuery('#output').qrcode({width:150,height: 150,text: window.location.href});
</script>
<li class=
"remove_frame"><a href="http://www.17sucai.com/preview/7197/2013-09-27/js实现macOS窗口最小化效果1/demo.html" title="移除框架"></a></li> </ul> </div> </div> <div id="iframe-wrap"> <iframe id="iframe" src="http://www.17sucai.com/preview/7197/2013-09-27/js实现macOS窗口最小化效果1/demo.html" frameborder="0" width="100%"></iframe> </div> <!--百度流量统计代码--> <script> var _hmt = _hmt ||[];
(
function() {var hm = document.createElement("script");
hm.src
= "https://hm.baidu.com/hm.js?382f81c966395258f239157654081890";var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script> </body> </html>

View Code

jsp与servlet的区别与联系 - gsyabc - 博客园
https://www.cnblogs.com/sanyouge/p/7325656.html

jsp和servlet的区别和联系:
1.jsp经编译后就变成了Servlet.
(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类)

2.jsp更擅长表现于页面显示,servlet更擅长于逻辑控制.
3.Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到.
Jsp是Servlet的一种简化,使用Jsp只需要完成程序员需要输出到客户端的内容,Jsp中的Java脚本如何镶嵌到一个类中,由Jsp容器完成。
Servlet则是个完整的Java类,这个类的Service方法用于生成对客户端的响应。


联系:
JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。JSP编译后是“类servlet”。
Servlet和JSP最主要的不同点在于:
Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。
而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。
JSP侧重于视图,Servlet主要用于控制逻辑
Servlet更多的是类似于一个Controller,用来做控制。



理解以下三点即可:


1、不同之处在哪?

  • Servlet在Java代码中通过
    HttpServletResponse对象动态
    输出HTML内容
  • JSP在
    静态HTML内容

    嵌入Java代码

    Java代码

    动态
    执行后生成
    HTML内容

2、各自的特点

  • Servlet能够很好地组织
    业务逻辑代
    码,但是在Java源文件中通过字符串拼接的方式生成动态HTML内容会导致代码维护困难、可读性差
  • JSP虽然规避了Servlet在生成HTML内容方面的劣势,但是在HTML中混入大量、复杂的业务逻辑同样也是不可取的

3、通过MVC双剑合璧

既然JSP和Servlet都有自身的适用环境,那么能否扬长避短,让它们发挥各自的优势呢?答案是肯定的——MVC(Model-View-Controller)模式非常适合解决这一问题。

MVC模式(Model-View-Controller)是
软件工程
中的一种
软件架构
模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller):

  • Controller——
    负责转发请求,对请求进行处理
  • View——
    负责界面显示
  • Model——
    业务功能编写(例如算法实现)、数据库设计以及数据存取操作实现

在JSP/Servlet开发的软件系统中,这三个部分的描述如下所示:

  1. Web浏览器发送HTTP请求到服务端,被
    Controller(Servlet)
    获取并进行处理(
    例如参数解析、请求转发
  2. Controller(Servlet)调用
    核心业务逻辑——Model部分,获得结果
  3. Controller(Servlet)将逻辑处理结果交给View(JSP),动态输出HTML内容
  4. 动态生成的HTML内
    容返回到浏览器显示

MVC模式在Web开发中的好处是非常明显,它规避了JSP与Servlet各自的短板,Servlet只负责业务逻辑而不会通过out.append()动态生成HTML代码;JSP中也不会充斥着大量的业务代码。这大大提高了代码的可读性和可维护性。

//================

servlet与jsp的区别 - java - 方帮信
http://www.fangbangxin.com/news/show-3701.html

Java后端技术
https://mp.weixin.qq.com/s?__biz=MzI1NDQ3MjQxNA==&mid=2247484822&idx=1&sn=6fbee2a12b31b6102a18d3725671d41b&chksm=e9c5fc27deb275319641c3f30d168b85c7c196fd276d47efa35046b5dc54f5b77174c5bf8808&scene=21#wechat_redirect

为什么要有Spring?


徐刘根
Java后端技术

2017-12-25

Spring核心技术原理(1)为什么要有Spring?

一、知史可以明鉴

我们学习技术的时代赶上了最好的时代,跳过了很多前人经常踩的坑,前人在踩坑的过程中总结了很多经验和教训,而新时代的我们只是继承了前人的经验和教训,而忽略了这些采坑的过程,以至于我们面对很多新技术都不知道他是什么?他为什么存在?他为什么可以解决这个问题?更不知道如何掌握其原理!云里雾里一头雾水!

交流群的很多小伙伴,常常私聊我让我推荐一下学习SSM框架的视频和资料,我首先会打开他的资料卡看一下他的年龄,如果超过了他这个年龄应有的水平,我就会问他JSP+Servlet学了吗?很多小伙伴的回答是简单的学了一下,然后,我会给他一个关于JSP+Servlet的实战项目,顺便给他们找一些SSM的项目,并且建议他们首先看这个JSP+Servlet的实战项目。

更有甚者,学了基础之后就开始学习Spring Boot的,当问他们Spring Boot是什么的时候,大致也可以回答出来“约定大于配置”,“用起来很简单”,但是在细究其原理,也是吱吱呜呜,一知半解!如果我们没有经历过Spring最开始繁琐的配置、然后一步步精简,根本体会不到为什么会有Spring Boot这个东西!

不先学习常见的设计模式直接看Spring、MyBatis等源码,简直就是一个找虐的过程!不掌握Servlet原理、基本的Tomcat容器技术上来就看Spring MVC源码同样也是一个打击自信心的好地方!

学习是一个循序渐进的过程,不能急于求成,但也不能过分钻牛角尖!不能再一个技术上停滞不前,也不能如”蜻蜓点水”一般了了掠过!同样,如果你还没有掌握好Servlet和简单的设计模式我建议你先去查阅相关的资料进行系统的学习。

我也相信很多图书或视频等资料都忽略了讲述为什么会有Spring的过程,要么是简单概括并且痛斥EJB的各种弊端,要么就是只字不提,这是一种对读者很不负责任的表现,知史可以明鉴!因此,在进一步学习Spring核心原理之前,我们有必要介绍一下整个Web发展的简单历史,一步步引出为什么会有Spring!

二、Web发展简史

老一辈的软件开发人员一般经历了从Model1到Model2,然后到后来的三层模型,最后到现在的Spring Boot。如果从Model1到Model2说起到我们现在使用的Spring Boot为整个时间轴的话,大致可以分为4个阶段:

(1)初级阶段:使用Model1/Model2/三层模模型进行开发;

(2)中级阶段:使用EJB进行分布式应用开发,忍受重量级框架带来的种种麻烦;

(3)高级阶段:使用Spring春天带给我们的美好,但是还要忍受很多繁琐的配置;

(4)骨灰级阶段:使用Spring Boot,畅享“预定大于配置”带给我们的种种乐趣!

三、Web发展初级阶段

1、Model1开发模式:

Model1的开发模式是:JSP+JavaBean的模式,它的核心是Jsp页面,在这个页面中,Jsp页面负责整合页面和JavaBean(业务逻辑),而且渲染页面,它的基本流程如下:

相信很多小伙伴在刚学习Web的时候,肯定使用到了Model1开发模式,也就是我们的业务代码、持久化代码直接写在Jsp页面里边,使用Jsp直接处理Web浏览器的请求,并使用JavaBean处理业务逻辑。

利用我们现在熟悉的MVC模型的思想去看,虽然编写代码十分容易,但Jsp混淆了MVC模型中的视图层和控制层,高度耦合的结果是Jsp代码十分复杂,后期维护困难!

2、Model2开发模式:

Model1虽然在一定程度上解耦了,但JSP依旧即要负责页面控制,又要负责逻辑处理,职责不单一!此时Model2应运而生,使得各个部分各司其职,Model2是基于MVC模式的。

Model2的开发模式是:Jsp+Servlet+JavaBean的模式,它和Model1不同的是,增加了Servlet,将调用页面数据,调用业务逻辑等工作放到了Servlet中处理,从而减轻了Jsp的工作负担!它的基本流程如下:

Model2开发模式将Servlet的概念引入架构体系中,使用它来分配视图层Jsp的显示页面,同时调用模型层的JavaBean来控制业务逻辑。

3、Model1和Model2的区别:

Model1:简单,适合小型项目的开发,但是Jsp的职责过于繁重,职责分工不明确。在后期的维护工作中,必将为此付出代价!

Model2:相对于Model1来说,职责分工更为明确,在Model1的基础上,抽取了Servlet层,体现了一个分层的思想,适合大型的项目开发!(当时的评判标准是适合大型项目开发的,现在看起来已经过时了!)

Model2看起来已经尽善尽美了,尽管如此,他还不能称之为一个比较完善的MVC设计模式!

4、Model1和Model2与三层的对比:

在Model2中,我们将Servlet抽取出单独的一层,和Jsp协作完成用户数据交互的工作,也就是表示层。那么作为三层结构来说,又做了什么样的改进呢?三层则是在此基础上,将JavaBean再一次进行分割:
业务逻辑、数据持久化
,三层如下:

(1)表示层,JSP/Servlet;


(2)业务逻辑层:业务规则;


(3)持久化层:主要包装持久化的逻辑 ;

各个的耦合性如下图:

Model1、Model2、三层是在解耦的基础上一步步进化而来,通过解耦我们可以进行进一步的抽象,以应对现实需求的变动。

四、Web发展中级阶段、高级阶段和骨灰级阶段

这一小节似乎有点应付,对于中级阶段,因为我没有用过EJB,在这里不敢妄加评论,以免误导大家。但是相信每一位接触过Spring的小伙伴,都应该知道Rod Johnson在2002年编写的《Expert One-to-One J2EE Design and Development》一书,Rod 在本书中对J2EE正统框架臃肿、低效、脱离现实的种种学院派做法提出了质疑,并以此书为指导思想,编写了interface21框架,也就是后来的Spring。

对于高级阶段和骨灰级阶段是我们后期一系列文章的重点,本篇只作为一个阶段划分,不做过多的解释,因此让我们重新回到Web发展的初级阶段。

对EJB有兴趣的可以参考文章:
http://www.uml.org.cn/j2ee/2009112011.asp

五、Web发展初级阶段存在的问题

经历过初级阶段的小伙伴肯定看得懂下边的一个项目结构,一个简单的MVC三层结构,使用JSP+Servlet+MySQL+JDBC技术,面向接口编程:

1、面向接口编程的实例化对象

以用户管理模块为例,有一个UserDao接口,有一个接口的实现类UserDaoImpl,如下:

由于是面向接口编程,因此我们在每次使用UserDao的时候,都要进行实例化一次,实例化代码如下:

UserDao userDao
=
new UserDaoImpl();

我们在每次使用UserDao的时候都需要进行实例化,当然不仅仅有UserDao需要进行实例化,还有很多需要进行实例化的,举例如下:

可以看出,每一个方法中都需要进行实例化我们需要用到的接口的实现类,这就会存在大量的实例化对象,并且他们的生命周期可能就是从方法的调用开始到方法的调用结束为止,加大了GC回收的压力!

2、使用单利模式的一次改进

了解设计模式的可能会想到使用单利模式的方式来解决这个问题,以此来避免大量重复的创建对象,但是我们还要考虑到众多的这种对象的创建都需要改成单利模式的话,是一个耗时耗力的操作。

对于这个系统来说,如果都把这种面向接口的对象实现类转换为单利模式的方式的话,大概也要写十几个或者上百个这种单例模式代码,而对于一个单利模式的写法来说,往往是模板式的代码,以静态内部类的方式实现代理模式如下:

可以看出,这种方式有两个问题:

(1)业务代码与单利模式的模板代码放在一个类里,耦合性较高;


(2)大量重复的单利模式的模板代码;

从上述可以看出,使用的单利模式虽然从性能上有所提高,但是却加重了我们的开发成本。因此只会小规模的使用,例如我们操作JDBC的Utils对象等。

3、我们开发中遇到的痛点

从上述代码的演进过程我们可以看得出来,我们即需要一个单利的对象来避免系统中大量重复对象的创建和销毁,又不想因为使用单利模式造成大量重复无用的模板代码和代码的耦合!

(突然想到一个段子,想和大家分享一下:产品经理在给甲方汇报方案的时候说了两种方案:一种是实用的,一种是美观的,问甲方希望选择哪一种?甲方说:有没有即实用又美观的!)

4、我们还能怎么做

作为学院派的书生来说,我们可能会联想到“数据库连接池”,我们在获取数据库连接的时候会从这个池子中拿到一个连接的,假设这个数据库连接池很特殊,有且只能有N个数据库连接,并且每一个连接对象都不同(假设),那么这个不就相当于每一个连接都是单利的了吗?既可以避免大量对象的创建,也可以实现不会出现大量重复性的模板代码。

因此,这里应该有一个大胆的想法,我们是否可以建立一个池子,将我们的接口实现类对象放入到这个池子中,我们在使用的时候直接从这个池子里边取就行了!

5、这个池子

如果我们要创建这个池子,首先要确定需要把哪些对象放进这个池子,通过怎样的方式放进去,放进去之后如何进行管理,如何进行获取,池子中的每一个对象的生命周期是怎么样的等等这些东西都是我们需要考虑到的!

6、恭喜你

如果你已经了解了上述Web演进的过程,以及我们想要创建的这个池子,那么恭喜你!你已经打开了Spring核心原理的大门了!

上述我们想要创建的池子其实就是Spring容器的雏形,将接口实现类的对象放进池子进行管理的过程其实也是Spring IOC依赖注入、控制反转的雏形!

Spring的依赖注入/控制反转就是从我们的配置文件或注解中的得到我们需要进行注入到Spring容器的实现类的信息,Spring IOC通过这些配置信息创建一个个单利的对象并放入Spring容器中,Spring容器可以看做是一个集合保存着我们的这些对象。

7、小总结

上文中主要从一个切入点探讨了一下为什么有Spring,以及介绍了一下Spring IOC和Spring容器的基本雏形概念,当然还可以从其他方面进行切入。这里没有进一步探讨AOP的概念,对于新入门的小伙伴来说,这个确实有必要讨论一下,也决定在后续文章中由浅入深的探讨一下,而对于老手来说,其实我上边写的基本上是浪费大家时间的!

六、总结

从历史的角度来说,不同时期的大革命在爆发之前,都会有一个蓄谋已久的“导火线”!Spring的出现,同样顺应了历史发展潮流,正式由于那个时期J2EE开发标准的种种弊端造就了Spring的出现!即使不是Spring,同样也会有其他类似的产品出现,只不过历史选择了Spring,Spring顺应了历史!没有切肤之痛,是不会体会到Spring带给我们的乐趣与快感!

同样的,每个时代都会有每一个时代的问题,Spring也是!正如十年前我们的计算机可能带不动一款游戏,今天我们的计算机也有可能带不动一款如今的游戏,同样十年后的计算机也会有一款他带不动的游戏出现!以一种发展的眼光去看Spring,就可以很好的理解Spring Boot是以一种什么样的角色出现在我们的面前了!

时代选择了Spring,同样Spring也被这个时代所选择着!你我只有不停的进步,不停地学习才能跟上这个时代!

Spring历史版本变迁和如今的生态帝国

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bntX2jSQfEHy7/article/details/78918119

前两篇:

为什么要有Spring?

为什么要有Spring AOP?

前两篇从Web开发史的角度介绍了我们在开发的时候遇到的一个个坑,然后一步步衍生出Spring Ioc和Spring AOP的概念雏形。Spring从2004年第一个正式版1.0 Final Released发展至今,俨然已经成为了一个生态帝国(开局只有一把枪,装备全靠打!),目前也已经迭代到5.0,拥有诸多的子项目,基本可以解决绝大多数场景的应用!

而在进一步学习Spring的核心原理之前,有必要和大家一起梳理一下Spring历史版本的变迁,知晓一下每一个版本新增了哪些东西,解决了哪些我们开发中的问题,以便我们更清楚的理解这个生态帝国是如何一步一发展壮大的!


一、Spring历史版本变迁

1、Spring 1.x

大概在2004年3月24日这一天,Spring Framework 1.0 final正式出现在我们的视野中,源码项目结构如下:

?wxfrom=5&wx_lazy=1

引用依赖如下:

UtWdDgynLdaPKnv354IwEnswfT8aSZfoUmZFCibSJ1nznx5ibRv0lTkDjVOtpZnibEmjjM3II81ticIjaMmPTTcsZg

Spring 1.0当时只包含一个完整的项目,他把所有的功能都集中在一个项目中,其中包含了核心的Ioc、AOP,同时也包含了其他的诸多功能,例如:JDBC、Mail、ORM、事务、定时任务、Spring MVC等。

由于Spring超前的眼光和博大的精神,在第一个版本的时候已经支持了很多第三方的框架,例如:Hibernate、ibatis、模板引擎等。

尽管如此,此时的Spring除了最核心的Ioc和AOP之外,其他的模块犹如我们现在众多的开源项目一样,大多是对第三方框架的简单封装!我也相信很多个人或企业也基本都维护了一套类似这种的框架供项目开发使用。

此时的Spring还很懵懂,只支持基于XML的配置!关于更多关于Spring 1.0 的信息可以参考:

https://spring.io/blog/2004/03/24/spring-framework-1-0-final-released

2、Spring 2.x

Spring 2.x的源码项目结构如下:

UtWdDgynLdaPKnv354IwEnswfT8aSZfo53Xia5n7cqf1YFHuxGf69d3AHoVf3BZTL0hBl8yw2ic29yqic4Bm8jzug

引用依赖如下:

UtWdDgynLdaPKnv354IwEnswfT8aSZfokgAG4D82Zickm41oyoY4hnMzWquCA37WtQWuic5WoQSkia6DxxVaWYsBw

通过上图中和1.0版本的对比,我们首先可以很直观的感受到Spring做了哪些改变。

Spring 2.x增加对注解的支持,支持了基于注解的配置。

3、Spring 3.x

Spring在GitHub托管的代码,最早的版本只能看到Spring v3.1.0.M2(
https://github.com/spring-projects/spring-framework
),源码结构如下:

UtWdDgynLdaPKnv354IwEnswfT8aSZfoXeRXNIXhbwNILIOqao6MWAj1KXzVWk2oF3kH9ojI7NvzqJCic00pwfQ

Spring 3.x支持了基于Java类的配置。

4、Spring 4.x

UtWdDgynLdaPKnv354IwEnswfT8aSZfoHnbPPicd5hrPmG0CHNNxlQWByYeugSwse4UfSZ0aict05obibBstJKfuw

(1)Spring 4.x新特性:

Spring 4.x全面支持Java 8.0,支持Lambda表达式的使用,提供了对@Scheduled和@PropertySource重复注解的支持,提供了空指针终结者Optional,对核心容器进行增加:支持泛型的依赖注入、Map的依赖注入、Lazy延迟依赖的注入、List注入、Condition条件注解注入、对CGLib动态代理类进行了增强。

Spring 4.x还支持了基于Groovy DSL的配置,提高Bean配置的灵活性。

Spring 4.x开始,Spring MVC基于Servlet 3.0 开发,并且为了方便Restful开发,引入了新的RestController注解器注解,同时还增加了一个AsyncRestTemplate支持Rest客户端的异步无阻塞请求。

(2)简单的思维导图如下:

UtWdDgynLdaPKnv354IwEnswfT8aSZfoT86ZW0iccZMwibsIc5njiahA5lEAaLy63sCzoQcLEguvZpvUs8oIBj92g

5、Spring 5.x

UtWdDgynLdaPKnv354IwEnswfT8aSZforLpWR1ic6Nyruble89ibD0oXK1GVzGyAu0lf9iaZOgmQ6TzFRubAT7FFw

Spring 5.x主要新特性:

UtWdDgynLdaPKnv354IwEnswfT8aSZfoibBicSVU6j4ICgm4QHGVmMJw9aSlLwkBic1B7WAHoiawibEEarZGWGdkyeA

6、小结

Spring 1.x、Spring 2.x、Spring 3.x由于版本比较久,而我从开始就是从Spring 4.0 开始用的,所以更多关于以前版本的信息这里解释的不是很全,上述的源码截图只是作为一种直观地感受,希望能感受到Spring版本的变迁过程。


二、Spring如今的生态帝国

Spring从最初的一城一池,发展到如今已经发展为一个生态帝国,旗下拥有诸多的子项目,从最基本的Spring Ioc/AOP使用,到安全管理,再到大数据,Spring已经逐渐的渗入到各个领域。目前,几乎所有JavaWeb相关的开发都可以在Spring中找到合适的方案,为了在开发的时候,防止重造轮子,下边梳理一下Spring的各个子项目,做到心中有数:

UtWdDgynLdaPKnv354IwEnswfT8aSZfo0icKp7nJHfqpCtPpwN5YUo0iaW5LsE2DHHr03nEAxSHJTV0Q1jGBHQuA

参考文章:

1、《精通Spring 4.x企业应用开发实战》