<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path> </svg>
讯享网
- 一、介绍
- 模块划分
- 1. Data Access/Integration(数据访问/集成)
- 2. Web 模块
- 3. Core Container(Spring 的核心容器)
- 4. AOP、Aspects、Instrumentation 和 Messaging
- 5. Test 模块
- spring核心
- Spring Framework 的特点
- 模块划分
- 二、项目构建
- 快速开始
- 三、IOC 容器
- IOC bean管理(基于xml)
- xml创建bean
- xml 方式注入属性
- bean 作用域
- bean 生命周期
- bean自动注入
- IOC bean管理(基于注解)
- 注解创建bean
- 注解自动注入
- IOC bean管理(基于xml)
- 四、AOP
- 概念
- 动态代理实现
- jdk动态代理
- CGLib动态代理
- AOP术语
- 代码实现AOP
- 五、单元测试
- junit4
- junit5
- 六、整合JDBC
- 七、事务
- 八、springMVC
- SpringMVC简介
- MVC介绍
- SpringMVC
- 快速开始
- SpringMVC执行流程
- SpringMVC常用组件
- DispatcherServlet初始化过程
- SpringMVC的执行流程
- SpringMVC简介
Spring 是一款目前主流的 Java EE(Java Platform,Enterprise Edition)) 轻量级开源框架。
模块划分
Spring 框架基本涵盖了企业级应用开发的各个方面,它包含了 20 多个不同的模块。
1. Data Access/Integration(数据访问/集成)
数据访问/集成层包括 JDBC、ORM、OXM、JMS 和 Transactions 模块,具体介绍如下。
- JDBC 模块:提供了一个 JBDC 的样例模板,使用这些模板能消除传统冗长的 JDBC 编码还有必须的事务控制,而且能享受到 Spring 管理事务的好处。
- ORM 模块:提供与流行的“对象-关系”映射框架无缝集成的 API,包括 JPA、JDO、Hibernate 和 MyBatis 等。而且还可以使用 Spring 事务管理,无需额外控制事务。
- OXM 模块:提供了一个支持 Object /XML 映射的抽象层实现,如 JAXB、Castor、XMLBeans、JiBX 和 XStream。将 Java 对象映射成 XML 数据,或者将XML 数据映射成 Java 对象。
- JMS 模块:指 Java 消息服务,提供一套 “消息生产者、消息消费者”模板用于更加简单的使用 JMS,JMS 用于用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
- Transactions 事务模块:支持编程和声明式事务管理。
2. Web 模块
Spring 的 Web 层包括 Web、Servlet、WebSocket 和 Portlet 组件,具体介绍如下。
- Web 模块:提供了基本的 Web 开发集成特性,例如多文件上传功能、使用的 Servlet 监听器的 IOC 容器初始化以及 Web 应用上下文。
- Servlet 模块:提供了一个 Spring MVC Web 框架实现。Spring MVC 框架提供了基于注解的请求资源注入、更简单的数据绑定、数据验证等及一套非常易用的 JSP 标签,完全无缝与 Spring 其他技术协作。
- WebSocket 模块:提供了简单的接口,用户只要实现响应的接口就可以快速的搭建 WebSocket Server,从而实现双向通讯。
- Portlet 模块:提供了在 Portlet 环境中使用 MVC 实现,类似 Web-Servlet 模块的功能。
3. Core Container(Spring 的核心容器)
Spring 的核心容器是其他模块建立的基础,由 Beans 模块、Core 核心模块、Context 上下文模块和 SpEL 表达式语言模块组成,没有这些核心容器,也不可能有 AOP、Web 等上层的功能。具体介绍如下。
- Beans 模块:该模块是Bean工厂与bean的装配。
- Core 核心模块:是依赖注入IoC与DI的最基本实现。
- Context 上下文模块:建立在 Core 和 Beans 模块的基础之上,集成 Beans 模块功能并添加资源绑定、数据验证、国际化、Java EE 支持、容器生命周期、事件传播等。ApplicationContext 接口是上下文模块的焦点。
- SpEL(Spring Expression Language ,Spring表达式语言) 模块:提供了强大的表达式语言支持,支持访问和修改属性值,方法调用,支持访问及修改数组、容器和索引器,命名变量,支持算数和逻辑运算,支持从 Spring 容器获取 Bean,它也支持列表投影、选择和一般的列表聚合等。比如用@value(#{…})注解时,#{…}就属于SpEL的一种语法。
4. AOP、Aspects、Instrumentation 和 Messaging
在 Core Container 之上是 AOP、Aspects 等模块,具体介绍如下:
- AOP 模块:提供了面向切面编程实现,提供比如日志记录、权限控制、性能统计等通用功能和业务逻辑分离的技术,并且能动态的把这些功能添加到需要的代码中,这样各司其职,降低业务逻辑和通用功能的耦合。
- Aspects 模块:提供与 AspectJ 的集成,是一个功能强大且成熟的面向切面编程(AOP)框架。
- Instrumentation 模块:提供了类工具的支持和类加载器的实现,可以在特定的应用服务器中使用。
- messaging 模块:Spring 4.0 以后新增了消息(Spring-messaging)模块,该模块提供了对消息传递体系结构和协议的支持。
5. Test 模块
Test 模块:Spring 支持 Junit 和 TestNG 测试框架,而且还额外提供了一些基于 Spring 的测试功能,比如在测试 Web 框架时,模拟 Http 请求的功能。
spring核心
Spring的最核心部分是控制反转(IoC)和面向切面编程(AOP)。
IOC(Inversion of Control 控制反转) 或DI (Dependency Injection依赖注入)
- IOC (控制反转):说简单点就是当我们使用对象调用一个方法或者类时,不再由我们主动去创建这个类的对象,控制权交给spring框架。说复杂点就是资源(组件)不再由使用资源双方进行管理,而是由不使用资源的第三方统一管理,这样带来的好处。第一,资源的集中管理,实现资源的可配置和易管理。第二,降低了使用资源双方的依赖程度,也就是我们说的耦合度
- DI (依赖注入):由spring框架主动创建被调用类的对象,然后把这个对象注入到我们自己的类中,使得我们可以直接使用它。
AOP(Aspect Oriented Programming面向切面编程)
- AOP:说简单点就是我们可以在不修改源代码的情况下,对程序的方法进行增强。说复杂点就是将涉及多业务流程的通用功能抽取并单独封装,形成独立的切面,在合适的时机将这些切面横向切入到业务流程指定的位置中。即系统级的服务从代码中解耦出来。例如:将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来。允许你把遍布应用各处的功能分离出来形成可重用组件。提高程序的可重用性,同时提高了开发的效率。
IoC 和 DI实质上它们二者是一样的,控制反转(IOC)和依赖注入(DI)是从不同的角度的描述的同一件事情。
Spring Framework 的特点
- 方便解耦,简化开发
Spring 就是一个大工厂,可以将所有对象的创建和依赖关系的维护交给 Spring 管理。
- 方便集成各种优秀框架
Spring 不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如 Struts2、Hibernate、MyBatis 等)的直接支持。
- 降低 Java EE API 的使用难度
Spring 对 Java EE 开发中非常难用的一些 API(JDBC、JavaMail、远程调用等)都提供了封装,使这些 API 应用的难度大大降低。
- 方便程序的测试
Spring 支持 JUnit4,可以通过注解方便地测试 Spring 程序。
- AOP 编程的支持
Spring 提供面向切面编程,可以方便地实现对程序进行权限拦截和运行监控等功能。
- 声明式事务的支持
只需要通过配置就可以完成对事务的管理,而无须手动编程。
快速开始
这里采用maven的方式引入jar包
讯享网
创建实体
创建bean.xml
讯享网
测试
Spring 提供 IOC 容器实现两种方式:
- BeanFactory:IOC 容器基本实现,是 Spring 内部的使用接口,不提供开发人员进行使用,加载配置文件时候不会创建对象,在获取对象(使用)才去创建对象。
- ApplicationContext:BeanFactory 接口的子接口,提供更多更强大的功能,一般由开发人员进行使用,加载配置文件时候就会把在配置文件对象进行创建

通过ApplicationContext 的继承关系可以看到,它有多个实现类,我们通过不同的实现类去创建ioc容器,这里用的是ClassPathXmlApplicationContext。BeanFactory同理。
ioc底层原理:xml 解析、工厂模式、反射。解析xml配置文件利用反射创建对象,加入到工厂类中。加入的时候是object,取出来的时候转成对应对象,所以为什么context.getBean(“user”, User.class)要指定返回类型。
IOC bean管理(基于xml)
xml创建bean
讯享网
在 spring 配置文件中,使用 bean 标签,标签里面添加对应属性,就可以实现对象创建
在 bean 标签有很多属性,介绍常用的属性
- id 属性:唯一标识,对应容器中bean的name
- class 属性:类全路径(包类路径)
创建对象时候,默认也是执行无参数构造方法完成对象创建
xml 方式注入属性
- set注入:使用 set 方法进行注入,对象中应有对应字段set方法。
- 构造注入:属性对应有参数构造方法,对象中应有对应字段的有参构造。
讯享网
也可将value属性改成ref,值可以改成其他bean的id。这样就可以将其他对象当做属性注入
bean 作用域
在 Spring 里面,默认情况下,bean 是单实例对象

可以通过scope属性设置
scope=“prototype”,设置bean为多实例

scope 属性值 默认singleton,表示是单实例对象,加载 spring 配置文件时候就会创建单实例对象。
设置 scope 值是 prototype 时候,不是在加载 spring 配置文件时候创建 对象,在调用
getBean 方法时候创建多实例对象
目前Spring Bean的作用域或者说范围主要有五种:
- singleton: 在spring IoC容器仅存在一个Bean实例,Bean以单例方式存在,bean作用域范围的默认值。
- prototype: 每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行newXxxBean()。
- request:每次HTTP请求都会创建一个新的Bean,该作用域仅适用于web的Spring WebApplicationContext环境。
- session:同一个HTTP Session共享一个Bean,不同Session使用不同的Bean。该作用域仅适用于web的Spring WebApplicationContext环境。
- application:限定一个Bean的作用域为ServletContext的生命周期。该作用域仅适用于web的Spring WebApplicationContext环境。
注:在业务中如果需要controller单例,service多例,仅在service方法上使用@Scope(value = “prototype”)是没用的,因为controller它的属性service只会设置一次值。需要在@Scope中加入proxyMode属性,指定代理模式,这样controller每次调用service都是新的。或者直接从容器中拿service。
bean 生命周期
- 通过构造器创造实例
- 给bean设置属性值(set注入就是调用set方法,如果只有构造注入就在第一步就会设置属性值)
- 调用前置处理方法(创建前置处理器)
- 调用初始化方法(需要配置初始化方法)
- 调用后置处理方法(需要创建后置处理器)
- 使用bean
- 容器关闭时调用摧毁的方法(需要配置摧毁方法)
通过init-method、destroy-method属性指定初始化,和摧毁方法。方法名字任意
讯享网
前置和后置处理方法其实是创建一个拦截器。创建对象实现BeanPostProcessor
再通过xml方式注入容器
讯享网
验证生命周期

bean的生命周期更具体的话还要看有哪些拦截器,实现了哪些接口。基本的步骤就上面提到的那几步。
bean自动注入
根据指定装配规则(属性名称或者属性类型),Spring 自动将匹配的属性值进行注入。
- autowire=“byType” 在容器中找到类型相同的bean注入到属性,如果找到多个会报错。
- autowire=“byName”
讯享网
在容器中找到名称和对应属性set方法名set后面单词第一个字母转小写的bean注入。例如属性名称叫book , set方法是setBook1,那么会去找名字叫book1的bean。
IOC bean管理(基于注解)
注解创建bean
Spring 针对 Bean 管理中创建对象提供注解:
- @Component
- @Service
- @Controller
- @Repository
上面四个注解功能是一样的,都可以用来创建 bean 实例
使用xml方式开启配置扫描
注意这里的命令空间新加了内容
推荐用配置类开启配置扫描
讯享网
获取容器的方式也改变
这样我们在basePackages指定包下使用Component等注解的类都会加入到容器
讯享网
容器中bean的名字就是类名小写,也可以用注解的value属性指定名字。
注解自动注入
@Autowired是先根据类型取容器中找bean,如果找到多个就会再按名字找。
@Autowired可以放到属性上,也可以放到set方法上,也可以放到构造方法上。放到不同的地方效果不一样,比如放到属性上注入的时候不会执行set方法。并且放在不同的地方,如果容器中有多个类型的bean时,这时它会根据名字去寻找,而名字跟放在哪个位置有关。放在属性上就是属性的名称,放在set方法上就是方法参数的名称,放在构造方法上就是和构造参数名称。
所以如果有多个类型时,最好搭配@Qualifier注解指定需要注入的bean名称.
讯享网
@Resource注解是先根据名称去容器中找bean,找到了就不用再按类型找了,如果如果没找到再按类型。它也可以放在放到属性上,也可以放到set方法上。但是不能放构造方法上。它根据名字去寻找,名字也跟放在哪个位置有关。放在属性上就是属性的名称,放在set方法上就是方法参数的名称。
它可以直接在注解里面指定要注入的名称,相当于Autowire加Qualifier。
Autowire注解是spring的,Resource是属于jdk的注解。
概念
AOP(Aspect Oriented Programming )是面向切面编程,是OOP(面向对象编程)的延续,也是Spring框架中的一个重要内容,是函数式编程的一种衍生泛型。简单的说他就是把我们程序重复的代码抽取出来,在需要执行的时候使用动态代理技术在不修改源码的基础上,对我们的已有方法进行增强。
动态代理就是,在程序运行期,创建目标对象的代理对象,并对目标对象中的方法进行功能性增强的一种技术。在生成代理对象的过程中,目标对象不变,代理对象中的方法是目标对象方法的增强方法。
动态代理实现
常见的动态代理方式有JDK动态代理、CGLib动态代理。
jdk动态代理
JDK 动态代理类需要实现反射包中的 java.lang.reflect.InvocationHandler 接口,通过实现InvocationHandler接口创建自己的调用处理器。通过为Proxy类指定ClassLoader对象和一组interface来创建动态代理。通过反射机制获取动态代理类的构造函数,其唯一参数类型就是调用处理器接口类型;通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数传入。
讯享网

CGLib动态代理
利用ASM开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。

JDK动态代理是面向接口的。CGLib动态代理是通过字节码底层继承要代理类来实现,因此如果被代理类被final关键字所修饰,会失败。
在spring中如果要被代理的对象是个实现类,那么Spring会使用JDK动态代理来完成操作(Spirng默认采用JDK动态代理实现机制)。如果要被代理的对象不是个实现类,Spring会强制使用CGLib来实现动态代理。
AOP术语
- 增强
需要额外增加的逻辑部分叫增强
- 连接点
哪些类的哪些方法可以被增强的地方叫连接点
- 切点
实际被增强的地方叫切点
- 切面
指什么时候干什么事,即某个切点有什么增强
- 织入

将增强放到切点的过程
代码实现AOP
导入依赖aspects
讯享网
设置增强类加入容器并增加@Aspect注解
有多个增强类时,在增强类上面添加注解 @Order(数字类型值),数字类型值越小优先级越高
切入点表达式execution(访问类型 返回类型 包.类.方法(参数)),可以指定某个注解处切入@Before(“@annotation(com.tb.annotation.SysLog)”) 括号里面是注解类路径。
execution(public * com.tb.bean.*.add(…)):表示在com.tb.bean包下任意类的所有访问类型为public、返回值为任意、参数类型不限的add方法切入增强。
如果是配置文件开启aspect功能,必须加入<aop:aspectj-autoproxy></aop:aspectj-autoproxy>,注意这里根标签要加aop的命名空间,schemaLocation也要加上对应的值。
讯享网
调用被切入的方法会执行对应的通知

使用配置类的方式只需要在配置类上增加@EnableAspectJAutoProxy(proxyTargetClass = true)
同样可以实现aop功能

junit4
如果要自动注入,那么就要引入@ContextConfiguration(),可以指定配置类,也可以指定配置文件。
讯享网
配置文件方式:@ContextConfiguration(“classpath:bean1.xml”)
junit5
导入依赖
注意import时是junit5的jupiter包
讯享网
使用配置类就用@ContextConfiguration(classes = { SpringConfig.class }, loader = AnnotationConfigContextLoader.class)
也可以用一个注解代替@SpringJUnitConfig
导入相关依赖
讯享网
xml方式引入JdbcTemplate ,并以druid作为数据源

配置类方式引入,只需在配置类中加入以下两个方法即可。
讯享网

xml方式开启事务,注意要加tx命名空间和schemaLocation中的值。
在方法上或类上添加@Transactional注解后,方法中报错事务会回滚。

配置类方式开启事务只需在配置类中加一个方法,能达到同样的效果。
讯享网
SpringMVC简介
MVC介绍
MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分。
- M:Model,模型层,指工程中的JavaBean,作用是处理数据
- V:View,视图层,指工程中的html或jsp等页面,作用是与用户进行交互,展示数据
- C:Controller,控制层,指工程中的servlet,作用是接收请求和响应浏览器
MVC的工作流程: 用户通过视图层发送请求到服务器,在服务器中请求被Controller接收,Controller
调用相应的Model层处理请求,处理完毕将结果返回到Controller,Controller再根据请求处理的结果
找到相应的View视图,渲染数据后最终响应给浏览器。
SpringMVC
SpringMVC是Spring的一个后续产品,是Spring的一个子项目。SpringMVC 是 Spring 为表述层开发提供的一整套完备的解决方案。在表述层框架历经 Strust、WebWork、Strust2 等诸多产品的历代更迭之后,目前业界普遍选择了 SpringMVC 作为 Java EE 项目
表述层开发的首选方案。
快速开始
新建一个maven项目,不选骨架。
在pom文件中将打包方式改成war包模式
先在项目main文件夹下建立webapp目录,然后点击项目结构,添加web.xml文件,默认是加在类路径的WEB-INFO下面,可以点击path修改(xxxx项目名srcmainwebappWEB-INFweb.xml),或者手动把WEB-INFO和web.xml拖到webapp目录下。

WEB-INF是Java的WEB应用的安全目录。所谓安全就是客户端无法直接访问,只有服务端可以访问的目
录。如果想在浏览器中直接访问其中的文件,必须通过web.xml文件对要访问的文件进行相应映射才能
访问。
点击确认后目录结构如下所示

也可以通过webapp骨架直接创建项目
导入依赖
讯享网
spring-webmvc包括了之前的spring核心依赖和springweb依赖等
web.xml配置文件加入以下内容
创建SpringMVC的配置文件,SpringMVC的配置文件默认位于WEB-INF下,默认名称为web.xml中
<servlet-name>的值加上 -servlet.xml。例如根据上面的web.xml文件,mvc配置文件名称应该叫做
springMVC-servlet.xml。也可以web.xml中init-param修改mvc配置文件的存放路径和名称。
创建mvc配置文件
讯享网
然后创建controller和页面,启动程序即可
web.xml和mvc配置文件都可以用配置类代替。
SpringMVC执行流程
SpringMVC常用组件
- DispatcherServlet:前端控制器,不需要工程师开发,由框架提供。
作用:统一处理请求和响应,整个流程控制的中心,由它调用其它组件处理用户的请求。
- HandlerMapping:处理器映射器,不需要工程师开发,由框架提供。
作用:根据请求的url、method等信息查找Handler,即控制器方法
- Handler:处理器,需要工程师开发
作用:在DispatcherServlet的控制下Handler对具体的用户请求进行处理
- HandlerAdapter:处理器适配器,不需要工程师开发,由框架提供
作用:通过HandlerAdapter对处理器(控制器方法)进行执行
- ViewResolver:视图解析器,不需要工程师开发,由框架提供
作用:进行视图解析,得到相应的视图,例如:ThymeleafView、InternalResourceView、RedirectView
- View:视图
作用:将模型数据通过页面展示给用户
DispatcherServlet初始化过程
DispatcherServlet 本质上是一个 Servlet,所以天然的遵循 Servlet 的生命周期。所以宏观上是 Servlet
生命周期来进行调度。
期间会创建mvc的ioc容器,并且会将spring的ioc容器设置成自己的父容器。
SpringMVC的执行流程
1.用户向服务器发送请求,请求被SpringMVC 前端控制器 DispatcherServlet捕获。
2. DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI),判断请求URI对应的映射:
不存在:再判断是否配置了mvc:default-servlet-handler,如果没配置,则控制台报映射查找不到,客户端展示404错误。如果有配置,则访问目标资源(一般为静态资源,如:JS,CSS,HTML),找不到客户端也会展示404错误
存在则执行下面的流程
3.根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及
Handler对象对应的拦截器),最后以HandlerExecutionChain执行链对象的形式返回。
4.DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。
5. 如果成功获得HandlerAdapter,此时将开始执行拦截器的preHandler(…)方法【正向】
6.提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)方法,处理请求。
在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
- HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
- 数据转换:对请求消息进行数据转换。如String转换成Integer、Double等
- 数据格式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
- 数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
7. Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象。
8. 此时将开始执行拦截器的postHandle(…)方法【逆向】。
9. 根据返回的ModelAndView(此时会判断是否存在异常:如果存在异常,则执行
HandlerExceptionResolver进行异常处理)选择一个适合的ViewResolver进行视图解析,根据Model
和View,来渲染视图。
10.渲染视图完毕执行拦截器的afterCompletion(…)方法【逆向】。
11. 将渲染结果返回给客户端。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/205211.html