SpringMVC中与Spring相关的@注解
一、Spring的常用组件类注解
@Component
被该注解所修饰的类是一个普通的spring bean类,该注解可以替代@Controller、@Service、@Repository.在不确定具体的bean的时候,可以选择使用@Component注解,但是一般不建议使用。
@Controller
被@Controller修饰的类是一个控制器组件类,对应框架的控制层
@Service
被@Service标注的类是一个业务逻辑组件类,对应框架的业务层
@Repository
被@Repository标注的类是一个DAO组件类,对应框架的持久层
目前这几种注解是出镜率比较高的组件类注解,这四种注解实质上是属于同一类注解,用法相同,功能相同,区别就在于标识组件的类型。需要注意的是:1、被注解的Java类当做Bean实例,Bean实例的名称默认是Bean类的首字母小写,其他部分不变,@Service也可以自定义Bean名称,但是必须是唯一的。2、尽量使用对应组件注解的类去替代@Component注解,因为在spring的各个版本中,@Controller、@Service、@Repository会携带更多的语义;3、指定了某些类可以作为Spring Bean类使用后,最好还需要让spring搜索指定路径,在spring中加入如下配置:
<!-- 自动扫描指定包及其子包下的所有类 -->
<context:Component-scan base-package="com.itheima.*" />
二、在装配Bean的时常用注解
@Autowired:属于spring的org.springframework.beans.factory.annotation包下,可用于为类的属性、构造器、方法进行注值,默认情况下,被该注解修饰的bean是必须存在的,如果想实现不管这个类是否存在都可以正常注入的话,就需要设置该注解的一个属性值,required的值为false就行了。如果在容器中存在多个相同类型的Bean,那么启动容器时会报找不到指定类型Bean的异常,在这个时候就需要结合@Qualified注解进行限定,指定注入的bean的名称。
@Resource:不属于spring的注解,而是来自于JSR-250位于Java.annotation包下,使用该annotation为目标bean指定协作的Bean。该注解中有两个比较重要的属性,name和type属性,name属性指定byName(即按名称注入),如果没有指定该属性值,当标注在字段上,就默认取字段的名称作为bean名称去寻找依赖对象,当注解标注在setter方法上,即默认取属性名作为bean名称寻找依赖对象。还有一点就是,如果@Resource注解没有指定name属性,并且按照默认的名称仍然找不到依赖对象时,那么就会退回到按照类型来注入,但是一旦指定了name属性,就只能按照名称装配。
@PostConstruct 和 @PreDestory方法,实现初始化和销毁bean之前进行的操作
SpringMvc常用注解
1、在Web模块中常用到的注解:
@Controller:在springmvc中,被该注解标识的类会作为与前端作交互的控制层组件,通过服务接口定义的提供访问应用程序的一种行为,解释用户的输入,并将其转换为一个模型然后将视图呈现给用户。它还可以自动检测定义在类路径下的组件(配置文件中配置扫描路径)并自动注册。
@RequestMapping:使用该注解,可以将url映射到整个处理类或特定的处理请求的方法,可以只用通配符。
@Controller
@RequestMapping("/happy")
public class HappyController {
@Autowired
private HappyService happyService;
@RequestMapping(/hello/*)
public void sayHello(){
//请求为 /happy/hello/* 都会进入这个方法!
//例如:/happy/hello/123 /happy/hello/adb
//可以通过get/post 请求
}
@RequestMapping(value="/haha",method=RequestMethod.GET)
public void sayHaHa(){
//只能通过get请求
}
...
}
```
通过上面的代码可以看出,@RequestMapping既可以用在类级别,也可以用在方法级别,当它定义在类级别的时候,标明该控制器所处理的请求都将被映射到这个路径下。另外,@RequestMapping中可以使用method属性,如果指定了method属性的值,那么就只能使用指定的请求方法,如果没有指定的话,那么就可以使用HTTP的get/post方法了。
- @RequestParam:这个注解是使用在方法的形参上的,主要用途就是将请求的参数绑定到方法的形参上,有一个required属性,默认情况下是true,就是必须要传参数,如果想该形参可传可不传参数的话,就将属性值设置为false即可。
```
@RequestMapping("/happy")
public String sayHappy(
@RequestParam(value = "name", required = false) String name,
@RequestParam(value = "age", required = true) String age) {
//age参数必须传 ,name可传可不传
...
}
```
@PathVariable:该注解主要是用于做动态绑定使用,让形参的值变成可供使用的URL变量。详情看以下代码:
```
@RequestMapping(value="/happy/{dayid}",method=RequestMethod.GET)
public String findPet(@PathVariable String dayid, Model mode) {
//使用@PathVariable注解绑定 {dayid} 到String dayid
}
```
@PathVariable中的参数可以是任意的简单类型,如int、long、Date等,Spring会自动将其转换成合适的类型或者抛出TypeMismatchException异常,也可以注册支持额外的数据类型。另外,它也支持正则表达式,这就决定了它超强的属性,它能在路径模板中使用占位符,可以设定特定的前缀匹配和后缀匹配,自定义格式等。
- @RequestBody:该注解是指方法形参应该被绑定到HTTP请求的Body上。
```
@RequestMapping(value = "/something", method = RequestMethod.PUT)
public void handle(@RequestBody String body,@RequestBody User user){
//可以绑定自定义的对象类型
}
```
@ResponseBody:和上面的那个注解类似,它是将返回的类型直接输入到HTTP response body 上,我们一般在输出json格式的数据时会使用到这个注解。
```
@RequestMapping(value = "/happy", method =RequestMethod.POST)
@ResponseBody
public String helloWorld() {
return "Hello World";//返回String类型
}
```
@RestController:控制器实现了REST的API,只服务于json、xml或其他自定义的类型内容。使用该注解主要是创建REST类型的控制器,和@Controller类似。使用该注解可以避免让开发人员重复去写@RequestMapping和@ResponseBody注解。
@ModelAttribute:@ModelAttribute可以作用在方法或方法参数上,当它作用在方法上时,标明该方法的目的是添加一个或多个模型属性(model attributes)。 该方法支持与@RequestMapping一样的参数类型,但并不能直接映射成请求。控制器中的@ModelAttribute方法会在@RequestMapping方法调用之前而调用。@ModelAttribute方法有两种风格:一种是添加隐形属性并返回它。另一种是该方法接受一个模型并添加任意数量的模型属性。用户可以根据自己的需要选择对应的风格。
三、Spring的事务模块注解
1、@Transactional常用注解:在处理dao或service层的事务操作时,比如删除失败时的事务回滚,readOnly 为true开启事务,使用@Transactional作为注解,但是需要在配置文件激活,添加如下配置:
@Transactional(readOnly = true)
public class BaseService() {
---
}
<!-- 开启注解方式声明事务 -->
<tx:annotation-driven transaction-manager="transactionManager" />
事务传播行为类型 | 说明
---|---
PROPAGATION_REQUIRED | 如果当前没有事务,就新建一个事务,如果已经存在一个事务,加入到这个事务中,这是最常见的选择。
PROPAGATION_SUPPORTS | 支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY | 使用当前事务,如果没有事务就抛出异常。
PROPAGATION_REQUIRES_NEW | 新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED | 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER | 以非事务方式执行,如果当前存在事务,就抛出异常。
PROPAGATION_NESTED | 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行和PROPAGATION_REQUIRED类似的操作。
## 总结几种事务相关属性:
readOnly : 事务的读写属性,取true或者false,true为只读、默认为false
rollbackFor : 回滚策略,当遇到指定异常时回滚。譬如上例遇到异常就回滚
timeout (补充的) : 设置超时时间,单位为秒
## 事务的隔离级别
isolation : 设置事务隔离级别,枚举类型,一共五种
类型 | 说明
---|---
DEFAULT | 采用数据库默认隔离级别
READ_UNCOMMITTED | 读未提交的数据(会出现脏读取)
READ_COMMITTED | 读已提交的数据(会出现幻读,即前后两次读的不一样)
REPEATABLE_READ | 可重复读,会出现幻读
SERIALIZABLE 串行化 | (对资源消耗较大,一般不使用)
SpringMVC中与Spring相关的@注解的更多相关文章
- Spring中与Spring相关的注解
# 一.Spring的常用组件类注解 ## @Component 被该注解所修饰的类是一个普通的spring bean类,该注解可以替代@Controller.@Service.@Reposi ...
- 如何在项目中使用Spring异步调用注解@Async
本文主要介绍如何使用Spring框架提供的异步调用注解@Async,异步线程池配置.异常捕获处理. 开启@Async注解支持 使用@Async注解的之前,必须在项目中启动时调用@EnableAsync ...
- spring框架中三层架构相关的注解
做了这么多年的C++,再去学Java,确实发现,语言都是相通的,即使是Java的那么多生态,理解起来也并不费劲 Spring 框架目前还在学习中,处于 Tourist 阶段,目前只求会做,不求原理,等 ...
- 在SpringMVC中使用@RequestBody和@ResponseBody注解处理json时,报出HTTP Status 415的解决方案
我在使用SpringMVC的@RequestBody和@ResponseBody注解处理JSON数据的时候,总是出现415的错误,说是不支持所提交数据格式,我在页面中使用了JQuery的AJAX来发出 ...
- struts2的Action中使用spring的@Transactional注解事务出错
1.在Struts2使用的是spring管理对象. 使用spring的注解式事务配置, 在action的方法中直接使用事务遇到的问题. public class testAction extends ...
- 160606、springmvc中使用Spring Mobile
springmobile特点: 1.客户端设备识别:识别结果只有3种类型:NORMAL(非手机设备).MOBILE(手机设备).TABLET(平板电脑). 2.网站偏好设置:Spring 通过设备识别 ...
- SpringMVC中注解和非注解方式下的映射器和适配器总结
1. 非注解方式 1.1 处理器适配器 上一节中使用的处理器适配器是:org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapte ...
- 【SpringMVC学习03】SpringMVC中注解和非注解方式下的映射器和适配器总结
从上一篇的springmvc入门中已经看到,springmvc.xml中的配置了映射器和适配器,是使用非注解的方式来配置的,这是非注解方式的一种,这里再复习一下: 1. 非注解方式 1.1 处理器适配 ...
- 朱晔和你聊Spring系列S1E9:聊聊Spring的那些注解
本文我们来梳理一下Spring的那些注解,如下图所示,大概从几方面列出了Spring的一些注解: 如果此图看不清楚也没事,请运行下面的代码输出所有的结果. Spring目前的趋势是使用注解结合Java ...
随机推荐
- A brief introduction to per-cpu variables
墙外通道:http://thinkiii.blogspot.com/2014/05/a-brief-introduction-to-per-cpu.html per-cpu variables are ...
- jquery easyui datagrid mvc server端分页排序筛选的实现
1自定义一个ModelBinder public class filterRule { public string field { get; set; } public string op { get ...
- unsafe关键字
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.L ...
- springMVC 拦截器源码解析
前言:这两天学习了代理模式,自然想到了 springmvc 的 aop 使用的就是动态代理,拦截器使用的就是 jdk 的动态代理.今天看了看源码,记录一下.转载请注明出处:https://www.cn ...
- JAVA的高并发基础认知 一
一.多线程的基本知识 1.1进程与线程的介绍 程序运行时在内存中分配自己独立的运行空间,就是进程 线程:它是位于进程中,负责当前进程中的某个具备独立运行资格的空间. 进程是负责整个程序的运行,而线程是 ...
- CSS3背景色透明(兼容IE8)
标准浏览器通过rgba()实现背景色透明;IE8以下浏览器通过特有滤镜实现背景色透明. 代码如下: 1 /* IE8 */ 2 filter:progid:DXImageTransform.Micro ...
- blfs(systemv版本)学习笔记-制作一个简单的桌面系统
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 大概思路: lfs(系统)+xorg(驱动)+i3-wm(窗口+桌面)+lightdm(显示管理器+登录管理器) 链接: lfs ...
- Python3选择支持非ASCII码标识符的缘由
原文在: PEP 3131 -- Supporting Non-ASCII Identifiers. Python2并不支持非ASCII码标识符. PEP的全称是Python Enhancement ...
- React 入门学习笔记整理(一)——搭建环境
使用create-react-app脚手架搭建环境 1.安装node .软件下载地址:https://nodejs.org/en/,我下的推荐的版本. 安装之后测试是否安装成功.windows系统下, ...
- REM在edge浏览器中不重新计算解决
经过多分析和排查,此问题解决的方案 第一种: 在CSS样式中添加 body { font-size:100% } 如果不起作用,可以尝试将引用的REMjs放在head内引用