Spring+SpringMVC+MyBatis框架知识点

Spring+SpringMVC+MyBatis框架知识点
一、spring框架知识点
1、Spring是什么
Spring是分层的 Java SE/EE应用 full-stack 轻量级开源框架,以 IoC(Inverse Of Control:反转控制)和AOP(Aspect Oriented Programming:面向切面编程)为内核。提供了展现层 SpringMVC 和持久层 Spring JDBCTemplate 以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库,逐渐成为使用最多的Java EE 企业应用开源框架。Spring的优势:1)方便解耦,简化开发,通过 Spring 提供的 IoC容器,可以将对象间的依赖关系交由 Spring 进行控制,避免硬编码所造成的过度耦合。用户也不必再为单例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。2)AOP 编程的支持通过 Spring的 AOP 功能,方便进行面向切面编程,许多不容易用传统 OOP 实现的功能可以通过 AOP 轻松实现。3)声明式事务的支持可以将我们从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活的进行事务管理,提高开发效率和质量。4)方便程序的测试可以用非容器依赖的编程方式进行几乎所有的测试工作,测试不再是昂贵的操作,而是随手可做的事情。
2、Spring快速入门
Spring程序开发步骤:导入 Spring 开发的基本包坐标,编写 Dao 接口和实现类,创建 Spring 核心配置文件,在 Spring 配置文件中配置 UserDaoImpl,使用 Spring 的 API 获得 Bean 实例。Spring配置文件:Bean标签基本配置。用于配置对象交由Spring 来创建。默认情况下它调用的是类中的无参构造函数,如果没有无参构造函数则不能创建成功。基本属性:id:Bean实例在Spring容器中的唯一标识class:Bean的全限定名称。Spring配置文件,Bean标签范围配置,scope:指对象的作用范围,取值如下:

3、Spring配置文件
Bean标签范围配置。当scope的取值为singleton时:Bean的实例化个数:1个Bean的实例化时机:当Spring核心文件被加载时,实例化配置的Bean实例。Bean的生命周期:对象创建:当应用加载,创建容器时,对象就被创建了,对象运行:只要容器在,对象一直活着,对象销毁:当应用卸载,销毁容器时,对象就被销毁了。当scope的取值为prototype时Bean的实例化个数:多个。Bean的实例化时机:当调用getBean()方法时实例化Bean 。对象创建:当使用对象时,创建新的对象实例。对象运行:只要对象在使用中,就一直活着,对象销毁:当对象长时间不用时,被 Java 的垃圾回收器回收了。Bean生命周期配置 :init-method:指定类中的初始化方法名称,destroy-method:指定类中销毁方法名称,Bean实例化三种方式:无参构造方法实例化,工厂静态方法实例化,工厂实例方法实例化。Bean实例化三种方式:使用无参构造方法实例化,它会根据默认无参构造方法来创建类对象,如果bean中没有默认无参构造函数,将会创建失败,工厂静态方法实例化,工厂的静态方法返回Bean实例,工厂实例方法实例化,工厂的非静态方法返回Bean实例。
4、Bean的依赖注入入门
创建 UserService,UserService 内部在调用 UserDao的save() 方法,将 UserServiceImpl 的创建权交给 Spring,从 Spring 容器中获得 UserService 进行操作。Bean的依赖注入分析:目前UserService实例和UserDao实例都存在与Spring容器中,当前的做法是在容器外部获得UserService,实例和UserDao实例,然后在程序中进行结合。因为UserService和UserDao都在Spring容器中,而最终程序直接使用的是UserService,所以可以在Spring容器中,将UserDao设置到UserService内部。Bean的依赖注入概念:依赖注入(Dependency Injection):它是 Spring 框架核心 IOC 的具体实现。在编写程序时,通过控制反转,把对象的创建交给了 Spring,但是代码中不可能出现没有依赖的情况。IOC 解耦只是降低他们的依赖关系,但不会消除。例如:业务层仍会调用持久层的方法。那这种业务层和持久层的依赖关系,在使用 Spring 之后,就让 Spring 来维护了。简单的说,就是坐等框架把持久层对象传入业务层,而不用我们自己去获取。Bean的依赖注入方式。怎么将UserDao怎样注入到UserService内部呢?构造方法,set方法,Bean的依赖注入的数据类型:上面的操作,都是注入的引用Bean,处了对象的引用可以注入,普通数据类型,集合等都可以在容器中进行注入。 注入数据的三种数据类型:普通数据类型,引用数据类型,集合数据类型,其中引用数据类型,此处就不再赘述了,之前的操作都是对UserDao对象的引用进行注入的,下面将以set方法注入为例,演示普通数据类型和集合数据类型的注入。
5、Spring相关API
ApplicationContext的实现类:ClassPathXmlApplicationContext :它是从类的根路径下加载配置文件 推荐使用这种。FileSystemXmlApplicationContext:它是从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置。 AnnotationConfigApplicationContext:当使用注解配置容器对象时,需要使用此类来创建 spring 容器。它用来读取注解。getBean()方法使用:其中,当参数的数据类型是字符串时,表示根据Bean的id从容器中获得Bean实例,返回是Object,需要强转。 当参数的数据类型是Class类型时,表示根据类型从容器中匹配Bean实例,当容器中相同类型的Bean有多个时,则此方法会报错Spring的重点API:

6、Spring配置数据源
数据源的开发步骤:导入数据源的坐标和数据库驱动坐标,创建数据源对象,设置数据源的基本连接数据,使用数据源获取连接资源和归还连接资源。数据源的手动创建:导入c3p0和druid的坐标,导入mysql数据库驱动坐标,创建C3P0连接池,提取jdbc.properties配置文件,读取jdbc.properties配置文件创建连接池,可以将DataSource的创建权交由Spring容器去完成,DataSource有无参构造方法,而Spring默认就是通过无参构造方法实例化对象的 ,DataSource要想使用需要通过set方法设置数据库连接信息,而Spring可以通过set方法进行字符串注入。测试从容器当中获取数据源。抽取jdbc配置文件 :applicationContext.xml加载jdbc.properties配置文件获得连接信息。首先,需要引入context命名空间和约束路径:命名空间:xmlns:context=“http://www.springframework.org/schema/context”。约束路径:http://www.springframework.org/schema/context,http://www.springframework.org/schema/context/spring-context.xsd。知识要点
:Spring容器加载properties文件:<context:property-placeholder location=“xx.properties”/> ,
7、Spring注解开发
Spring原始注解:Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以注解开发是一种趋势,注解代替xml配置:文件可以简化配置,提高开发效率。Spring原始注解主要是替代的配置

注意:使用注解进行开发时,需要在applicationContext.xml中配置组件扫描,作用是指定哪个包及其子包下的Bean,需要进行扫描以便识别使用注解配置的类、字段和方法。 <context:component-scan base-package=“com.itheima”></context:componentscan。使用@Compont或@Repository标识UserDaoImpl需要Spring进行实例化。使用@Compont或@Service标识UserServiceImpl需要Spring进行实例化。使用@Autowired或者@Autowired+@Qulifier或者@Resource进行userDao的注入。使用@Value进行字符串的注入。使用@Scope标注Bean的范围。使用@PostConstruct标注初始化方法,使用@PreDestroy标注销毁方法。Spring新注解 :使用上面的注解还不能全部替代xml配置文件,还需要使用注解替代的配置如下: 非自定义的Bean的配置: ,加载properties文件的配置:context:property-placeholder。组件扫描的配置:context:component-scan,引入其他文件:

8、Spring集成Junit
上述问题解决思路:让SpringJunit负责创建Spring容器,但是需要将配置文件的名称告诉它,将需要进行测试Bean直接在测试类中进行注入。Spring集成Junit:Spring集成Junit步骤,导入spring集成Junit的坐标,使用@Runwith注解替换原来的运行期,使用@ContextConfiguration指定配置文件或配置类,使用@Autowired注入需要测试的对象,创建测试方法进行测试,Spring集成Junit代码实现,导入spring集成Junit的坐标,使用@Runwith注解替换原来的运行期,使用@ContextConfiguration指定配置文件或配置类,使用@Autowired注入需要测试的对象,创建测试方法进行测试。
二、SpringMVC框架知识点
1、Spring与Web环境集成
ApplicationContext应用上下文获取方式:应用上下文对象是通过new ClasspathXmlApplicationContext(spring配置文件) 方式获取的,但是每次从容器中获得Bean时都要编写new ClasspathXmlApplicationContext(spring配置文件) ,这样的弊端是配置文件加载多次,应用上下文对象创建多次。在Web项目中,可以使用ServletContextListener监听Web应用的启动,我们可以在Web应用启动时,就加载Spring的配置文件,创建应用上下文对象ApplicationContext,在将其存储到最大的域servletContext域中,这样就可以在任意位置从域中获得应用上下文ApplicationContext对象了。Spring提供获取应用上下文的工具上面的分析不用手动实现,Spring提供了一个监听器ContextLoaderListener就是对上述功能的封装,该监听器内部加载Spring配置文件,创建应用上下文对象,并存储到ServletContext域中,提供了一个客户端工具WebApplicationContextUtils供使用者获得应用上下文对象。所以我们需要做的只有两件事:在web.xml中配置ContextLoaderListener监听器(导入spring-web坐标),使用WebApplicationContextUtils获得应用上下文对象ApplicationContext。Spring集成web环境:导入Spring集成web的坐标,配置ContextLoaderListener监听器,通过工具获得应用上下文对象。知识要点:Spring集成web环境步骤:配置ContextLoaderListener监听器,使用WebApplicationContextUtils获得应用上下文。
2、SpringMVC概述
SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,属于SpringFrameWork 的后续产品,已经融合在 Spring Web Flow 中。SpringMVC 已经成为目前最主流的MVC框架之一,并且随着Spring3.0 的发布,全面超越 Struts2,成为最优秀的 MVC 框架。它通过一套注解,让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接口。同时它还支持 RESTful 编程风格的请求。SpringMVC快速入门:需求:客户端发起请求,服务器端接收请求,执行逻辑并进行视图跳转。开发步骤:导入SpringMVC相关坐标
配置SpringMVC核心控制器DispathcerServlet,创建Controller类和视图页面,使用注解配置Controller类中业务方法的映射地址,配置SpringMVC核心文件 spring-mvc.xml,客户端发起请求测试。SpringMVC流程图示:

3、SpringMVC 组件解析
SpringMVC的执行流程:

SpringMVC的执行流程:用户发送请求至前端控制器DispatcherServlet。 DispatcherServlet收到请求调用HandlerMapping处理器映射器。处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。DispatcherServlet调用HandlerAdapter处理器适配器。HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。Controller执行完成返回ModelAndView。HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
DispatcherServlet将ModelAndView传给ViewReslover视图解析器。 ViewReslover解析后返回具体View。
DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。DispatcherServlet响应用户。
4、SpringMVC组件解析
前端控制器:DispatcherServlet:用户请求到达前端控制器,它就相当于 MVC 模式中的 C,DispatcherServlet 是整个流程控制的中心,由它调用其它组件处理用户的请求,DispatcherServlet 的存在降低了组件之间的耦合性。处理器映射器:HandlerMapping:HandlerMapping 负责根据用户请求找到 Handler 即处理器,SpringMVC 提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。处理器适配器:HandlerAdapter通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。处理器:Handler它就是我们开发中要编写的具体业务控制器。由 DispatcherServlet 把用户请求转发到 Handler。由Handler 对具体的用户请求进行处理。视图解析器:View Resolver:View Resolver 负责将处理结果生成 View 视图,View Resolver 首先根据逻辑视图名解析成物理视图名,即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户。视图:View:SpringMVC 框架提供了很多的 View 视图类型的支持,包括:jstlView、freemarkerView、pdfView等。最常用的视图就是 jsp。一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。
5、SpringMVC注解解析
@RequestMapping:作用:用于建立请求 URL 和处理请求方法之间的对应关系位置:类上,请求URL 的第一级访问目录。此处不写的话,就相当于应用的根目录方法上,请求 URL 的第二级访问目录,与类上的使用@ReqquestMapping标注的一级目录一起组成访问虚拟路径属性:value:用于指定请求的URL。它和path属性的作用是一样的,method:用于指定请求的方式params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的key和value必须和配置的一模一样。例如:params = {“accountName”},表示请求参数必须有accountName,params = {“moeny!100”},表示请求参数中money不能是100。mvc命名空间引入 :命名空间:xmlns:context=“http://www.springframework.org/schema/context”
xmlns:mvc=“http://www.springframework.org/schema/mvc”
约束地址:http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
组件扫描:SpringMVC基于Spring容器,所以在进行SpringMVC操作时,需要将Controller存储到Spring容器中,如果使用@Controller注解标注的话,就需要使用<context:component-scan basepackage=“com.itheima.controller"/>进行组件扫描。
6、SpringMVC的XML配置解析
视图解析:SpringMVC有默认组件配置,默认组件都是DispatcherServlet.properties配置文件中配置的,该配置文件地址 :org/springframework/web/servlet/DispatcherServlet.properties,该文件中配置了默认的视图解析器,如下:

翻看该解析器源码,可以看到该解析器的默认设置,如下:

知识要点:SpringMVC的相关组件:前端控制器:DispatcherServlet ,处理器映射器:HandlerMapping ,处理器适配器:HandlerAdapter ,处理器:Handler,视图解析器:View Resolver ,视图:View。SpringMVC的注解和配置:请求映射注解:@RequestMapping,视图解析器配置:REDIRECT_URL_PREFIX = “redirect:”
FORWARD_URL_PREFIX = “forward:” ,prefix = “”; suffix = “”;
7、SpringMVC的数据响应页面跳转
SpringMVC的数据响应方式:页面跳转直接返回字符串通过ModelAndView对象返回,回写数据直接返回字符串返回对象或集合。页面跳转:返回字符串形式直接返回字符串:此种方式会将返回的字符串与视图解析器的前后缀拼接后跳转。 返回带有前缀的字符串:转发:forward:/WEB-INF/views/index.jsp,重定向:redirect:/index.jsp,页面跳转:返回ModelAndView对象,向request域存储数据
在进行转发时,往往要向request域中存储数据,在jsp页面中显示,那么Controller中怎样向request域中存储数据呢?通过SpringMVC框架注入的request对象setAttribute()方法设置。页面跳转:向request域存储数据,通过ModelAndView的addObject()方法设置。
8、SpringMVC的数据响应回写数据
直接返回字符串:Web基础阶段,客户端访问服务器端,如果想直接回写字符串作为响应体返回的话,只需要使用response.getWriter().print(“hello world”) 即可,那么在Controller中想直接回写字符串该怎样呢?通过SpringMVC框架注入的response对象,使用response.getWriter().print(“hello world”) 回写数据,此时不需要视图跳转,业务方法返回值为void。直接返回字符串:将需要回写的字符串直接返回,但此时需要通过@ResponseBody注解告知SpringMVC框架,方法返回的字符串不是跳转是直接在http响应体中返回。 在异步项目中,客户端与服务器端往往要进行json格式字符串交互,此时我们可以手动拼接json字符串返回。上述方式手动拼接json格式字符串的方式很麻烦,开发中往往要将复杂的java对象转换成json格式的字符串,我们可以使用web阶段学习过的json转换工具jackson进行转换,导入jackson坐标。回写数据:直接返回字符串:通过jackson转换json格式字符串,回写字符串。返回对象或集合:通过SpringMVC帮助我们对对象或集合进行json字符串的转换并回写,为处理器适配器配置消息转换参数,指定使用jackson进行对象或集合的转换,因此需要在spring-mvc.xml中进行如下配置:在方法上添加@ResponseBody就可以返回json格式的字符串,但是这样配置比较麻烦,配置的代码比较多,因此,我们可以使用mvc的注解驱动代替上述配置。在 SpringMVC 的各个组件中,处理器映射器、处理器适配器、视图解析器称为 SpringMVC 的三大组件。使用mvc:annotation-driven自动加载 RequestMappingHandlerMapping(处理映射器)和 RequestMappingHandlerAdapter( 处 理 适 配 器 ),可用在Spring-xml.xml配置文件中使用 mvc:annotation-driven替代注解处理器和适配器的配置。同时使用mvc:annotation-driven默认底层就会集成jackson进行对象或集合的json格式字符串的转换。知识要点 :SpringMVC的数据响应方式:页面跳转:直接返回字符串,通过ModelAndView对象返回。回写数据:直接返回字符串,返回对象或集合。
9、SpringMVC 获得请求数据
获得请求参数:客户端请求参数的格式是:name=value&name=value,服务器端要获得请求的参数,有时还需要进行数据的封装,SpringMVC可以接收如下类型的参数:基本类型参数,POJO类型参数,数组类型参数,集合类型参数。获得基本类型参数:Controller中的业务方法的参数名称要与请求参数的name一致,参数值会自动映射匹配。
http://localhost:8080/itheima_springmvc1/quick9?username=zhangsan&age=12
@RequestMapping(“/quick9”)
@ResponseBody
public void quickMethod9(String username,int age) throws IOException {
System.out.println(username);
System.out.println(age);
}
10获得POJO类型参数
Controller中的业务方法的POJO参数的属性名与请求参数的name一致,参数值会自动映射匹配。
http://localhost:8080/itheima_springmvc1/quick9?username=zhangsan&age=12
public class User {
private String username;
private int age;
getter/setter…
}
@RequestMapping(“/quick10”)
@ResponseBody
public void quickMethod10(User user) throws IOException {
System.out.println(user);
}
11、获得数组类型参数
Controller中的业务方法数组名称与请求参数的name一致,参数值会自动映射匹配。
http://localhost:8080/itheima_springmvc1/quick11?strs=111&strs=222&strs=333
@RequestMapping(“/quick11”)
@ResponseBody
public void quickMethod11(String[] strs) throws IOException {
System.out.println(Arrays.asList(strs));
}
12获得集合类型参数
获得集合参数时,要将集合参数包装到一个POJO中才可以。

13、获得集合类型参数
当使用ajax提交时,可以指定contentType为json形式,那么在方法参数位置使用@RequestBody可以直接接收集合数据而无需使用POJO进行包装。

当使用ajax提交时,可以指定contentType为json形式,那么在方法参数位置使用@RequestBody可以直接接收集合数据而无需使用POJO进行包装。
@RequestMapping(“/quick13”)
@ResponseBody
public void quickMethod13(@RequestBody List userList) throws
IOException {
System.out.println(userList);
}
14、获得集合类型参数
注意:通过谷歌开发者工具抓包发现,没有加载到jquery文件,原因是SpringMVC的前端控制器DispatcherServlet的url-pattern配置的是/,代表对所有的资源都进行过滤操作,我们可以通过以下两种方式指定放行静态资源:在spring-mvc.xml配置文件中指定放行的资源<mvc:resources mapping=“/js/**” location=“/js/”/>,使用mvc:default-servlet-handler/标签
15、请求数据乱码问题
当post请求时,数据会出现乱码,我们可以设置一个过滤器来进行编码的过滤。

16、参数绑定注解@requestParam
当请求的参数名称与Controller的业务方法参数名称不一致时,就需要通过@RequestParam注解显示的绑定。

注解@RequestParam还有如下参数可以使用:value:与请求参数名称,required:此在指定的请求参数是否必须包括,默认是true,提交时如果没有此参数则报错
defaultValue:当没有指定请求参数时,则使用指定的默认值赋值。
17、获得Restful风格的参数
Restful是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。主要用于客户端和服务器交互类的软件,基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存机制等。Restful风格的请求是使用“url+请求方式”表示一次请求目的的,HTTP 协议里面四个表示操作方式的动词如下:
 GET:用于获取资源
 POST:用于新建资源
 PUT:用于更新资源
 DELETE:用于删除资源
例如:
 /user/1 GET :
得到 id = 1 的 user
 /user/1 DELETE: 删除 id = 1 的 user
 /user/1 PUT:
更新 id = 1 的 user
 /user POST:
新增 user
上述url地址/user/1中的1就是要获得的请求参数,在SpringMVC中可以使用占位符进行参数绑定。地址/user/1可以写成/user/{id},占位符{id}对应的就是1的值。在业务方法中我们可以使用@PathVariable注解进行占位符的匹配获取工作。
18、自定义类型转换器
SpringMVC 默认已经提供了一些常用的类型转换器,例如客户端提交的字符串转换成int型进行参数设置。但是不是所有的数据类型都提供了转换器,没有提供的就需要自定义转换器,例如:日期类型的数据就需要自定义转换器。自定义类型转换器的开发步骤:定义转换器类实现Converter接口,在配置文件中声明转换器,在中引用转换器
19、获得Servlet相关API
SpringMVC支持使用原始ServletAPI对象作为控制器方法的参数进行注入,常用的对象如下:HttpServletRequest ,HttpServletResponse, HttpSession

20、获得请求头
@RequestHeader:使用@RequestHeader可以获得请求头信息,相当于web阶段学习的request.getHeader(name) ,@RequestHeader注解的属性如下:value:请求头的名称,required:是否必须携带此请求头
@RequestMapping(“/quick17”)
@ResponseBody
public void quickMethod17(
@RequestHeader(value = “User-Agent”,required = false) String
headerValue){
System.out.println(headerValue);
}
2. @CookieValue
使用@CookieValue可以获得指定Cookie的值
@CookieValue注解的属性如下:
 value:指定cookie的名称
 required:是否必须携带此cookie
@RequestMapping(“/quick18”)
@ResponseBody
public void quickMethod18(
@CookieValue(value = “JSESSIONID”,required = false) String jsessionid){
System.out.println(jsessionid);
}
21、文件上传
文件上传客户端三要素:表单项type=“file”,表单的提交方式是post,表单的enctype属性是多部分表单形式,及enctype=“multipart/form-data”

名称:
文件:

文件上传原理:当form表单修改为多部分表单时,request.getParameter()将失效。 enctype=“application/x-www-form-urlencoded”时,form表单的正文内容格式是: key=value&key=value&key=value。当form表单的enctype取值为Mutilpart/form-data时,请求正文内容就变成多部分形式:

单文件上传步骤:导入fileupload和io坐标,配置文件上传解析器,编写文件上传代码。单文件上传实现:配置文件上传解析器:

单文件上传实现,编写文件上传代码: @RequestMapping("/quick20") @ResponseBody public void quickMethod20(String name,MultipartFile uploadFile) throws IOException { //获得文件名称 String originalFilename = uploadFile.getOriginalFilename(); //保存文件 uploadFile.transferTo(new File("C:\\upload\\"+originalFilename)); } 22、多文件上传实现 多文件上传,只需要将页面修改为多个文件上传项,将方法参数MultipartFile类型修改为MultipartFile[]即可

多文件上传测试

名称:
文件1:
文件2:
文件3:

多文件上传实现: @RequestMapping("/quick21") @ResponseBody public void quickMethod21(String name,MultipartFile[] uploadFiles) throws IOException { for (MultipartFile uploadFile : uploadFiles){ String originalFilename = uploadFile.getOriginalFilename(); uploadFile.transferTo(new File("C:\\upload\\"+originalFilename)); } } 知识要点:MVC实现数据请求方式:基本类型参数,POJO类型参数,数组类型参数,集合类型参数,MVC获取数据细节。中文乱码问题:@RequestParam 和 @PathVariable,自定义类型转换器,获得Servlet相关API ,@RequestHeader 和 @CookieValue。文件上传 三、Spring JdbcTemplate基本使用 1、JdbcTemplate概述 它是spring框架中提供的一个对象,是对原始繁琐的Jdbc API对象的简单封装。spring框架为我们提供了很多的操作模板类。例如:操作关系型数据的JdbcTemplate和HibernateTemplate,操作nosql数据库的RedisTemplate,操作消息队列的JmsTemplate等等。 2、JdbcTemplate开发步骤 导入spring-jdbc和spring-tx坐标,创建数据库表和实体,创建JdbcTemplate对象执行数据库操作。知识要点:导入spring-jdbc和spring-tx坐标,创建数据库表和实体,创建JdbcTemplate对象:JdbcTemplate jdbcTemplate = new JdbcTemplate(); jdbcTemplate.setDataSource(dataSource); 执行数据库操作,更新操作: jdbcTemplate.update (sql,params)。查询操作:jdbcTemplate.query (sql,Mapper,params) jdbcTemplate.queryForObject(sql,Mapper,params) 四、SpringMVC拦截器 1、拦截器(interceptor)的作用 Spring MVC 的拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。将拦截器按一定的顺序联结成一条链,这条链称为拦截器链(Interceptor Chain)。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。拦截器也是AOP思想的具体实现。 2、拦截器和过滤器区别

3、拦截器是快速入门
自定义拦截器很简单,只有如下三步: 创建拦截器类实现HandlerInterceptor接口,配置拦截器,测试拦截器的拦截效果
4、多拦截器操作
同上,在编写一个MyHandlerInterceptor2操作,测试执行顺序。拦截器方法说明

五、面向切面编程aop
1 、什么是 AOP
AOP 为 Aspect Oriented Programming 的缩写,意思为面向切面编程,是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP 是 OOP 的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
2、 AOP 的作用及其优势
作用:在程序运行期间,在不修改源码的情况下对方法进行功能增强。优势:减少重复代码,提高开发效率,并且便于维护。AOP 的底层实现:实际上,AOP 的底层是通过 Spring 提供的的动态代理技术实现的。在运行期间,Spring通过动态代理技术动态的生成代理对象,代理对象方法执行时进行增强功能的介入,在去调用目标对象的方法,从而完成功能的增强。
3、 AOP 的动态代理技术
常用的动态代理技术JDK 代理 : 基于接口的动态代理技术,cglib 代理:基于父类的动态代理技术
4、AOP 相关概念
Spring 的 AOP 实现底层就是对上面的动态代理的代码进行了封装,封装后我们只需要对需要关注的部分进行代码编写,并通过配置的方式完成指定目标的方法增强。在正式讲解 AOP 的操作之前,我们必须理解 AOP 的相关术语,常用的术语如下:Target(目标对象):代理的目标对象,Proxy (代理):一个类被 AOP 织入增强后,就产生一个结果代理类, Joinpoint(连接点):所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点,Pointcut(切入点):所谓切入点是指我们要对哪些 Joinpoint 进行拦截的定义, Advice(通知/ 增强):所谓通知是指拦截到 Joinpoint 之后所要做的事情就是通知,Aspect(切面):是切入点和通知(引介)的结合
Weaving(织入):是指把增强应用到目标对象来创建新的代理对象的过程。spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入
5、AOP 开发明确的事项
需要编写的内容:编写核心业务代码(目标类的目标方法),编写切面类,切面类中有通知(增强功能方法)在配置文件中,配置织入关系,即将哪些通知与哪些连接点进行结合。AOP 技术实现的内容 :Spring 框架监控切入点方法的执行。一旦监控到切入点方法被运行,使用代理机制,动态创建目标对象的代理对象,根据通知类别,在代理对象的对应位置,将通知对应的功能织入,完成完整的代码逻辑运行。
6、AOP 底层使用哪种代理方式
在 spring 中,框架会根据目标类是否实现了接口来决定采用哪种动态代理的方式。知识要点:aop:面向切面编程 ,aop底层实现:基于JDK的动态代理 和 基于Cglib的动态代理, aop的重点概念:Pointcut(切入点):被增强的方法,Advice(通知/ 增强):封装增强业务逻辑的方法,Aspect(切面):切点+通知,Weaving(织入):将切点与通知结合的过程。开发明确事项:谁是切点(切点表达式配置),谁是通知(切面类中的增强方法),将切点和通知进行织入配置。
7、基于 XML 的 AOP 开发
快速入门:导入 AOP 相关坐标,创建目标接口和目标类(内部有切点),创建切面类(内部有增强方法),将目标类和切面类的对象创建权交给 spring,在 applicationContext.xml 中配置织入关系,测试代码。 XML 配置 AOP 详解:切点表达式的写法:表达式语法:execution([修饰符] 返回值类型 包名.类名.方法名(参数)),访问修饰符可以省略,返回值类型、包名、类名、方法名可以使用星号* 代表任意包名与类名之间一个点 . 代表当前包下的类,两个点 … 表示当前包及其子包下的类,参数列表可以使用两个点 … 表示任意个数,任意类型的参数列表。通知的类型:通知的配置语法:
<aop:通知类型 method=“切面类中方法名” pointcut=“切点表达式"></aop:通知类型>

8、切点表达式的抽取
当多个增强的切点表达式相同时,可以将切点表达式进行抽取,在增强中使用 pointcut-ref 属性代替 pointcut 属性来引用抽取后的切点表达式。知识要点
aop织入的配置:通知的类型:前置通知、后置通知、环绕通知、异常抛出通知、最终通知。切点表达式的写法。
9、基于注解的 AOP 开发
快速入门:基于注解的aop开发步骤: 创建目标接口和目标类(内部有切点) 创建切面类(内部有增强方法),将目标类和切面类的对象创建权交给 spring
在切面类中使用注解配置织入关系,在配置文件中开启组件扫描和 AOP 的自动代理,测试。注解配置 AOP 详解:注解通知的类型,通知的配置语法:@通知注解(“切点表达式")

10、切点表达式的抽取
同 xml 配置 aop 一样,我们可以将切点表达式抽取。抽取方式是在切面内定义方法,在该方法上使用@Pointcut 注解定义切点表达式,然后在在增强注解中进行引用。具体如下:
@@Component(“myAspect”)
@Aspect
public class MyAspect {
@Before(“MyAspect.myPoint()”)
public void before(){
System.out.println(“前置代码增强…”);
}
@Pointcut(“execution(* com.itheima.aop..(…))”)
public void myPoint(){}
}
知识要点:注解aop开发步骤,使用@Aspect标注切面类,使用@通知注解标注通知方法在配置文件中配置aop自动代理aop:aspectj-autoproxy/ ,通知注解类型 :

六、声明式事务控制
1、编程式事务控制相关对象
PlatformTransactionManager :PlatformTransactionManager 接口是 spring 的事务管理器,它里面提供了我们常用的操作事务的方法。

注意:PlatformTransactionManager 是接口类型,不同的 Dao 层技术则有不同的实现类,例如:Dao 层技术是jdbc或 mybatis 时:org.springframework.jdbc.datasource.DataSourceTransactionManager ,Dao 层技术是hibernate时:org.springframework.orm.hibernate5.HibernateTransactionManager
TransactionDefinition:TransactionDefinition 是事务的定义信息对象,里面有如下方法:
2、事务隔离级别
设置隔离级别,可以解决事务并发产生的问题,如脏读、不可重复读和虚读。 ISOLATION_DEFAULT
ISOLATION_READ_UNCOMMITTED
ISOLATION_READ_COMMITTED
ISOLATION_REPEATABLE_READ
ISOLATION_SERIALIZABLE
3、事务传播行为
 REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。一般的选择(默认值),SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行(没有事务, MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常,REQUERS_NEW:新建事务,如果当前在事务中,把当前事务挂起。NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起,NEVER:以非事务方式运行,如果当前存在事务,抛出异常,NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行 REQUIRED 类似的操作,超时时间:默认值是-1,没有超时限制。如果有,以秒为单位进行设置,是否只读:建议查询时设置为只读。
4、TransactionStatus
TransactionStatus 接口提供的是事务具体的运行状态,方法介绍如下。

知识要点:编程式事务控制三大对象PlatformTransactionManager ,ransactionDefinition,TransactionStatus
2. 基于 XML 的声明式事务控制
什么是声明式事务控制:Spring 的声明式事务顾名思义就是采用声明的方式来处理事务。这里所说的声明,就是指在配置文件中声明,用在 Spring 配置文件中声明式的处理事务来代替代码式的处理事务。声明式事务处理的作用,事务管理不侵入开发的组件。具体来说,业务逻辑对象就不会意识到正在事务管理之中,事实上也应该如此,因为事务管理是属于系统层面的服务,而不是业务逻辑的一部分,如果想要改变事务管理策划的话,也只需要在定义文件中重新配置即可在不需要事务管理的时候,只要在设定文件上修改一下,即可移去事务管理服务,无需改变代码重新编译 ,这样维护起来极其方便,注意:Spring 声明式事务控制底层就是AOP。
3、声明式事务控制的实现
声明式事务控制明确事项:谁是切点?谁是通知?配置切面?声明式事务控制的实现:引入tx命名空间,配置事务增强,配置事务 AOP 织入,测试事务控制转账业务代码。切点方法的事务参数的配置,其中,tx:method 代表切点方法的事务参数的配置,例如:
<tx:method name=“transfer” isolation=“REPEATABLE_READ” propagation=“REQUIRED” timeout=“-1”
read-only=“false”/>
name:切点方法名称,isolation:事务的隔离级别,propogation:事务的传播行为
timeout:超时时间,read-only:是否只读。知识要点:声明式事务控制的配置要点:平台事务管理器配置,事务通知的配置,事务aop织入的配置
4、基于注解的声明式事务控制
使用注解配置声明式事务控制:编写 AccoutDao,编写 AccoutService ,编写 applicationContext.xml 配置文件。注解配置声明式事务控制解析,使用 @Transactional 在需要进行事务控制的类或是方法上修饰,注解可用的属性同 xml 配置方式,例如隔离级别、传播行为等。注解使用在类上,那么该类下的所有方法都使用同一套注解参数配置。使用在方法上,不同的方法可以采用不同的事务参数配置。Xml配置文件中要开启事务的注解驱动<tx:annotation-driven />
。知识要点:注解声明式事务控制的配置要点:平台事务管理器配置(xml方式)
事务通知的配置(@Transactional注解配置),事务注解驱动的配置 tx:annotation-driven/

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值