面试题大全免费下载地址
- 什么是VSC
版本控制系统,是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。
- 常用vsc
Cvs、svn、git
- 集中式和分布式的区别
集中式:必须有一台电脑作为服务器,每台电脑都把代码提交到服务器上,再从服务器下载代码。如果网络出现问题或服务器宕机,系统就不能使用了。
分布式:分布式VCS没有中央服务器,每台电脑都可以保存代码版本,没有网络的时候可以先提交到本地,每台电脑也都可以作为服务器,其他电脑可以从作为服务器的电脑上克隆代码,可见分布式系统比集中式系统的安全性高很多。
- git工作原理
克隆git clone远程资源到本地仓库,作为工作目录;
远程修改后git pull更新本地文件;
本地修改后git status查看修改的文件,然后add添加修改的文件到詹存渠;、
添加后,commit添加到工作区;
修改完成后,若发现错误,也可以撤回提交并再次修改并提交;
git push将本地的修改推送到远程git服务器。
- maven仓库工作流程
当项目需要某个jar包时,先从本地仓库查找,如果有就返回,如果没有就到远程仓库查询,如果找到就返回jar包并保存到本地仓库,如果还没找到就到中央仓库查找,如果找到了就保存到远程仓库和本地仓库中,如果没有就查找失败了。
- 仓库的继承和聚合
继承,项目之间可以继承,子项目可以继承父项目的依赖和插件;
聚合,一个项目可以把多个项目整合到一起打包,部署到一起,聚合项目用modules配置被聚合的项目。
- Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
- DI依赖注入,是IOC另一种说法,也就是对象由容器来管理,注入到我们需要依赖中。
- Spring是一种容器,能创建对象并管理对象的配置和生命周期。
- Spring主要组件
Core(提供IOC功能)、Context(提供包的扫描)、Beans(bean管理)、SpEL(spring表达式)、AOP(面向切面)、Test(单元测试)
、MVC、JDBC、ORM(数据库开发)、Cloud(微服务开发框架)、Securty(权限控制框架)
- IOC控制反转:把对象的创建和管理交给容器来完成,作用:解耦,使用硬编码完成对象的创建和管理,代码不灵活,不利于扩展和维护,使用IOC后,开发者只需要关注自己的业务逻辑,代码更利于扩展和维护。
- IOC的原理:利用反射机制,解析XML文件后,通过反射机制动态创建对象,调用set方法,将对象注入到对应的属性中,然后通过容器返回对象。
- 依赖的注入方式
XML set方法、构造器、byNAME、byTYPE
- Spring重要注解
Component标记类,会被Spring扫描到
ComponentScan 组件扫描,标记在配置类上,用于扫描Component标记的类
Configuration 配置类,标记的类作为配置类代替XML
Value 注入值类型数据,配置属性或set方法上
Autowrie 自动装配,默认属性进行注入
Qualifier 标记名称,配置在类和注入属性上,用于区分类型相同的对象
Resource 自动装配,默认按名称注入,名称没有再按类型注入
Repository 标记DAO实现类
Service 标记Service实现类
Controller 标记Controller实现类
- 容器的分类
BeanFactory:最简单的容器,给DI提供了基本的支持;
ApplicationContext:继承BeanFactory,包含了其所有功能之外,在国际化支持、资源访问、事件传播等方面进行了良好的支持。
- 代理模式
调用者不能直接调用目标对象时,通过代理对象进行调用目标对象。
- 静态代理和动态代理的区别
静态代理:只能代理一种业务,如果有多种业务需要编写多个代理类
动态代理:通过反射机制动态生成代理类,不需要手动编写,能够代理多种业务,更加灵活。
- JDK动态代理如何实现
实现invocationHandler接口
实现invoke方法
通过Proxy.newProxyInstance方法返回代理对象
- JDK和CGLib动态代理的区别
JDK动态代理的被代理类必须实现过接口
CGLib动态代理通过继承实现,代理类是被代理类的子类
- AOP的原理
当从容器中获得对象时,判断该类的方法是否被某个切面切中,若有则判断该类有没有实现接口,若有则使用JDK动态代理,若没有就通过CGLib动态代理返回代理对象,并对原对象的方法进行增强
- SpringAOP
面向切面编程,能实现代码的解耦,将核心业务和其他业务分离开来。
- AOP类型
前置,后置,环绕around返回后置afterReturning异常后置afterThrowing
- AOP作用
程序运行期间,不修改代码的同时为程序增强功能,将必不可少的公共功能做成切面,切入到代码运行中。只关注核心功能,不需考虑事务、日志,减轻负担。
- AOP应用
项目开发时,如果发现很多方法都会有些相同的代码,和核心业务又没有关系时,就可以考虑使用AOP:事务管理、缓存管理、日志管理、权限管理、性能监控。
- AOP注解
Aspect 切面,配置到切面类上
PointCut 配置切面点,加在方法上
- SpringMVC
M(Model模型)负责数据访问、业务逻辑(dao、service、entity);
V(View视图)负责和用户交互,展示数据(页面);
C(Controller)负责调用模型,更新视图(servlet->Controller)。
作用:解耦,便于开发和维护。
执行过程:
- 用户访问视图
- 控制器调用模型对数据库操作
- 控制器进行页面跳转
- 将模型上的数据绑定到视图
- springMVC执行过程
- 用户发送请求
- 前端控制器将用户请求的URL发送给处理器映射
- 处理器映射讲handler(包装的方法信息)返回给前端控制器
- 前端控制器发送handler给适配器,适配器执行handler方法
- 执行handler方法后,返回ModelAndView(逻辑试图)给前端控制器
- 前端控制器再讲ModelAndView发送给视图解析器,解析出物理视图返回给前端控制器
- 前端控制器渲染视图,发送视图给用户
- SpringMVC和Struts2的区别
- SpringMVC基于Servlet机制,而Struts基于Filter机制
- SpringMVC是方法级别拦截,每个请求对应一个方法,执行速度更快;
Struts2是类级别的拦截,每个请求对应一个Action类;
- 集成:SpringMVC属于Spring体系,配置容易,Struts2需要更多配置。
- SpringMVC需要的配置
- 导入SpringMVC依赖
- Spring.xml配置文件
- Web.xml配置
- SpringMVC常用注解
Controller 配置控制器类
RequestMapping 配置请求URL映射,配置方法或类上
GetMapping(URL) GET请求
PostMapping(URL)POST请求
DeleteMapping(URL)Delete请求
PutMapping(URL) PUT请求
RequestParam(名称)配置请求参数
PathVariable(URL)配置路径参数
ResponseBody 返回响应数据
RestController @Controller+@RestController
RequestBody 接受JSON对象
- 拦截器和过滤器
用于过滤请求,适用范围过滤器更大,拦截器只能在SpringMVC使用,效率高于过滤器。
- SpringMVC实现文件上传
导入依赖commons-fileupload,commons-io
配置上传处理器CommonsMultipartResolver
方法参数使用CommonsMultipartFile
表单form标签要添加enctype=“multipart/form-data”
- 介绍一下MyBatis
优秀的持久层框架,支持自定义SQL,存储过程以及高级映射,免除了几乎所有JDBC代码,以及设置参数和获取集的工作。可以通过简单的XML配置或注解和映射原始类模型、接口和javaPOJO为数据库中的记录。
- ORM
对象关系映射,通过使用描述对象和数据库之间的映射的元数据,讲面向对象语言中的对象自动持久化到关系数据库中。本质:将数据转换另一种形式。
- MyBatis和Hibernate的区别
Hibernate:全自动框架,不用写sql,自动生成,不利于sql优化,入门复杂;
Mybatis:半自动化框架,需要些sql,由框架映射,方便sql优化,入门容易。
- #{}和${}的区别
#{}占位符,用ParameterStatement的占位符方式在sql中插入参数值,可避免注入攻击;
${}字符串拼接,不能避免注入攻击。
- Mybatis的基本使用
- 导入依赖
- 添加配置文件mayvatis-config.xml
- 编写mapper接口
- 编写映射文件
- 编写测试,创建SqlSessionFactory,创建SqlSession,获得Mapper,调用方法
- MyBatis的动态SQL
If where set trim foreach
- 关联查询如何实现
MyBatis映射文件中,在ResultMap配置关联关系
Collection 配置集合类型的属性
Assoication 配置单独对象的属性
- 延迟加载
也叫懒加载,需要数据时才启动查询,是MyBatis对数据库的优化机制
- 物理分页和逻辑分页(内存)
物理分页:利用数据库特性分页,利用limit、PageHelper插件等,每次返回部分数据,用于数据量大,数据更新频繁
逻辑分页:每次返回所有数据,再根据程序员的代码逻辑分页显示或返回,内存消耗大,用于数据量小且数据稳定的场景,例如MyBatis使用RowBouds。。
- SSM分工
- Spring 作为基础框架,整合其他框架
- SpringMVC 作为Web开发框架,提供服务期开发支持
- MyBatis 作为ORM框架,提供数据库开发支持
- SSM整合流程
- 导入依赖
- 配置spring-MVC
- 配置mybatis-config
- 配置spring-maybatis
- 配置spring,导入SpringMVC和MyBatis配置
- 配置web.xml
- 测试
- 什么是事务
事务是数据库操作的最小工作单元,事务包含一个或多个业务操作,要么都执行要么都不执行。
- 事务的实现
- 编程式事务
编写java代码,实现启动事务,提交事务或回滚事务
特点:编写麻烦,代码入侵度高
- 声明式事务
通过配置+注解实现
代码简洁,侵入性低
45、事务的特性
- 原子性:不可分割,一次事务要么成功要么失败
- 隔离性:事务与事务之间会存在不可见的情况,什么情况不可见取决于隔离级别
- 持久性:事务一旦提交,结果是永久的,除非有其他事物更改
- 一致性:数据库必须保持一致的状态。
- 事务隔离级别
Read uncommitted 读未提交,可能出现脏读
Read committed 读已提交,解决脏读
Repeatable read 可重复读,解决不可重复读
Serializable 串行化,解决所有并发问题,排队执行性能低
- 可能发生的错误
1)脏读
一个事务读到另一个事务没有提交的数据
2)不可重复读
一个事务进行多次读取,读取到的结果不一样
3)幻读
一个事务第一次读取时没有某条数据,第二次读取时出现新的数据(幻影数据)
- Linux常用命令
cd /home | 进入 ‘/home’ 目录 |
cd .. | 返回上一级目录 |
cd ../.. | 返回上两级目录 |
cd - | 返回上次所在目录 |
cp file1 file2 | 将file1复制为file2 |
cp -a dir1 dir2 | 复制一个目录 |
cp -a /tmp/dir1 . | 复制一个目录到当前工作目录(.代表当前目录) |
ls | 查看目录中的文件 |
ls -a | 显示隐藏文件 |
ls -l | 显示详细信息 |
ls -lrt | 按时间显示文件(l表示详细列表,r表示反向排序,t表示按时间排序) |
pwd | 显示工作路径 |
mkdir dir1 | 创建 ‘dir1’ 目录 |
mkdir dir1 dir2 | 同时创建两个目录 |
mkdir -p /tmp/dir1/dir2 | 创建一个目录树 |
mv dir1 dir2 | 移动/重命名一个目录 |
rm -f file1 | 删除 ‘file1’ |
rm -rf dir1 | 删除 ‘dir1’ 目录及其子目录内容 |
- SpringBoot约定大于配置的含义
约定优于配置(Convention over Configuration),又称按约定编程,是一种软件设计范式。
本质上是说,系统、类库或框架应该假定合理的默认值,而非要求提供不必要的配置。
约定优于配置简单来理解,就是遵循约定。
- 为什么在SpringBoot上导入dependency时不需要指定版本?
在Spring Boot入门程序中,项目pom.xml文件有两个核心依赖,分别是spring-boot-starter-parent和spring-boot-starter-web
- SpringBoot如何自动配置?
- Spring Boot应用的启动入口是@SpringBootApplication注解标注类中的main()方法
- 进入到@SpringBootApplication内,观察其做了哪些工作:
@Target({ElementType.TYPE}) //注解的适用范围,Type表示注解可以描述在类、接口、注解或枚举中
@Retention(RetentionPolicy.RUNTIME) //表示注解的生命周期,Runtime运行时
@Documented //表示注解可以记录在javadoc中
@Inherited //表示可以被子类继承该注解
@SpringBootConfiguration // 标明该类为配置类
@EnableAutoConfiguration // 启动自动配置功能
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
// 根据class来排除特定的类,使其不能加入spring容器,传入参数value类型是class类型。
@AliasFor(annotation = EnableAutoConfiguration.class)
Class<?>[] exclude() default {};
// 根据classname 来排除特定的类,使其不能加入spring容器,传入参数value类型是class的全类名字符串数组。
@AliasFor(annotation = EnableAutoConfiguration.class)
String[] excludeName() default {};
// 指定扫描包,参数是包名的字符串数组。
@AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
String[] scanBasePackages() default {};
// 扫描特定的包,参数类似是Class类型数组。
@AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
Class<?>[] scanBasePackageClasses() default {};
- }
从上述源码可以看出,@SpringBootApplication注解是一个组合注解,前面 4 个是注解的元数据信息, 我们主要看后面 3 个注解:@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan三个核心注解,关于这三个核心注解作具体说明即可。
- Security
一个能够为基于spring的企业应用系统,提供声明式的安全访问控制解决方案的安全框架,
它提供了一组应用上下文配置的Bean,充分利用了springIOC,Dl和AOP功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。
- SprinBoot整合Security的流程
- 用户登录时,前端将用户输入的用户名、密码信息传输到后台,后台用UsernamePasswordAuthenticationToken将其封装。
- 到程序负责验证这个类对象,调用Service根据username从数据库中取用户信息到实体类的实例中,比较密码,正确就登陆,同时吧包含着账号信息的对象放到SecurityContextHolder中去。
- 在用户访问一个资源时,先判断是否是受限资源,如果是的话还要判断当前是否未登录,没有的话就跳到登录界面。
- 如果用户已登录,并访问一个受限资源时,程序要根据URL去数据库中取出该资源所对应的所有可以访问的角色,然后拿着当前用户的所有角色经行对比,判断用户是否可以访问。
- NoSQL:非关系型数据库
特征:(1)不需要预定义模式
(2)无共享架构
(3)弹性可扩展
(4)分区
(5)异步复制
(6)BASE
(7)没有统一架构
55、Redis:key-value存储系统,高性能的key-value数据库。可以存储的value类型更多。
56、Docker:开源的应用容器引擎,基于GO语言。
Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。
优点:(1)快速,一致的交付应用程序。
(2)响应式部署和扩展
(3)在同一硬件上运行更多工作负载
57、springboot如何实现热部署
1.添加spring-boot-devtools热部署依赖启动器
2. IDEA工具热部署设置
58、项目中如何体现springIOC、AOP
59、OA工作流