Spring Boot学习笔记5:Springboot常用注解总结

@SpringBootApplication

通常注解在主类上,此注解是个组合注解,包括了@Configuration@EnableAutoConfiguration@ComponentScan

@Configuration

注解当前类是配置类,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到Spring容器中,并且实例名就是方法名。

@EnableAutoConfiguration

让 Spring Boot 根据应用所声明的依赖来对 Spring 框架进行自动配置,试图猜测和配置可能需要的Bean,一般加在主类上。

@ComponentScan

扫描当前包及其子包下被@Component@Controller@Service@Repository等注解标记的类并纳入到Spring容器中进行管理,一般放在根目录下。

@Bean

注解在方法的上,而不是类上,意思是产生一个Bean,并交给Spring管理。

@Service

注解在类上,表示这是一个业务层Bean。

@Controller

注解在类上,表示这是一个控制层Bean。

@Repository

注解在类上,表示这是一个数据访问层Bean。

@Component

注解在类上,表示通用Bean ,当组件不好归类的时候,我们可以使用这个注解进行标注。

@Scope

注解在类上,描述spring容器如何创建Bean实例。

  • singleton: 默认值,表示在spring容器中的单例,通过spring容器获得该bean时总是返回唯一的实例;
  • prototype:表示每次获得bean都会生成一个新的对象;
  • request:表示在一次http请求内有效(只适用于web应用);
  • session:表示在一个用户会话内有效(只适用于web应用);
  • globalSession:表示在全局会话内有效(只适用于web应用);

@Autowired

按类型注入把配置好的Bean拿来用,完成属性、方法的组装,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。

当加上(required = false)时,就算找不到bean也不报错。

@Resource

按名称注入把配置好的Bean拿来用。与@Autowired功能类似。

可以加上(name = "name",type = "type")

@Qualifier

当有多个同一类型的Bean时,可以用@Qualifier("name")来指定。与@Autowired配合使用。

@RestController

此注解是个组合注解,包括了@Controller@ResponseBody。原来在@Controller中返回JSON需要@ResponseBody来配合,如果直接用@RestController替代@Controller就不需要再配置@ResponseBody,默认返回JSON格式。

@Responsebody

注解表示该方法的返回的结果直接写入 HTTP 响应正文(ResponseBody)中。一般在异步获取数据时使用,通常是在使用 @RequestMapping 后,返回值通常解析为跳转路径,加上@Responsebody 后返回结果不会被解析为跳转路径,而是直接写入HTTP 响应正文中。

@RequestMapping

@RequestMapping("/path")是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。该注解有六个属性:

  • params:指定request中必须包含某些参数值是,才让该方法处理;
    • params = "param":表示请求必须包含名为 param的请求参数;
    • params = "!param":表示请求不能包含名为 param的请求参数;
    • params = "param= value":表示请求包含名为 param的请求参数,但其值必须为 value;
    • params = "param!= value":表示请求包含名为 param的请求参数,但其值不能为 value;
  • headers:指定request中必须包含某些指定的header值,才能让该方法处理请求;
  • value:指定请求的实际地址,指定的地址可以是URI Template 模式;
  • method:指定请求的method类型, RequestMethod.GET/POST/PUT/DELETE等;
  • consumes:指定处理请求的提交内容类型(Content-Type),如application/json,text/html;
  • produces:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;

@GetMapping/@PostMapping/@PutMapping/@DeleteMapping

等价于@RequestMapping(method = RequestMethod.GET/POST/PUT/DELETE)

@RequestParam

注解在方法的参数前面,表示注入请求的参数,它有三个属性:

  • value:请求参数名(必须配置),默认为方法参数名;
  • required:是否必需,默认为 true,即请求中必须包含该参数,如果没有包含,将会抛出异常(可选配置);
  • defaultValue:默认值,如果设置了该值,required 将自动设为 false,无论你是否配置了required,配置了什么值,都是 false(可选配置);

@PathVariable

注解在方法的参数前面,配合@RequestMapping("/path")使用表示注入请求的路径变量,参数与路径内大括号里变量的名字一样要相同。如:

RequestMapping(“user/{userId}) 
public String getByMacAddress(@PathVariable String userId){ 
//do something; 
} 

@RequestAttribute

注解在方法的参数前面,可以被用于访问由过滤器或拦截器创建的、预先存在的请求属性。

@ModelAttribute

此注解既可被用于方法、也可用于参数上。

注解在方法上,会在每一个@RequestMapping注解的方法前执行,如果有返回值,则自动将该返回值加入到Model中:

  • @ModelAttribute注解void返回值的方法:
/*
 	这种情况下,@ModelAttribute注解的方法在@RequestMapping注解的方法之前先被调用;
 	在获得请求/helloWorld后,populateModel方法在helloWorld方法之前先被调用;
	populateModel方法把请求(/helloWorld?param={value})的param参数值value加入到Model一个名为key的属性中;
	populateModel方法执行后 helloWorld方法被调用,返回View名helloWorld和已由@ModelAttribute方法生产好的Model。
*/
@Controller 
public class HelloWorldController { 
	@ModelAttribute
	public void populateModel(@RequestParam String param, ModelMap modelMap) { 
		modelMap.addAttribute("key", param); 
	} 
	@RequestMapping("/helloWorld") 
		public String helloWorld() { 
			return "helloWorld"; 
	} 
}
  • @ModelAttribute注解返回具体对象的方法:
 /*
	这种情况下,默认将方法的返回对象加入Model属性中,默认属性名为对象类名首字母小写表示;
	如这个方法返回HelloObject类型,那么这个方法等价于modelMap.addAttribute("helloObject", HelloObject(param))。
 */
public class HelloWorldController { 
	@ModelAttribute
	public HelloObject populateModel(@RequestParam String param) { 
		return new HelloObject(param);
	} 
	@RequestMapping("/helloWorld") 
		public String helloWorld() { 
			return "helloWorld"; 
	} 
}
  • @ModelAttribute(value="key")注解返回具体对象的方法
 /*
	这种情况下,将方法的返回对象加入Model属性中,并指定属性名为value;
	如这个方法返回HelloObject类型,那么这个方法等价于modelMap.addAttribute("key", new HelloObject(param))。
 */
public class HelloWorldController { 
	@ModelAttribute("key")
	public HelloObject populateModel(@RequestParam String param) { 
		return new HelloObject(param);
	} 
	@RequestMapping("/helloWorld") 
		public String helloWorld() { 
			return "helloWorld"; 
	} 
}
  • @ModelAttribute@RequestMapping同时注解一个方法
/*
	这种情况下,同之前@ModelAttribute注解返回具体对象的方法一样,但是返回值就不再是View名了;
	如这个方法,那么这个方法等价于modelMap.addAttribute("key", "hello")。
	同时View名直接转换为@RequestMapping对应的值helloWorld,交给页面解析后就是helloWorld.html。
*/
@Controller 
public class HelloWorldController { 
	@RequestMapping("/helloWorld") 
	@ModelAttribute("key") 
	public String helloWorld() { 
		return "hello"; 
	} 
}

注解在参数上,会将客户端传递过来的参数按名称注入到指定对象中,并且会将这个对象自动加入Model中,便于View层使用:

  • 直接从Model中获取值
/*
	这种情况下,@ModelAttribute注解的方法在@RequestMapping注解的方法之前先被调用;
	populateModel方法的返回对象加入model属性中,并指定属性名为value;
	populateModel方法返回HelloObject类型,那么这个方法等价于modelMap.addAttribute("key", new HelloObject("helloWorld"));
	之后调用helloWorld方法,被@ModelAttribute("key")注解的helloObject对象将被自动注入,等价于helloObject = modelMap.getAttribute("key");
*/
@Controller 
public class HelloWorldController { 
	@ModelAttribute("key") 
	public HelloObject populateModel() { 
		return new HelloObject("helloWorld"); 
	} 
	@RequestMapping(value = "/helloWorld") 
	public String helloWorld(@ModelAttribute("key") HelloObject helloObject) { 
		helloObject.setValue("hello"); 
		return helloObject.getValue(); 
	} 
}
  • 从Form表单或URL参数中获取(实际上,不做@RequestMapping注释也能拿到user对象)
/*
SpringMVC会自动匹配页面传递过来的参数和@RequestMapping注解的方法中的参数名;
如果参数名相同,会自动匹配;
如果控制器中方法是封装的Bean,会自动匹配Bean中的属性,注意这时候这个Bean类一定要有没有参数的构造函数。
*/
@Controller
public class HelloWorldController {  
	@RequestMapping(value = "/helloWorld")  
	public String helloWorld(@ModelAttribute HelloObject helloObject) {  
		return "helloWorld";  
	}  
}
  • 注解在一个方法的返回值上:
/*
	这种情况等价于@ModelAttribute和@RequestMapping同时注解一个方法
*/
@Controller 
public class HelloWorldController { 
	@RequestMapping("/helloWorld") 
	public @ModelAttribute("key") String helloWorld() { 
		return "hello"; 
	} 
}

@SessionAttributes

注解在类上,Model属性的生命周期在Request结束后就被销毁,若希望在多个请求之间共用某个模型属性数据,则可以在控制器类上标注一个 @SessionAttributes,Spring MVC将在模型中对应的属性暂存到 HttpSession 中,Model属性在Session生命周期结束前都不会被销毁。

Session结束生命周期,有以下两种办法:

  • 一个是Session.invalidate()方法,不过这个方法在实际的开发中,并不推荐,可能在强制注销用户的时候会使用;
  • 一个是当前用户和服务器的交互时间超过默认时间后,Session会失效。

@SessionAttributes有两个属性:

  • value:要保存到Session中的参数名称
  • typtes:要保存到Session中的参数类型

两个属性k可以搭配使用:

  • @SessionAttributes(value="user")
  • @SessionAttributes(typtes=User.class)
  • @SessionAttributes(value="user", typtes=User.class)把Model中属性名为user且属性类型为User的属性保存到Session中;
  • @SessionAttributes(value={"user", "dept"})
  • @SessionAttributes(typtes={User.class, Dept.class})
  • @SessionAttributes(value={"user", "dept"}, typtes={User.class, Dept.class})把Model中属性名为user且属性类型为User的属性和属性名为dept且属性类型为Dept的属性保存到Session中;

@SessionAttribute

注解在参数上,类似于@ModelAttribute,来访问预先存在的全局会话属性。

@RequestAttribute

注解在参数上,类似于@SessionAttribute,来访问请求属性。

@ConfigurationProperties

把配置文件的信息,读取并自动封装成实体类,例如在配置文件里面,有如下信息:

org.csu.springboot_properties.user.name=O大叔Tz
org.csu.springboot_properties.user.age=23

这时候可以定义一个实体类来装载配置文件信息:

@Component
@ConfigurationProperties(prefix="user")
@Data
public class User {
	private String name;
	private int age;
}

或者还可以直接定义在@Bean的注解上,这时Bean实体类就不用@Component@ConfigurationProperties

@Bean
@ConfigurationProperties(prefix = "user")
public ConnectionSettings connectionSettings(){
	return new ConnectionSettings();
}

这时就可以将配置文件属性自动注入一个实体对象

@Autowired
private User usr;

@Profiles

Spring Profiles提供了一种隔离应用程序配置的方式,并让这些配置只能在特定的环境下生效。

任何@Component@Configuration都能被@Profile标记,从而限制加载它的时机。

@Configuration  
@Profile("prod")  
public class ProdConfiguration {  
//... 
}  

@ControllerAdvice

统一处理异常,包含@Component注解。

@ExceptionHandler(Exception.class)

注解在方法上,表示遇到这个异常就执行以下方法。

猜你喜欢

转载自blog.csdn.net/qq_28032693/article/details/88293240