1. java基础(1)
2. javaweb(1)
3. ssm+springboot+springCloud(1.5)
4. spring框架
4.1 IOC总结
4.2 BeanFactory(懒加载初始bean)和ApplicatonContext(立即初始bean)区别
4.3 spring的DI
4.4 aop
4.5 通知
5. springmvc框架
5.1 Spring容器和SpringMVC容器的区别以及关系?
5.2 SpringMVC中为什么不会出现post请求的中文乱码问题?
5.3 SpringMVC 核心处理器有那些?
5.4 SpringMVC 执行流程
5.5 SpringMVC 的拦截器和过滤器什么区别
6. Mybatis
6.1 持久层框架
6.2 mybatis在进行多表查询时,什么时候立即加载,什么时候懒加载?
6.3 # 和 $ 符号什么区别?
6.4 mybatis的缓存问题
6.5 mybatis基于接口开发
7. SSM 结束 之环绕依赖问题
8.SpringBoot
8.1. 什么SpringBoot
8.2. SpringBoot构建的项目如何部署和运行
8.3. SpringBoot和Spring(SpringMVC)框架区别
8.4. SpringBoot常用的启动器,分别有什么用
8.5. SpringBoot自动装配原理
8.6. SpringBoot 配置文件
8.6.1. 全局的配置文件(名称必须按照写)
8.6.2 自定义的配置文件
8.6.3 springBoot框架中使用启动器,启动默认自带的配置文件
8.6.4 配置文件的里面的数据是什么, 有什么作用呢?
9. SpringCloud
4. 企业开发的项目: 技术说明(1.5)
5. 面试总结(3,4)
1. java基础(1)
2. javaweb(1)
3. ssm+springboot+springCloud(1.5)
4. spring框架
4.1 IOC总结
IOC 的全称 inverse of controller , 控制反转, 之前由自己new 对象的方式反转给spring容器.
spring容器其实就是一个ConCurrentHashMap, 如何创建bean对象, 如何装配?
==基于配置文件开发:
spring容器加载和读取文件, 利用反射机制(class.newInstance(),依赖无参构造创建bean),put到map集合中
== 基于注解开发
spring容器开启扫描机制,通过@ComponentScan(“指定扫描的package包”),获取到类的全路径.
常见的注解: @Component (用到普通的javaBean),@Service(用到业务层的bean上) ,@Repository(用 在dao层)
比如: 扫描这个@Repository,就能获取cn.spring.dao.UserDataJpa,
利用Class clz=Class.forName(“cn.spring.dao.UserDataJpa”);
UserDataJpa bean = clz.newInstance(); 把bean装配到map容器中.
4.2 BeanFactory(懒加载初始bean)和ApplicatonContext(立即初始bean)区别
相同点: 都是spring容器
BeanFactory 顶层接口(父容器)
ApplicationContext 子接口(子容器)
实现初始bean对象,把bean对象装配到容器中.是以上接口的子类.
如果是普通的java项目:
*基于配置文件开发:
手动创建 ClassPathXmlApplicationContext容器对象,读取配置文件,实现初始bean对象
*基于注解开发:
手动创建AnnotationConfigApplicationContext容器对象,扫描注解,实现初始化bean对象
如果是web项目:
基于配置文件开发:
在服务器启动时, 由ContextLoadListener监听器,自动创建XmlServletWebServerApplicationContext容器对象,
读取配置文件,实现bean对象的初始化.
基于注解开发
在服务器启动时,由监听器负责自动创建AnnotationConfigWebApplicationContext容器对象,扫描注解,实现bean对象的初始化.
4.3 spring的DI
DI: 依赖注入,在一个类中注入这个类所需的bean对象.
方式一: set方法注入
方式二: 构造方法注入
基于配置文件: 实现DI,如下图
基于注解开发,实现DI
@Resource :
实现在类中注入bean对象,底层根据注入bean的类名(首字母小写,比如: cat---->Cat对象),
从容器中拿到bean对象,注入到当前类中
@Autowired:
实现在类中注入bean对象,底层根据bean的类型,从容器中拿到bean对象,注入到当前类中
Qualifier(“bean的名称”): 如果根据类型找不到, 才会 Qualifier(“bean的名称”)的bean名称找
4.4 aop
Spring框架AOP: 对业务层的方法进行增强.
应用场景: 事务控制(底层就是aop)
事务:
读问题,写问题 ,引发开发者在业务层使用事务控制
事务隔离级别
事务的传播属性
4.5 通知
通知: 就是增强的业务逻辑
分类
前置通知,后置通知,返回通知,异常通知,环绕通知
执行顺序:
前置通知: 在执行目标方法(切点)前,执行
后置通知: 在执行目标方法(切点)后,不管执行过程中,是否有异常,都会执行的通知
返回通知: 在执行目标方法(切点)后,执行,在执行过程中,有异常,返回通知不执行
异常通知: 在执行目标方法(切点)后,如果有异常,才会执行.
注意: 返回通知和异常通知不能同时执行
环绕通知配置在切点上面,如果配置了环绕通知,一般情况下不用前置,后置,返回通知.
5. springmvc框架
5.1 Spring容器和SpringMVC容器的区别以及关系?
Spring容器是父容器, 可以初始化任意层(web层,service层,dao层)的bean对象
@Component,@Controller, @Service, @Repository
SpringMVC容器称之为子容器,作用初始化web层的bean对象
@Controller
Spring容器可以初始化@Controller注解下面的bean,
SpringMVC容器可以初始化@Controller注解下面的bean,就会出现冲突.
怎么解决这个问题?
Spring容器扫描时,排除web层的@Controller注解.
SpringMVC容器扫描时,只扫描web层的@Controller注解.
5.2 SpringMVC中为什么不会出现post请求的中文乱码问题?
使用了CharacterEncodingFilter过滤器类, 默认处理了post请求的中文乱码问题.
过滤器的作用: 拦截请求和响应.
比如: 浏览器 提交post请求的中文-------->CharacterEncodingFilter过滤器(处理post乱码)-------->后台端
5.3 SpringMVC 核心处理器有那些?
中央处理器: 分发请求,比如: http://域名:port/controller的访问路径
处理映射器: 将中央处理器分发的请求进行解析,根据解析controller的访问路径,访问对应的controller
视图解析器: 将controller返回的数据展示视图页面.需要视图解析器解析视图页面.将数据展示
视图: Freemarker, Thyemleaf
数据处理器: 比如 springmvc默认使用的JaskSon,将后台的数据转成json数据进行返回
5.4 SpringMVC 执行流程
5.5 SpringMVC 的拦截器和过滤器什么区别
1).Springmvc中的拦截器interceptor用于对控制器controller进行预处理和后处理的技术;
2).可以定义拦截器链,拦截器链就是将拦截器按着一定的顺序结成一条链,在访问被拦截的方法时,拦截器链中的拦截器会按着定义的顺序执行。
3).拦截器interceptor与过滤器filter的区别
1.过滤器是servlet中的,任何框架都可以使用过滤器技术;
2.拦截器是Springmvc所独有的
3.过滤器设置/*可以拦截任何资源
4.拦截器只对控制器controller中的方法进行拦截
4).拦截器利用的是AOP思想;
5).自定义拦截器,需要实现HandlerInterceptor接口
6. Mybatis
6.1 持久层框架
myBatis(mybatisPlus, 通用mapper(简化单表操作,使用通用mapper操作单表,不用书写sql))
优点: 基于配置文件+注解, 可以灵活的书写原生sql语句
缺点: 在单表操作时,需要写sql语句,比较麻烦
springDataJpa
和 hibernate类似
hibernate
优点: 会自动生成sql语句,操作起来比较方便
缺点: 在进行多表操作时,配置hql语句比较麻烦.
6.2 mybatis在进行多表查询时,什么时候立即加载,什么时候懒加载?
| *默认是立即加载
| * 立即加载: 指的当查询一张表的数据时,将关联的表数据同时查询出来.
| * 懒加载: 指的当查询一张表的数据时,与之关联的表数据不查询.(什么时候查询关联的表数据: 需要时查询)
| * 比如: tab_order订单表,关联的订单详情表: tab_order_item
查询订单数据(订单名称,订单总金额)时,
与之关联的订单详情数据(商品名称,商品个数,商品小计金额)就需要立即加载
| * 比如: tab_order 订单表 , 关联的用户表: tab_user
查询订单表的数据时,与之关联的用户数据不用立即查询.称之为懒加载
当订单付款时, 需要将订单关联的用户数据查询出来(按需加载,就是懒加载)
总结:
当查询一方表数据时, 需要将它关联的多方表的数据查询出来, 这种情况: (一对多时:)立即加载
比如: tab_order(一方), 关联的多方: tab_order_item(多方)
当查询多方表的数据时,与之关联的一方表数据不用立即查询出来,这种情况:(多对一:)懒加载
比如: tab_order(多方), 与之关联的一方: tab_user(一方)
6.3 # 和 $ 符号什么区别?
#符号: 占位符,不会sql注入
$符号: 字符串拼接,可能会出现sql注入
6.4 mybatis的缓存问题
一级缓存: 会话级别的缓存(针对当前用户(一个线程)),
对应SqlSession,查询时,使用缓存(只能使用一次,面向一个用户)
优点: 当用户在当前会话过程中,
查询一条数据后,从数据库里面查询,放到一级缓存中,
等用户下次查询时,如果查询的sql语句一样,会从缓存中取数据.不查询数据库了.
二级缓存: 工厂级别的缓存,对应SqlSessionFactory,查询,使用缓存(面向所有所用用户)
优点: 面向所有用户.
当用户A查询一条数据后,从数据库里面查询,放到二级缓存中,
等用户A或者其它用户下次查询时,
如果查询的sql语句一样,会从缓存中取数据.不查询数据库了.
6.5 mybatis基于接口开发
模拟代码如下:
1.定义一个接口:
2.模拟代码
7. SSM 结束 之环绕依赖问题
如图描述:
解决方案:
在开发中尽量避免出现这种环绕问题.
使用spring的缓存机制: 保存spring容器初始化的bean对象.
注意,这里不是函数的循环调用,是对象的相互依赖关系。循环调用其实就是一个死循环,除非有终结条件。
Spring中循环依赖场景有:
(1)构造器的循环依赖 (在类中,通过构造方法传入依赖的对象)
(2)field属性的循环依赖(在类中,通过set方法注入依赖的对象),上图演示的: 属性的循环依赖
其中,构造器的循环依赖问题无法解决,只能拋出BeanCurrentlyInCreationException异常,在解决属性循环依赖时,spring采用的是提前暴露对象的方法(底层采用spring的三级缓存机制)。
8.SpringBoot
8.1. 什么SpringBoot
用来简化spring应用的初始搭建以及开发过程 使用特定的方式来进行配置(properties或yml文件)
创建独立的spring引用程序 main方法运行
嵌入的Tomcat 无需部署war文件
简化maven配置
自动配置spring添加对应功能starter(启动器)自动化配置
8.2. SpringBoot构建的项目如何部署和运行
开发环境: 直接启动的应用类, 启动我们的项目
生成环境: 项目开发完毕,要上线了.
方式一: springboot默认是jar包, 通过 java的jar启动命令, 来部署和运行项目.
方式二: springboot打成war包(排除springboot内嵌的tomcat), 把war包部署到tomcat服务器运行.
8.3. SpringBoot和Spring(SpringMVC)框架区别
Spring框架构建应用程序时比较麻烦,配置比较重,如果引入第三方依赖,需要手动在pom.xml配置
特别是引入核心依赖时,如果该核心依赖还有其它依赖,需要将依赖以及它的其它依赖同时在pom.xml配置
比如:
springBoot简化了spring的配置,在构建spring的应用程序时,比较方便.
springBoot通过封装启动器,将核心依赖以及直接依赖都封装进来,
在pom.xml配置时,只需引入启动器即可
总结:
spring重配置,体现pom.xml配置这里.
springBoot通过启动器,简化了配置.
8.4. SpringBoot常用的启动器,分别有什么用
spring-boot-starter-web 嵌入tomcat和web开发需要servlet与jsp支持
spring-boot-starter-data-jpa 数据库支持
spring-boot-starter-data-redis redis数据库支持
spring-boot-starter-data-solr solr支持
mybatis-spring-boot-starter 第三方的mybatis集成starter
细节:
如果启动器是以spring-boot-starter-x开头的, 那就表示该启动器是springBoot封装的
如果启动器是以x-spring-boot-starter开头的,那就表示该启动器是不是springBoot封装的,是第三方封装的
8.5. SpringBoot自动装配原理
自动装配
扫描开发者自定义带注解的类, 初始化bean对象,装配到容器(ConCurrentHashMap)
读取spring-boot-autoconfigure-版本号: spring-autoconfigure-metadata.properties这个配置文件
将配置文件配置的类, 初始化bean对象, 装配到容器(ConCurrentHashMap)
如何实现自动装配的?
如图:
8.6. SpringBoot 配置文件
8.6.1. 全局的配置文件(名称必须按照写)
注意:
1.扩展名为yml和properties,它们的配置内容是一样,在项目中只需写一种就可了
2.如果版本号不同, yml和properties配置文件的优先级不一样.
bootstarp配置文件(后缀名为yml或者 yaml)
使用Spring Cloud Config注册中心时 需要在bootStarp配置文件中添加链接到配置中 心的配置属性来 加载外部配置中心的配置信息。
一些固定的不能被覆盖的属性
一些加密/解密的场景
8.6.2 自定义的配置文件
比如: 自定义数据源配置文件 dataSource.properties
8.6.3 springBoot框架中使用启动器,启动默认自带的配置文件
spring-boot-版本号: spring.properties
spring-boot-autoconfigure-版本号:spring.properties, spring-autoconfigure-metadata.properties
8.6.4 配置文件的里面的数据是什么, 有什么作用呢?
全局配置文件: 作用配置springboot框架的的全局信息,比如: 启动的端口号
自定义配置文件: 作用配置springboot项目所需的数据信息,比如: 自定义数据源配置文件
springboot自带的配置文件
spring-boot-x: spring.properties:
里面配置的大多是监听器,监听器的作用在springboot启动时,会自动加载全局的配置文件.
当引导类执行main方法(启动),触发ApplicaitonEvent事件–>
ConfigFileApplicationListener执行初始全局配置文件的操作
2.spring-boot-autoconfigure-版本号:spring.properties, spring-autoconfigure-metadata.properties
spring-autoconfigure-metadata.properties配置文件: 配置启动器关联第三方的核心类信息
比如: JaskSon, CharacterEncodingFilter等等
作用:
当引导类执行main方法(启动)–> 通过读取 spring-autoconfigure-metadata.properties核心类–>自动装配搭配容器里面.
当引导类执行main方法(启动)–>同时开启包扫描机制: 将开发者定义带注解的类,初始化成bean–>自动装配搭配容器里面.
9. SpringCloud
4. 企业开发的项目: 技术说明(1.5)
5. 面试总结(3,4)