Spring
1、 简介
Spring 是一款主流的 Java EE 轻量级开源框架 ,Spring 由“Spring 之父”Rod Johnson 提出并创立,其目的是用于简化 Java 企业级应用的开发难度和开发周期。
具体来说Spring是轻量级的IoC(Inverse Of Control:控制反转)和AOP(Aspect Oriented Programming:面向切面编程)的容器框架。Spring之所以成功就是来源于这2个核心理念,而非技术,IoC是其核心,而AOP是重要的功能。
它提供了表现层SpringMVC和持久层Spring JDBCTemplate以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库,所以逐渐称为Java最成功的的框架。
- 控制反转IoC:Spring通过一种称作控制反转(IoC)的技术促进了松耦合。将以往使用new创建对象的方式,变成Spring提供容器创建对象,然后进行依赖注入。核心思想就是面向接口编程。
- 面向切面AOP:它将日志、安全、事务管理等与业务无关,却为业务模块所共同调用的逻辑封装起来,理解成一个切面,然后将其动态的插入到业务逻辑中,使业务逻辑能方便的使用切面提供的服务。
- 容器:Spring提供了容器的功能,用来管理对象的声明周期,以及对象之间的依赖关系。(XML文件中定义好对象的名字,设置单例或者原型模式,还有以其他对象的依赖关系,这样在容器启动时这些对象就自动实例化,直接使用。)
- 依赖注入DI:就是对象之间依赖关系的实现,一般有构造注入、setter方法注入。
- 一站式:Spring可以在IOC和AOP的基础上整个其他开源框架或第三方的类库。
时至今日,Spring已经不单单是一项单纯的应用框架技术了,而是已经成发展成了以Spring Framework为基础的一个大家族了,例如 Spring Framework、Spring MVC、SpringBoot、Spring Cloud、Spring Data、Spring Security 等,其中 Spring Framework 是其他子项目的基础。这些项目现如今已经涵盖了大多数的领域。
2、发展
-
创始人:Rod Johnson(畅销书:Expert One-on-One J2EE Design and Development(2002年出版)、Expert One-on-One J2EE Development without EJB(2004年出版)(Spring的雏形) )
-
目的:最大的目的就是使JavaEE开发更加容易,是为了解决企业应用开发的复杂性而创建的。
-
历程
- J2EE刚开始使用EJB开发,但是学习EJB的高昂代价,和极低的开发效率,极高的资源消耗,都造成了EJB的使用困难。
- 2002年,Rod Jahnson所著的一本很有影响力的书籍《Expert One-on-One J2EE Design and Development》,书中第一次出现了Spring的一些核心思想,2004年《Expert One-on-One J2EE Development without EJB》,更进一步阐述了在不使用EJB开发JAVA EE企业级应用的一些设计思想和具体的做法。
- Spring以interface21框架为基础,于2004年3月24日发布1.0正式版本。
-
理念:Spring致力于提供一个以统一的、高效的方式构造整个应用,并且可以将单层框架以最佳的组合揉和在一起建立一个连贯的体系。Spring不和现有的解决方案竞争,而是致力于将它们融合在一起。
-
Spring版本
- Spring1.x正式版发布于2004年3月
- Spring2.x正式版发布于2006年10月,
- Spring 3.x正式版发布于2009年12月
- Spring 4.x正式版发布于2013 年,开始支持JDK8,支持Lambda表达式的使用
- Spring 5.x正式版发布于2017 年
- Spring 6正式版发布于2022 年,Spring 将 Spring 6.0 称为下一个十年的新开端,直接舍弃了以往版本的 JDK,强制升级到 JDK 17及以上。
-
SSM框架:由Spring+SpringMVC+Mybatis组成
-
Spring家族:以Spring Framework 为基础的众多组件:Spring Framework、Spring MVC、SpringBoot、Spring Cloud、Spring Data、Spring Security 等等
3、优势
- 方便解耦,简化开发:我们把项目对象的创建权给Spring完成,这样在获取对象是就不需要直接去new,只要去找Spring容器就可以了。在业务层到dao层不需要去new对象,只需要去IoC容器去找相应的对象即可
- AOP编程支持:通过AOP功能方便进行面向切片编程。
- 声明事务支持:可以通过配置的方式快速配置方法,进行自动的事务控制,方便程序的开发,大大加快了开发效率。
- 方便程序测试:整合了JUnit方便进行代码的测试
- 方便集成各种优秀框架:Stuts、Hibernate、Hessian、Quartz等等各种框架。Spring不和现有的解决方案竞争,而是致力于将它们融合在一起。
- 降低JavaEE API使用难度:Spring对API进行了简单的封装,方便使用。
4、体系结构
- Core Container:核心容器,提供了Spring的基本功能
- Spring-Beans:提供了BeanFactory,工厂模式的实现,用于对象bean的管理和创建。IoC和DI功能
- Spring-Core:核心模块,封装了资源访问、类型转换及一些常用工具类。
- Spring-Context:上下文模块,在核心模块之上是访问定义配置的所有对象的媒介。对BeanFactory的功能进行扩展,提供了ApplicationContext接口。
- Spring-SpEL::3.0后新增模块,提供了EL语言的支持。
- Data Access/Integration:数据访问\集成层
- JDBC:数据库连接,提供了JDBC抽象层,减少了对数据库的操作编码
- ORM:提供了“对象-关系”映射框架无缝集成的 API,包括 JPA、JDO、Hibernate 和 MyBatis 等。
- OXM:提供了支持对象/XML映射的抽象层实现
- JMS:Java消息传递服务
- Transactions:支持对实现特殊接口以及所以POJO类的编程和声明式的事务管理。
- Web
- Web:针对web开发的集成特性
- Servlet:Spring-webmvc模块。
- WebSocket:4.0后新增,提供了WebSocket和SockJS的实现和对STOMP的支持。
- Protlet:提供了Protlet环境下的MVC实现
- AOP:面向切面的支持
- Aspects:AspectJ的集成
- Test:单元测试和集成测试
- Instrumentation:类工具的支持和类加载器的实现
- Messaging:4.0新增,消息传递体系结构和协议
5、创建Spring项目
-
创建Spring父模,创建后删除src文件
-
创建子模块:NEW MODULE
-
查看pom文件
-
在pom文件中添加依赖(在父模块的依赖,所有子模块都可以使用。在子模块的依赖只能子模块使用)
需要注意版本,spring6是最新版本,它需要JDK17以上版本才能使用,且其中的 javax开头的API 全部被 jakarta 代替了
<dependencies> <!-- Spring 核心依赖 需要选择一个版本 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.21</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>6.0.3</version> </dependency> <!-- Spring test测试 需要选择一个版本--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.3.21</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>6.0.3</version> </dependency> <!--junit5和4 选择一个使用--> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.9.1</version> <scope>test</scope> </dependency> <!-- junit4的依赖 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> </dependencies>
-
编写类进行测试
public class HelloJava { public void test(){ System.out.println("Hello Java"); } }
-
将类放入到IOC的容器中,让Spring容器管理类的创建(需要创建一个XML文件,放到上下文路径中)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 这个就是将HelloJava这个类放入IOC容器中进行管理,id是对象名,class是类的位置--> <bean id="helloJava" class="com.yu.test.HelloJava"/> </beans>
-
获取类
@Test public void test(){ //加载XML文件 ApplicationContext context = new ClassPathXmlApplicationContext("springbeans.xml"); //从上下文中获取到IOC管理的Bean对象 HelloJava helloJava = (HelloJava) context.getBean("helloJava"); helloJava.test(); }
18、Spring6
Spring Framework 6.0 于2022年发布,它是Spring一个重大的更新,它直接舍弃了以往的JDK不再兼容,而是直接要求选用JDK17及以上版本。
Spring6.0已迁移到 Jakarta EE 9+,由 API 的命名空间由 jakarta
取代了以前的 javax (如:javax.servlet-api 变成了如今的 jakarta.servlet-api。由 jakarta 取代 javax。)。
公告称,不要停留在 Java EE 8 上,建议跃升到 jakarta 命名空间,最好直接跳到 Jakarta EE 10 level。而即将发布的 Spring Boot 3.0.0 版本将包含相应的托管依赖项。
同时由于 JavaEE的迁移,其 Servlet 中间件也要进行升级,Spring Framework 6.0 支持最新 Web 容器,如 Tomcat 10 / Jetty 11,以及最新的持久性框架 Hibernate ORM 。其中一些基于Servlet的组件也被移除,如:Commons FileUpload 上传组件。同时FreeMarker、JSP也停止了支持,转而把精力放在了基于Restful的Web架构。
而在SpringMVC的Controller上也有一些变动,现在Spring MVC和Spring WebFlux将不再将类上单独有直接@RequestMapping的Spring Bean视为控制器。在6.0之后默认情况下必须有@Controller或@RestController注解才可以被视为控制器。