欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SpringMVC中与Spring相关的@注解

程序员文章站 2022-04-14 16:05:17
一、Spring的常用组件类注解 @Component 被该注解所修饰的类是一个普通的spring bean类,该注解可以替代@Controller、@Service、@Repository.在不确定具体的bean的时候,可以选择使用@Component注解,但是一般不建议使用。 @Controll ......

 一、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 串行化 | (对资源消耗较大,一般不使用)