@Controller(运用于表现层)使用@Controller注解标识UserAction之后,就表示要把UserAction交给Spring容器管理,在Spring容器中会存在一个名字为"userAction"的action,这个名字是根据UserAction类名来取的。如果@Controller不指定其value【@Controller】,则默认的bean名字为这个类的类名首字母小写,如果指定value【@Controller(value="UserAction")】或者【@Controller("UserAction")】,则使用value作为bean的名字,在Controller层使用【Controller注解的多线程请求安全是通过ThreadLocal实现的】
@Service(运用于业务逻辑层)@service注解是在服务接口的实现类下使用,而不是在接口中使用。这里很好的体现了spring中的控制反转,我们不在让对象自己去实例化对象,去主动依赖对象,而是专门用一个容器来创建对象,由IOC进行管理,在Service层使用
@Repository(运用于数据管理层)简单的向spring容器中注入一个Bean,在Dao层使用
@Component(可以运用所有层)普通的spring Bean类,相当于通用的注解,当不知道一些类归到哪个层时使用,但是不建议
Controller,Service,Repository默认都是单例模式,在@Controller下面增加@Scope("prototype"),就可以把单例模式改为多例模式
ThreadLocal是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不通的变量值完成操作的场景
@RequestMapping(映射请求地址)用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。【默认是GET请求类型】
其中的六个属性
value:指定请求的实际地址,指定的地址可以是URI Template模式
method:指定请求的method类型,GET、POST、HEAD、OPTIONS、PUT、PATCH、DELETE、TRACE
consumes:指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
produces:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回
params:指定request中必须包含某些参数值时才让该方法处理请求
headers:指定request中必须包含某些指定的header值时才让该方法处理请求
@RestController是@ResponseBody和@Controller注解的组合,表示整个controller层都是以JSON格式传值到前台,相当于是写JSON数据接口,不用在每个方法中一个一个的加@ResponseBody注解
@Autowired(按类型注入)对类成员变量、方法及构造函数进行标注,完成自动装配的工作。根据bean类型从spring上下文中进行查找,注册类型必须唯一,否则报异常。简单来说就是调用Bean对象,告诉spring这个是存在与被管理的容器中。【按类型:当Spring容器中存在一个与指定属性类型相同的bean对象时,就将该属性进行自动装配;如果存在多个该类型的bean对象时,就报出异常,并指出不能使用按类型进行自动装配;如果没有找到匹配的bean对象,则什么事都不发生。】
@Resource(按名称注入)和@Autowired类似,@Resource默认按bean的name进行查找,如果没有找到会按type进行查找。【按名称:根据属性名进行自动装配,会检查Spring容器中与该属性名完全一致的bean对象,进行自动装配。】
@PostMapping组合注解,是@RequestMapping(method = RequestMethod.POST)的缩写,注解将HTTP POST映射到特定的处理方法上,当请求方式为POST方式时使用,作用:对应增加,表明是一个增加URL映射
@GetMapping组合注解,是@RequestMapping(method = RequestMethod.GET)的缩写,注解将HTTP GET映射到特定的处理方法上,当请求方式为GET方式时使用,作用:对应查询,表明是一个查询URL映射
@DeleteMapping组合注解,是@RequestMapping(method = RequestMethod.DELETE)的缩写,作用:对应删除,表明是一个删除URL映射
@PutMapping组合注解,是@RequestMapping(method = RequestMethod.PUT)的缩写,作用:对应修改,表明是一个更新URL映射
@PatchMapping组合注解,是@RequestMapping(method = RequestMethod.PATCH)的缩写,用于将HTTP{@code PATCH}请求映射到特定处理程序方法的注释
@ResponseBody(返回JSON格式的数据类型)将controller层的某个方法的返回对象通过适当的转换器转换成指定的格式,再写入到response对象的body区,通常返回JSON格式的数据或者XML格式的数据或者自定义mediaType内容到页面,以JSON格式传值到前台【注意:使用此注解后不会再走视图解析器,无法返回jsp页面,而是直接将数据写入到输入流中,效果等同于通过response对象输出指定格式的数据,通常指定这个类是一个数据接口时使用】
@RequestParam(获取请求参数的值)也就是问号传参(从request里面拿取值)【可以用于前台传过去的值与后台的参数名字不一致时做别名处理,以及设置参数的默认值】
其中的四个属性
value:设置别名时的别名名称
defaultValue:当没有提供请求参数或具有空值时用作回退的默认值。提供默认值隐式设置为false
name:要绑定到的请求参数的名称
required:设置是否需要该参数。默认值为true,如果请求中缺少参数则会引发异常。如果希望在请求中不存在参数时使用null值,则将其转换为false或者提供一个defaultValue,它隐式地将这个标志设置为false
例如:
在浏览器的访问地址:localhost:8080/hello?id=10
@RequestMapping(value="/hello",method=RequestMethod.GET)
// value="id"别名处理,defaultValue="1"设置默认值
public String sayHello(@RequestParam(value="id",defaultValue="1") Integer[] uid){
return "uid:"+uid; // uid=10
}
@PathVariable(获取url中的数据)在restful风格传参的时候获取路径里面的参数值(从一个URI模板里面来填充,分配URI占位符值的方法参数)【可以用于处理前台传来的参数与后台不一致时做别名处理】
其中的三个属性
value:设置别名时的别名名称
name:要绑定到的路径变量的名称
required:是否需要path变量。默认值为true,如果传入请求中缺少path变量,则会引发异常。如果希望null或Java8的Java.util修改为false。在这种情况下是可选的。例如,针对不同请求的ModelAttribute方法
例如:
在浏览器的访问地址:localhost:8080/hello/10
@GetMapping("/hello/{id}")
public String sayHello(@PathVariable("id") Integer uid){ // @PathVariable("id")别名处理
return "uid:"+uid; // uid=10
}
@PathParam(标注绑定一个路径段资源的方法参数的值)将URI参数值分配给方法参数,和spring的@PathVariable一样,也是基于模板的,这个是jboss包下面的一个实现,@PathVariable是spring的一个实现
其中的属性
value:在uri模板中使用的变量的名称。如果名称不匹配uri模板中的路径变量,则此注释注释的方法参数的值为null。返回uri模板中使用的变量的名称
例如:
在浏览器的访问地址:localhost:8080/hello/10
@GetMapping("/hello/")
public String sayHello(@PathParam("uid") Integer uid){
return "uid:"+uid; // uid=10
}