一、如何定义一个MethodHandler?
1.@Controller注解修饰的类
1.注册成Spring Bean
2.表示它是一个SpringMVC下的Controller
2.在这个类下的方法中,只要被@RequestMapping修饰&&方法的形参符合规定(需要看文档) + 方法的返回值符合规定 (需要看文档)
1.不用在意方法的名字
2.不用在意方法的返回值签名
@RequestMapping(value = path) == @RequestMapping(path)
变形如下:
@RequestMapping(value = path, method = GET/POST)
@GetMapping / @PostMapping
@RequestMapping修饰类,直接给这个类的所有方法前面添加统一的URL path前缀
支持的方法形参:
1.原生的Servlet模式
void...(HttpServletRequest req, HttpServletResponse resp);
2.@RequestParam(...)注解修饰的 请求参数
修饰形参时,@RequestParam可以省略,表示形参的值来自请求参数
默认情况下String,也可以使用其他基本类型替换
3.HttpSession
二、什么是UUID
UUID是通用唯一识别码的缩写,是一种软件建构的标准。目的是让分布式系统中的所有元素都能有唯一的辨识信息,不需要中央控制器来做辨识信息的指定。每个人都可以创建与其他人不冲突的UUID,就不需要考虑数据库创建时的名称重复问题。
比如,临时文件的文件名就是UUID形成的。
三、redirect 和 forward有啥区别?
重定向:买《暗杀》,老师告诉你应该买《活着》,又去买《活着》了
有两次HTTP请求
转发:买《暗杀》,老师找了一本《活着》换成《暗杀》的名字给你
只有一次HTTP请求
MVC能工作的前提:引入thymeleaf依赖
如果不引入,返回的所有view-name都被视为forward
四、AOP
AOP:并不是spring独有的功能,只是一种理念。
AOP——靠对象代理完成
对象代理能力:AOP、Mybatis
JDK原生提供的对象代理能力,只能作用到接口上,必须要有一个接口(限制比较大),所以,由第三方库CHLib,专门去做对象代理,功能更强大!
从代码组织的角度,这种代码的组织方式有缺点,如果公共部分要重构,则需要调整一堆源码文件。(改动越多,出错的风险越大)
使用Spring中AOP。Spring并没有支持所有的概念,是AOP的概念。
1.要使用AOP需要修改依赖关系:
2.如何定义一个切面?
1.首先把类注册到spring @Component 2.需要声明这个类是一个 切面类 如果导入的时候没有@Aspect 注解,说明你忘记更改pom.xml中的spring-boot-starter-aop @Aspect //这样,就定义了一个切面出来public class MyAspect {
对象代理(使用Proxy对象,替代Target对象)
调用的时候,优先把控制权交给Proxy去处理
配合IOC,功能更强大了。
功能上,实现AOP +Mybatis原理
AOP是面向切面编程。(切面、切点、通知)(编织、连接点...)
编织: JDK原生 / CGLib
使用:@Aspect + @Component定义切面类
@Pointcut("...") 定义切点(表现在Spring中是一个方法体,方法体是空的)
表达式: "execution(...)" "annotation(...)"
通过@Before、@AfterThrowing、@Around定义通知(Advice)
AOP能生效,原理就是对象代理在起作用。 切面、切点、通知缺一不可 && 不能通过this调用