Spring中与Spring相关的注解

# 1、Spring的经常使用组件类注解
## @Component
    被该注解所修饰的类是一个普通的spring bean类,该注解能够替代@Controller、@Service、@Repository.在不肯定具体的bean的时候,能够选择使用@Component注解,可是通常不建议使用。
## @Controller
    被@Controller修饰的类是一个控制器组件类,对应框架的控制层
## @Service
    被@Service标注的类是一个业务逻辑组件类,对应框架的业务层
## @Repository
    被@Repository标注的类是一个DAO组件类,对应框架的持久层
### 目前这几种注解是出镜率比较高的组件类注解,这四种注解实质上是属于同一类注解,用法相同,功能相同,区别就在于标识组件的类型。须要注意的是:一、被注解的Java类当作Bean实例,Bean实例的名称默认是Bean类的首字母小写,其余部分不变,@Service也能够自定义Bean名称,可是必须是惟一的。二、尽可能使用对应组件注解的类去替代@Component注解,由于在spring的各个版本中,@Controller、@Service、@Repository会携带更多的语义;三、指定了某些类能够做为Spring Bean类使用后,最好还须要让spring搜索指定路径,在spring中加入以下配置:
### <!-- 自动扫描指定包及其子包下的全部类 -->
### <context:Component-scan base-package="com.itheima.*" />

# 2、在装配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经常使用注解
## 一、在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方法有两种风格:一种是添加隐形属性并返回它。另外一种是该方法接受一个模型并添加任意数量的模型属性。用户能够根据本身的须要选择对应的风格。
# 3、Spring的事务模块注解
## 一、经常使用注解:在处理dao或service层的事务操做时,好比删除失败时的事务回滚,使用@Transactional做为注解,可是须要在配置文件激活,添加以下配置:

```
<!-- 开启注解方式声明事务 -->
    <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 串行化 | (对资源消耗较大,通常不使用)前端

相关文章
相关标签/搜索