通常注解在主类上,此注解是个组合注解,包括了@Configuration
、@EnableAutoConfiguration
、@ComponentScan
。
注解当前类是配置类,并会将当前类内声明的一个或多个以@Bean
注解标记的方法的实例纳入到Spring容器中,并且实例名就是方法名。
让 Spring Boot 根据应用所声明的依赖来对 Spring 框架进行自动配置,试图猜测和配置可能需要的Bean,一般加在主类上。
扫描当前包及其子包下被@Component
,@Controller
,@Service
,@Repository
等注解标记的类并纳入到Spring容器中进行管理,一般放在根目录下。
注解在方法的上,而不是类上,意思是产生一个Bean,并交给Spring管理。
注解在类上,表示这是一个业务层Bean。
注解在类上,表示这是一个控制层Bean。
注解在类上,表示这是一个数据访问层Bean。
注解在类上,表示通用Bean ,当组件不好归类的时候,我们可以使用这个注解进行标注。
注解在类上,描述spring容器如何创建Bean实例。
singleton
: 默认值,表示在spring容器中的单例,通过spring容器获得该bean时总是返回唯一的实例;prototype
:表示每次获得bean都会生成一个新的对象;request
:表示在一次http请求内有效(只适用于web应用);session
:表示在一个用户会话内有效(只适用于web应用);globalSession
:表示在全局会话内有效(只适用于web应用);按类型注入把配置好的Bean拿来用,完成属性、方法的组装,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。
当加上(required = false)
时,就算找不到bean也不报错。
按名称注入把配置好的Bean拿来用。与@Autowired
功能类似。
可以加上(name = "name",type = "type")
。
当有多个同一类型的Bean时,可以用@Qualifier("name")
来指定。与@Autowired配合使用。
此注解是个组合注解,包括了@Controller
、@ResponseBody
。原来在@Controller
中返回JSON需要@ResponseBody
来配合,如果直接用@RestController
替代@Controller
就不需要再配置@ResponseBody
,默认返回JSON格式。
注解表示该方法的返回的结果直接写入 HTTP 响应正文(ResponseBody)中。一般在异步获取数据时使用,通常是在使用 @RequestMapping
后,返回值通常解析为跳转路径,加上@Responsebody 后返回结果不会被解析为跳转路径,而是直接写入HTTP 响应正文中。
@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)类型中包含该指定类型才返回;等价于@RequestMapping(method = RequestMethod.GET/POST/PUT/DELETE)
。
注解在方法的参数前面,表示注入请求的参数,它有三个属性:
value
:请求参数名(必须配置),默认为方法参数名;required
:是否必需,默认为 true,即请求中必须包含该参数,如果没有包含,将会抛出异常(可选配置);defaultValue
:默认值,如果设置了该值,required 将自动设为 false,无论你是否配置了required,配置了什么值,都是 false(可选配置);注解在方法的参数前面,配合@RequestMapping("/path")使用表示注入请求的路径变量,参数与路径内大括号里变量的名字一样要相同。如:
RequestMapping(“user/{userId}”)
public String getByMacAddress(@PathVariable String userId){
//do something;
}
注解在方法的参数前面,可以被用于访问由过滤器或拦截器创建的、预先存在的请求属性。
此注解既可被用于方法、也可用于参数上。
注解在方法上,会在每一个@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层使用:
/*
这种情况下,@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();
}
}
@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";
}
}
注解在类上,Model属性的生命周期在Request结束后就被销毁,若希望在多个请求之间共用某个模型属性数据,则可以在控制器类上标注一个 @SessionAttributes
,Spring MVC将在模型中对应的属性暂存到 HttpSession 中,Model属性在Session生命周期结束前都不会被销毁。
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中;注解在参数上,类似于@ModelAttribute
,来访问预先存在的全局会话属性。
注解在参数上,类似于@SessionAttribute
,来访问请求属性。
把配置文件的信息,读取并自动封装成实体类,例如在配置文件里面,有如下信息:
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;
Spring Profiles提供了一种隔离应用程序配置的方式,并让这些配置只能在特定的环境下生效。
任何@Component
或@Configuration
都能被@Profile
标记,从而限制加载它的时机。
@Configuration
@Profile("prod")
public class ProdConfiguration {
//...
}
统一处理异常,包含@Component
注解。
注解在方法上,表示遇到这个异常就执行以下方法。
Springboot Study.