Java注解,做个笔记。
前两天学习Spring Boot整合Redis时候写的测试类中,地址栏输入请求后页面找不到。然后就查了一下,也开始了Java注解的学习之路。
1 |
|
这要从@RequestMapping说起
@RequestMapping
这个注解会将 HTTP 请求映射到Control的处理方法上.
1 |
|
/home
请求由get()
方法处理,返回methodName IndexController.get()
/home/index
请求由index()
方法处理,返回methodName IndexController.index()
基本上是我接触到的第一个注解了。
还可以指定一个多个请求指向一个处理方法
1 |
|
/home
,/home/page
./home/all
都由get()方法处理。
@RequestMapping还可以指定请求方式
1 |
|
默认的请求都是get,指定请求方式时跳转对应的处理方法处理方法,使用post请求/home
时返回methodName IndexController.post()
.
常用功能先到这里吧,但是我不禁陷入了沉思,还有很多用法,在现在的项目里用不到,我到底要不要整理,不整理,就感觉学的不透彻(虽然整理了还是会忘掉)。可是整理吧,就是个蚂蚁窝,可能把整个草原都翻一遍。时间太长,用不到就是在做无用功。希望有过这种经历,并有想法的可以通过右下角告诉我。
@RequsetParam
1 |
|
@RequestParam将请求参数绑定到处理方法的形参上。
/home/getParamByName?name=1
,页面返回1,如果请求的时候没带参数将使用默认值2。/home/getParamById?id=2
,页面返回2.如果请求参数和形参同名情况下可以省略注解内的名称。其实,同名情况可以将@RequestParam
都省略掉。
@ResponseBody
@Responsebody
注解表示该方法的返回的结果直接写入 HTTP 响应正文(ResponseBody)中,一般在异步获取数据时使用,通常是在使用 @RequestMapping
后,返回值通常解析为跳转路径,加上@Responsebody
后返回结果不会被解析为跳转路径,而是直接写入HTTP 响应正文中。
这就到了一开始说到了为什么类用了@Controller
注释再用@RequestMapping
返回字符串显示找不到页面的情况了。
可以给方法加上@ResponseBody
或者将@Controller
换成@RestController
。
原来返回指定页面的也会因为使用了@RestController
而显示路径名。
说道ResponseBody不说RequestBody有点对不住他
@RequestBody
Get请求没有请求体,要使用@RequestBody可以用post提交请求。
一个请求请求只有一个@RequestBody,一个请求可以有多个@RequestParam
1 | "/testRequestParam") ( |
userId=1userName=2password=3phone=4
User(userId=1, userName=2, password=3, phone=4)
GET使用x-www-form-urlencoded会报错
{
“timestamp”: “2019-07-11T10:42:03.750+0000”,
“status”: 400,
“error”: “Bad Request”,
“message”: “Required Integer parameter ‘userId’ is not present”,
“path”: “/test/testRequestBody”
}
POST请求下@RequestParam获取使用x-www-form-urlencoded返回结果与GET请求使用form-data相同
但是如果想批量传参,就需要用到RequestBody
1 | "/testRequestBody") ( |
console:
User(userId=1, userName=2, password=3, phone=4)
User(userId=5, userName=6, password=7, phone=8)
@Resource和@Autowired
spring扫描自动命名机制-将类的首字母小写当做name。
bean有两个重要属性,名称(id)和类型(class )
@Resource和@Autowired都是用来注入bean的。但两者有一些不同。
@Resource
@Resource并不是Spring的默认注解,需要导入javax.annotation.Resource包使用。
@Resource有两个属性:name
和type
,可以注解属性和setter方法。
1 | public Class UserManager{ |
@Resource装配顺序:
- 如果同时指定了
name
和type
,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。 - 如果指定了
name
,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。 - 如果指定了
type
,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常 - 如果既没有指定
name
,又没有指定type
,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。
@Resource的作用相当于@Autowired,只不过@Autowired按照byType自动注入。
@Autowired
@Autowired只会按照type
进行注入。
1 | public class UserManager { |
@Autowired注入,默认要求被注入的bean是存在的,如果允许为null,则可以将它的required属性置为false
如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。
1 | public class UserManager { |
@Autowired默认先按byType进行匹配,如果发现找到多个bean,则又按照byName方式进行匹配,如果还有多个,则报出异常。