Spring入门
简介
Spring是什么
一个分层的JavaSE/EE full-stack(一站式)轻量级开源框架,以IoC和AOP为核心,提供了表现层Spring MVC 和持久层Spring JDBC以及业务层事务管理等众多的企业级应用技术。
为什么学习Spring
- 方便解耦,简化开发
通过Spring提供的Ioc容器, 将对象之间的依赖关系交由Spring进行控制,避免硬编码造成的程序耦合。有了Spring,用户不必再为单实例模式类、属性文件解析等这些底层的需求编写代码,可以更专注于上层的应用。
- AOP编程的支持
通过Spring提供的AOP功能,方便进行面向切面编程,需要不容易用传统OOP实现的功能可以通过AOP轻松实现。
- 声明式事务的支持
在Spring中,我们可以从单调的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量。
- 方便程序的测试
可以用非容器依赖的编程方式进行几乎所有的测试工作,在Spring中,测试不再是昂贵的操作,而是随手可做的事,例如Spring对Junit4支持,可以通过注解方便的测试Spring程序。
- 方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,相反,Spring可以降低各种框架的使用难度。
- 降低Java EE API的使用难度
Spring对很多难的Java EE API(入JDBC、JavaMail、远程调用等)提供了一个薄薄的封装,通过Spring的简易封装,这些JavaEE API的使用难度大大降低。
- Java源码是经典学习案例
Spring源码设计精妙,结构清晰,匠心独运,处处体现大师对Java设计模式灵活运用以及对Java技术的高深造诣,Spring框架源码无疑是Java技术的最佳实践。如果想短时间提高自己的Java技术水平和应用开发水平,学习和研究Spring源码将会使你收到意想不到的效果。
Spring的体系结构
Spring的体系结构
Spring核心概念
- IoC
Inverse of Control,控制反转。对象的创建权力由程序反转给Spring框架。
- DI
Dependency Injection,依赖注入,在Spring框架创建Bean对象时,动态的将依赖对象注入到Bean组件中。
- AOP
Aspect Oriented Programming,面向切面编程。在不修改目标对象的源代码情况下,增强IoC容器中Bean的功能。
- Spring容器
指的就是IoC容器,底层就是一个BeanFactory。
Spring的模块
核心模块
- core
每个Spring应用程序都需要的主要模块。
- beans
该模块包含了所有支持Spring对Spring bean进行操作的类,例如Ioc和DI等,BeanFactory是该模块的核心接口。
- context
扩展了BeanFactory,ApplicationContext是该模块的核心。
- expression
该模块包含Spring Expression Language(SpEL)的所有支持类
AOP和设备支持
- aop
AOP主要的实现模块,以动态代理技术为基础。
- aspects
spring-aspects模块集成自AspectJ,主要为SpringAOP提供多种AOP实现方法。
- instrument
算是AOP的一个支援模块,主要作用是在JVM启动时,生成一个代理类,程序员通过代理类在运行时修改类的字节,从而改变一个类的功能,实现AOP功能。
数据访问及集成
- jdbc
该模块包含所有的JDBC支持类。对于需要数据库访问的所有应用程序,都需要该模块。支持数据源、 JDBC数据类型、 JDBC模板、本地 JDBC 连接等的类都被被包在此模块中
- tx
该模块提供支持Spring事务基础架构的所有类,可以从事务抽象层找到相应的类来支持Java Transaction APl(JTA)以及与主要供应商的应用程序服务器的集成
- orm
该模块扩展了Spring的标准JDBC功能集,支持流行的ORM工具,包括Hibernate、JDO、JP和数据映射器iBATIS。该JAR 文件中的许多类都依赖于Spring jdbc JAR 文件中所包含的类, 因此也需要把它包含在应用程序中
- jms
该模块包含JMS支持的所有类
- oxm
主要提供一个抽象层以支持OXM,OXM是Object-to-XML-Mapping的缩写,将java对象映射成XML数据,或将XML数据映射成java对象。
Web
- web
此模块包含在 Web 应用程序中使用 Spring 所需的核心类,包括用于自动加载ApplicationContext 功能的类、文件上传支持类以及一些用于执行重复任务的类
- web-mvc
SpringMVC核心模块
- webfsocket
该模块提供对JSR-356(WebSocke Java API) 的支持
- webflux
新的非堵塞函数式ReactiveWeb框架,可以用来建立异步的、非阻塞、事件驱动的服务,并且扩展性非常好
报文发送
- messaging
为Spring集成一些基础的报文发送的功能。
Test测试
- test
Spring提供一组模拟类来帮助测试应用程序,并且许多模拟类都在Spring测试套件中使用,所以它们都经过了很好的测试,从而使测试应用程序变得更简单,在对 Web 应用程序进行单元测试时会发现模拟
HttpServletRequest和HttpSevletResponse类所带来的好处,另一方面Spring提供了与JUnit单元测试框架的紧密集成,并且在该模块中提供了许多支持JUnit 测试用例开发的类:例如 SpringJUnit4ClassRunner提供了一种在单元测试环境中Spring ApplicationContext的简单方法
其他模块
- beans-groovy
该模块包含支持Spring对Spring bean进行操作额Groovy类
- context-support
该模块包含对spring-context 快的进一步扩展, 在用户界面方面,有一些用于支持邮件并与模板引擎(例如 Velocity, FreeMarker和JasperReport)集成的类 , 此外,还包括与各种任务执行和调度库(包括 CommonJ和Quartz)的集成。
入门案例
我们这里使用Spring 5.2.1这个版本
核心依赖
<dependencies>
<!--Spring的三个核心依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.1.RELEASE</version>
</dependency>
</dependencies>
创建类
package com._54programer.service;
public class UserService {
public void getUser(){
System.out.println("getUser ....");
}
}
配置文件
参考官方文档新建resources/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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userService" class="com._54programer.service.UserService"></bean>
</beans>
测试
//1.使用ApplicationContext接口获取Spring容器
ApplicationContext app = new ClassPathXmlApplicationContext("spring.xml");
//2.根据bean的id获取对象
UserService userService = (UserService) app.getBean("userService");
userService.getUser();
通过测试我们发现确实可以通过Spring容器获取我们要的Bean对象。