天天看点

Spring SpringMVC常用注解一. Spring常用注解二. SpringMVC常用注解

一. Spring常用注解

@Controller、@Service 、@Repository是@Component的衍生注解,功能同@Component
	@Controller   用于Controller层的类
	@Service      用于Service层的类
	@Repository   用于Dao层的类
	这四个注解功能一样,都是代表将某个类注册到Spring中
	
           
@Autowired 它可以对类成员变量、方法及构造函数进行标注,让 spring 完成 bean 自动装配的工作。
	@Autowired 默认是按照类去匹配,配合 @Qualifier 指定按照名称去装配 bean。
	作用:**设置属性的对象** 或对方法进行传参
	public class ClassName {
	    @Autowired(required = false /*required:定义该属性是否允许为null,默认true*/)
	    @Qualifier("userDao")   //@Qualifier- value:需要注入的bean的id
	    private UserDao userDao;
	
	    @Resource(name = "userDao")
	    private UserDao userDao;
	}
	说明:
	@Autowired  按类型装配,一般生产中都使用它
	@Qualifier  可以指定bean的id,一般用于有多个同一类型bean的场景。

           
类型:**属性注解**、方法注解
	作用:**设置属性的值**或对方法进行传参
	范例:
	    @Value("李四")    
	    private String name;
	
	    @Value("本奇")
	    public void setName(String name) {
	        this.name = name;
	    }
	
	    @Value("${jdbc.username")//配置文件赋值
	    private String username;
	
	说明:
	  @value一般用于读取properties文件中的属性值
	  **注解的方式注入非引用类型,不需要setter方法**
  
           
@Scope(作用域)
	Scope,也称作用域,在 Spring IoC 容器是指其创建的 Bean 对象相对于其他 Bean 对象的请求可见范围。
	在 Spring IoC 容器中具有以下几种作用域:
	基本作用域(singleton、prototype),Web 作用域(reqeust、session、globalsession),自定义作用域。
	
	- 范例:
	// 默认为singleton
	@Scope("prototype")
	public class ClassName{}
	
	- 相关属性    
	singleton:单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例。
	
	prototype:原型模式,每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例。
	
	request:对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,即每次HTTP请求将会产生不同的Bean实例。
	只有在Web应用中使用Spring时,该作用域才有效。
	
	session:对于每次HTTP Session,使用session定义的Bean豆浆产生一个新实例。
	同样只有在Web应用中使用Spring时,该作用域才有效。
	
	globalsession:每个全局的HTTP Session,使用session定义的Bean都将产生一个新实例。
	典型情况下,仅在使用portlet context的时候有效。同样只有在Web应用中使用Spring时,该作用域才有效。
	
	其中比较常用的是singleton和prototype两种作用域。对于singleton作用域的Bean,每次请求该Bean都将获得相同的实例。
	容器负责跟踪Bean实例的状态,负责维护Bean实例的生命周期行为;
	如果一个Bean被设置成prototype作用域,程序每次请求该id的Bean,Spring都会新建一个Bean实例,然后返回给程序。
	在这种情况下,Spring容器仅仅使用new 关键字创建Bean实例,一旦创建成功,容器不在跟踪实例,也不会维护Bean实例的状态。
	
	如果不指定Bean的作用域,Spring默认使用singleton作用域。Java在创建Java实例时,需要进行内存申请;
	销毁实例时,需要完成垃圾回收,这些工作都会导致系统开销的增加。因此,prototype作用域Bean的创建、销毁代价比较大。
	而singleton作用域的Bean实例一旦创建成功,可以重复使用。因此,除非必要,否则尽量避免将Bean被设置成prototype作用域。

           

二. SpringMVC常用注解

@RestController
	   @RestController =  @Controller+@ResponseBody
	   因此使用@RestController替换@Controller以后,就无须在方法上添加@ResponseBody
	   @RestController是一个组合注解,写在类上面,是组合了@ResponseBody和@Controller,
	   默认了类中所有的方法都包含ResponseBody注解的一种简写形式

	@PathVariable
	作用:
	    用于绑定 url 中的占位符。例如:请求 url 中 /delete/{id},这个{id}就是 url 占位符。
	    url 支持占位符是 spring3.0 之后加入的。
	    public Map test(@PathVariable("id") Integer id){    
	    }
	    
	@RequestMapping 是 Spring Web 应用程序中最常被用到的注解之一。
		这个注解会将 HTTP 请求映射到 MVC 和 REST 控制器的处理方法上。
		并且一个处理请求地址映射的注解,可用在类或方法上。
		用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

	@XxxMapping
	    @PostMapping() <=> @RequestMapping(method = RequestMethod.POST)用于将HTTP POST请求映射到特定处理程序方法的注释。
	    @PutMapping() <=> @RequestMapping(method = RequestMethod.PUT)
	    @DeleteMapping() <=> @RequestMapping(method = RequestMethod.DELETE)	   
	    @GetMapping() <=> @RequestMapping(method = RequestMethod.GET)用于将HTTP GET请求映射到特定处理程序方法的注释。
	    
	@RequestBody这个一般处理的是在ajax请求中声明contentType: “application/json; charset=utf-8”时候。也就是json数据
	
	@RequestParam这个一般就是在ajax里面没有声明contentType的时候,为默认的urlencode格式时,用这个。

	@ResponseBody:表示该方法的返回结果直接写入HTTP response body 中,一般在异步获取数据时使用也就是AJAX


	@RestController
	@RequestMapping("/rest/user")
	@ResponseBody
	public class UserController {
	
	    @PostMapping("")
	    public Map add(@RequestBody User user){
	    }
	
	    @PutMapping("")
	    public Map update(@RequestBody User user){
	    }
	
	    @DeleteMapping("/{id}")
	    public Map delete(@PathVariable("id") Integer id){
	    }
	    
		注意,此时@PathVariable可以不写value的值,这是因为它注解参数名与占位符相同,
		如果不同就必须要写value的值,即:@PathVariable(“id”)
	    @GetMapping("/{id}")
	    public Map find(@PathVariable Integer id){
	    }
    }