0.过滤器和拦截器
过滤前-拦截前-action执行-拦截后-过滤后
1.过滤器(Filter)数据处理
初始化init【web启动就初始化】
链doFiltier才能继续执行
销毁【web关闭时】
2.拦截器(类似与servlet相似)(aop思想)springmvc
继承HandlerInterInterceptor
preHandle true放行 处理前
postHandle处理后 日志
afterCompetion清除
1.springmvc的步骤
1.客户端请求到前端控制器(dispatcherServlet)
2.前端控制器请求处理映射器(handlemapping)查询url返回要handle处理对象
3.前端控制器在同处理适配器(handleadapter)执行handle处理器返回 modelandview
4.在通过视图解析器返回视图结果给客户端
5.浏览器渲染页面
//1.请求dispatcherServlet执行doService方法
//2.doService方法中执行doDispatch方法
//3.遍历handlemappings通过request对象返回一个人执行链HandlerExecutionChain
//4.执行链去获得一个HandlerAdapter适配器
//5.handleadapter执行handle处理器返回 modelandview
//6.视图解析器解析modelandview返回视图结果给客户端将数据存放在request对象作用域下
DispatchServlet doService(request, response)
doDispatch(request, response){
HandlerExecutionChain mappedHandler = getHandler(processedRequest){
for (HandlerMapping mapping : this.handlerMappings) {
HandlerExecutionChain handler = mapping.getHandler(request);
if (handler != null) {
return handler;
}
}
}
HandlerAdapter ha = getHandlerAdapter(HandlerExecutionChain.getHandler());
ModelAndView mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException){
render(mv, request, response){
InternalResourceView.exposeModelAsRequestAttributes(model, request){
request.setAttribute(name, value);
}
}
}
}
2.spring框架
1.核心思想:IOC(控制反转)、AOP(面向切面编程)
IOC:将创建类的权利通过程序员托管给spring容器管理,同时容器会将你所依赖的类都创建并且注入,依赖注入(工厂模式加反射机制。)
AOP:面向切面编程:将非必须业务的提取出来专注完成,在到需要的时候将业务横向切入到对应的位置。实现原理动态代理
2.静态代理和动态代理
静态代理,就是在类创建一个代理类,这样就不用直接去访问具体类,直接访问操作代理类来进行操作
缺点每一个真实对象都需要有个代理对象
动态代理(jdk动态代理/cglib继承)
proxy 生成代理类
invocationhandler in vr ka tion hand l 处理真实对象返回结果
1. 若目标对象实现了若干接口,spring使用JDK的java.lang.reflect.Proxy类代理。
优点:因为有接口,所以使系统更加松耦合
缺点:为每一个目标类创建接口
2. 若目标对象没有实现任何接口,spring使用CGLIB库生成目标对象的子类。
优点:因为代理类与目标类是继承关系,所以不需要有接口的存在。
缺点:因为没有使用接口,所以系统的耦合性没有使用JDK的动态代理好。
spring
1.IOC底层原理
基于容器完成的,底层就是一个对象工厂
2.IOC核心接口BeanFactory和ApplicationContext
BeanFactory加载配置文件不会创建里面的对象,使用的时候才会才会创建对象
ApplicationContext加载配置文件就会创建里面的对象,web在启动时候就加载。
3.实现类
FileSystemXmlApplicationContext(加载文件目录全路径下的某个文件)
ClassPathXmlApplicationContext(加载resources路径下文件名)
4.IOC操作bean管理(两个操作)(两种方式【xml】【注解(aop)】)
spring创建对象(默认执行无惨的构造方法)
spring注入属性(set注入、有参构造方法)DI:依赖注入,就是注入属性
注入属性步骤创建对象->注入属性
5.spring两种bean
普通bean 定义和返回类型一致
工厂bean【FactoryBean】可以定义返回bean返回类型,定义的和返回类型可以不一样
5.工厂Bean、Bean作用域、Bean生命周期
FactoryBean接口实现方法:
返回对象()、返回类型()、是否单例()
Bean作用域(默认单例)
单例【加载创建】、多例【调用创建】、request、session
Bean生命周期(aop)
(1)通过构成方法创建bean实例
(2)set注入属性
把bean实例传入后置处理器的方法postProcessBeforeInitialization
(3)调用bean初始化的方法(需要进行配置)
把bean实例传入后置处理器的方法postProcessAfterInitialization
(4)bean对象获得
(5)关闭容器,调用bean的销毁的方法(需要进行配置)
6.手动装配、自动装配
手动装配:根据标签指定的属性或类型
自动装配:不需要指定,spring自动将匹配的属性值进行注入
Autowired中
byName:名称和属性名一致
byType:相同类型bean会报错【最好唯一】
7.注解(aop)
引入aop
创建对象:开始组件扫描【可以指定规则扫瞄】扫描与不扫描
属性注入:
@Autowired:根据属性类型自动装配
@Qualifier:根据属性名称进行注入
@Resource: 根据根据类型/名称注入
8.aop
动态代理
jdk接口代理 创建接口实现类代理对象
1.创建接口,实现接口方法
2.创建代理对象代码实现InvocationHandler重写invoke方法实现增强方法代码
3.使用Proxy.newProxyInstance()使用
cglib代理 创建与当前类子类的代理对象
9.AOP(术语)
1.连接点:那些方法可以被增强
2.切入点:实际被真正增强的方法
3.通知(增强):实际增强的逻辑【日志】、【权限】
前置:方法之前
后置:方法之后
环绕:方法前后都
异常:异常执行
最后:都会执行如finally(d动作)
4.切面:把通知添加到切入点中
10.spring中基于Aspectj实现aop操作
xml、注解
11.事务
1.事务特征(ACID)
原子性:事务最小单位不可再分
一致性:要么全成功要么全回滚
隔离性:两个事务直接是相互隔离的
持久性:事务一旦提交就持久化到硬盘
2.事务隔离性的隔离级别
读未提交 ------------------脏的、不可重复的、幻读
读已提交(orl)------------不可重复的(未必是错)、幻读(添加的时候)
可重复度(mysql默认隔离级别)-
串行化----------------------
脏读:在一个事务中读取到另一个事务没有提交的数据
不可重复读:在一个事务中,两次查询的结果不一致(针对的update操作)
虚读(幻读):在一个事务中,两次查询的结果不一致(针对的insert操作)
12.事务操作
编程式事务
声明式事务(xml、注解)
TransactionManager接口PlatformTransactionManager
创建一个事务管理器DatasourceTransactionManager
注入数据源Datasource
开启注解->添加事务注解@Transactional(类、方法)
事务传播行为:多事务方法
【事务方法:更新操作】
add1,add2基于add1去描述的
1.REQUIRED:如果有在当前事务内执行,否则创建一个新事物
2.REQUIRES_NEW:当前有没有事务都创建事务
3.NESTED
4.NEVER
5.NOT_SUPPORTED
6.MANDATORY
7.SUPPORTS
隔离级别
出现问题【脏读、不可重复读、虚读(幻读)】
超时时间
是否只读
回滚
不回滚
https://www.bilibili.com/video/BV1Vf4y127N5
3.mybatis
mybatis中#、$的区别
(1)#{} 占位符、sql预编译、防止sql注入
(2)${} 拼接符、sql拼接、不能
缓存
a.一级缓存 一次SqlSession回话结束清除缓存
b.二级缓存 同一个mapper文件都有效
请求--先在二级缓存中找--没有然后在一级缓存中找--找不到在查询数据库--请求结束后保存在二级缓存中
缓存回收策略
先进先出(FIFO)、最近做少使用的(LRU)
c.三级缓存 rides
执行步骤:
1、 创建SqlSessionFactory
2、 通过SqlSessionFactory创建SqlSession
3、 通过sqlsession执行数据库操作
4、 调用session.commit()提交事务
5、 调用session.close()关闭会话
多个参数传递
1.顺序传参法
#{0}、#{1}
2.@Param注解传参法
3.Map传参法
4.java bean传参法
mybatis如何批量操作
foreach标签
item 表示集合中每一个元素进行迭代时的别名,随便起的变量名;
open 表示该语句以什么开始
close 表示以什么结束
separator 循环之间以什么符号作为分隔符
collection 表示传集合
1.如果传入单参数且参数类型是一个List的时候,collection属性值为list
2.如果传入单参数且参数类型是一个array数组的时候,collection属性值为array
3.如果传入是多参数封装成map,collection的属性值是map的key值
4.rpc通信、序列化
5.springboot
springboot
1.优点
快速创建独立运行的spring项目以及与主流框架集成
使用嵌入式的servlet容器,应用无需打成war包
starters自动依赖与版本控制
大量的自动配置,简化开发,也可以修改默认值
无需配置xml,无代码生成,开箱即用
2.原理
1.spring-boot-starter-parent 父依赖 spring-boot-dependencies 管理所有依赖
2.springboot将功能场景都抽取出来,做成了一个个starter(启动器)
3.@SpringBootApplication主配置类
@SpringBootConfiguration //springboot配置类 --@Configuration//配置类容器的一个组件
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
@EnableAutoConfiguration //开启自动配置
@AutoConfigurationPackage//自动配置包
@Import(AutoConfigurationPackages.Registrar.class)//spring将主配置类包下的所在包及子包扫描在
@Import(AutoConfigurationImportSelector.class) //自动配置导入选择器
SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class,ClassLoader);
META-INF/spring.factories 获取EnableAutoConfiguration值,将值导入容器中,自动配置类生效
spring-boot-test-autoconfigure-2.3.1.RELEASE.jar
https://niceseason.github.io/2020/04/18/springboot/
https://note.clboy.cn/#/?id=syl%e7%9a%84%e7%ac%94%e8%ae%b0笔记
注解 | 描述 |
@RequestBody | 注解实现接收http请求的json数据,将json转换为java对象 |
@ResponseBody | 注解实现将conreoller方法返回对象转化为json对象响应给客户 |
@Autowired | 默认是按照类型装配注入的,默认情况下它要求依赖对象必须存在(可以设置它required属性为false) |
@Resource | 默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入 |
@PathVariable | URL参数变量 |