常见八股文03
35.autowired、qualifier和Resource区别
@Autowired:基于类型的注入
@Qualifier:基于名称进行注入
@Resource:按名称装配注入,如果找不到与名称匹配的bean,则按类型装配注入,可以用于字段和方法上
36.代理模式
动态代理和静态代理
动态代理:程序运行时动态地创建代理对象,实现对象的代理访问。
静态代理:程序运行前已经创建代理对象
动态代理特点:不用手动实现接口
静态代理特点:一个代理类只能有一种类型的对象
动态代理分类:接口动态代理,类动态接口
37.IOC理解
IOC是控制反转,以前我们想获取对象,直接new就可以;现在获取对象,直接和Spring容器中去取,目的是为了解耦
38.AOP理解
AOP是一种面向切面编程,是对面向对象的一种补充。AOP的主要思想是将横切关注点(如日志记录、事务管理、安全检查等)与业务逻辑代码分离.
AOP的优势
- 提高代码复用性:通过将横切关注点封装在切面中,可以在多个业务逻辑对象之间共享这些关注点,从而提高代码复用性。
- 简化业务逻辑:通过将横切关注点与业务逻辑代码分离,可以使业务逻辑代码更加简洁和清晰,更容易理解和维护。
- 增强模块化:AOP允许将横切关注点作为独立的模块进行开发和管理,从而增强了系统的模块化程度。
AOP的应用场景
AOP广泛应用于处理具有横切性质的系统服务,如:
日志记录:记录方法调用的日志信息,以便于问题追踪和性能监控。
事务管理:在方法调用前后开启和提交事务,确保数据的一致性和完整性。
安全检查:在方法调用前进行权限验证,确保用户具有执行该操作的权限。
缓存优化:通过缓存查询结果来减少数据库访问次数,提高系统性能。
异常处理:在方法抛出异常时进行处理,如记录异常信息或进行异常转换。
39.SpringMVC工作流程
1.用户发送请求到前端控制器
2.前端控制器收到请求调用处理器映射器
3.处理器映射器找到具体的处理器,生成处理器对象以及处理器拦截器,并返回前端控制器
4.前端控制器调用处理器适配器
5.处理器适配器经过适配调用具体处理器Controller
6.具体控制器Controller执行完成返回模型视图对象
7.处理器适配器将模型视图对象返回给前端控制器
8.前端控制器将模型视图对象传给视图解析器
9.视图解析器解析后返回具体的view
10前端控制器将view进行渲染视图
11.最后前端响应用户
40.Spring用到了哪些设计模式
工厂模式、单例模式、代理模式、模板方法模式
工厂模式:Spring通过BeanFactory、ApplicationContext等接口创建并管理对象实例。这种方式将对象的创建与使用解耦,使得程序更加灵活和可扩展。Spring的IoC容器就是一个典型的工厂模式应用,它负责实例化、配置和组装Bean,降低了对象间的耦合度。
单例模式:Spring中的Bean默认都是单例的,即在整个Spring IoC容器中,每个Bean只会有一个实例。这通过Bean的scope属性进行控制,当scope为singleton时,即表示使用单例模式。单例模式的设计有助于节省资源并提高性能。
代理模式:Spring的AOP(面向切面编程)功能大量使用了代理模式。AOP通过在目标方法执行前后添加额外的行为(如日志、事务管理等),而这些额外的行为是通过代理对象来实现的。Spring提供了两种代理方式:JDK动态代理和CGLIB代理。此外,Spring Security的底层也使用了代理模式。
模板方法模式:在Spring的JdbcTemplate、HibernateTemplate、RestTemplate等类中,使用了模板方法模式。这些类定义了一个操作中的算法骨架,而将一些步骤延迟到子类中实现。这种方式使得Spring可以为不同的数据库操作或HTTP请求提供统一的接口,同时允许用户根据自己的需求进行定制。
简化版
代理模式:两种设计模式-------静态代理和动态代理
单例模式:在Spring配置文件中设置bean默认为单例模式
模板方式模式:解决代码重复问题
工厂模式:Spring使用beanFactory来创建对象
41.Spring的自动装配方式
基于XML的配置:byName按属性名称自动装配、byYbpe按属性类型自动装配、constructor按构造函数进行装配
基于注解的自动装配:@Autowired:按类型自动装配。、@Resource:可以按名称或类型进行装配@Qualifier:于指定要注入的Bean的名称。
基于Java配置:使用@Configuration注解来标注配置类,并使用
42.Spring解决循环依赖
构造函数注入:如果两个Bean通过构造函数相互注入,那么Spring无法解决这种循环依赖,因为构造函数注入需要在Bean实例化时立即完成依赖注入,而循环依赖会导致无法完成实例化。
setter方法注入和字段注入:这两种注入方式允许在Bean实例化后进行依赖注入,因此Spring可以通过三级缓存机制来解决循环依赖问题。
使用代理对象:当发现循环依赖时,Spring可以创建一个代理对象来替代实际的Bean。这个代理对象可以在需要时提供实际的Bean实例,从而解决循环依赖问题。
43.mybatis中#{}和${}区别
#{}:预编译处理。Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
${}时,就是用${}替换成变量的值;使用#{}可以有效的防止SQL注入,提高系统安全性。
44.Mybatis如何执行批量操作
使用foreach标签在XML中构建批量插入语句
1.在Mapper XML文件中定义一个带有List类型参数的insert方法。
2.使用标签遍历这个列表,并为每个元素构建一个VALUES子句。
3.调用这个方法并传入一个包含多个待插入对象的List
45.Mybatis是如何进行分页的
1.在Mapper接口中定义一个带有RowBounds参数的查询方法,用于进行分页查询。
2.在对应的Mapper XML配置文件中编写SQL语句
3.调用查询方法时,传入一个RowBounds对象来指定查询的起始行和返回的行数。
46.Mybatis的一级、二级缓存
一级缓存:是SqlSession级别缓存,默认开启
二级缓存:是NameSpace级别缓存,多个SqlSession可以共享,使用需要进行配置开启
Mybatis首先去缓存中查询结果集,如果没有则查询数据库,如果有则从缓存取出返回结果集就不走数据库。Mybatis内部存储缓存使用一个HashMap,key为hashCode+sqlId+Sql语句。value为从查询出来映射生成的java对象
Mybatis的二级缓存即查询缓存,它的作用域是一个mapper的namespace,即在同一个namespace中查询sql可以从缓存中获取数据。二级缓存是可以跨SqlSession的。
缓存的查找顺序:二级缓存 一级缓存 数据库
47.Spring常用注解
@Component:通用注解,用于标记一个类。
@Service:用于标记业务逻辑层的类。
@Repository:用于标记数据访问层(DAO)的类。
@Controller:用于标记控制层的类,通常用于Web层。
@Autowired:自动装配依赖,可以用于字段、方法或构造函数上。
@Qualifier:当有多个相同类型的Bean时,用于指定具体哪一个Bean。
@Value:从属性文件中读取值并注入到字段中。
@Scope:定义Bean的作用域。
@Configuration:标记一个类为配置类,替代XML配置文件。
@Bean:在配置类中使用,用于声明一个Bean。
48.SpringMVC常用注解
@RequestMapping:映射HTTP请求到处理方法上,可以用于类或方法上。
@GetMapping:映射HTTP GET请求到处理方法上。
@PostMapping:映射HTTP POST请求到处理方法上。
@PutMapping:映射HTTP PUT请求到处理方法上。
@DeleteMapping:映射HTTP DELETE请求到处理方法上。
@PathVariable:用于从URL中提取路径变量。
@RequestParam:用于从请求参数中提取值。
@RequestBody:用于将请求体中的内容绑定到方法参数上。
@ResponseBody:用于将方法返回值直接写入HTTP响应体中。
@RestController:组合了@Controller和@ResponseBody,用于创建RESTful服务。
49.SpringBoot常用注解
@SpringBootApplication:用于启动Spring Boot应用,通常是主类上的注解。
@EnableAutoConfiguration:启用Spring Boot的自动配置机制,根据类路径中的依赖自动配置应用。
@ComponentScan:指定Spring扫描组件的包路径,默认扫描当前包及其子包。
@Configuration:标记一个类为配置类,替代XML配置文件。
@Bean:在配置类中使用,用于声明一个Bean。
@Autowired:自动装配依赖,可以用于字段、方法或构造函数上。
@Value:从属性文件中读取值并注入到字段中。
@Profile:用于指定某个Bean或配置类在特定的环境中生效。
@ConditionalOnClass / @ConditionalOnMissingClass:用于条件化地加载Bean,根据类路径中是否存在某个类。
@ConditionalOnProperty:用于条件化地加载Bean,根据配置文件中的属性值。
@RestController:组合了@Controller和@ResponseBody,用于创建RESTful服务。
@RequestMapping / @GetMapping / @PostMapping / @PutMapping / @DeleteMapping:
用于映射HTTP请求到处理方法上。
@PathVariable / @RequestParam / @RequestBody / @ResponseBody:用于处理请求参数和响应体。
50.SpringCloud常用注解
@EnableDiscoveryClient:启用服务发现客户端,例如Eureka、Consul等。
@EnableEurekaClient:特定于Eureka的服务发现客户端注解。
@EnableFeignClients:启用Feign客户端,用于声明式HTTP客户端。
@FeignClient:用于声明一个Feign客户端接口。
@RibbonClient:用于配置Ribbon客户端,进行负载均衡。
@HystrixCommand:用于定义Hystrix命令,实现断路器模式。
@EnableCircuitBreaker / @EnableHystrixDashboard:启用断路器和Hystrix仪表盘。
@EnableZuulProxy / @EnableZuulServer:启用Zuul代理或服务器,用于API网关。
@StreamListener:用于监听消息通道中的消息,常用于Spring Cloud Stream。
@EnableBinding:用于启用Spring Cloud Stream的绑定功能。
@RefreshScope:用于使Bean在配置更新时重新加载,常用于动态刷新配置。
51.RESTful四种请求方式及对应操作
GET 查询操作
POST 添加操作
DELETE 删除操作
PUT 修改操作
52.Vue2和Vue3区别
在组件模板结构上,Vue2中,中必须只有一个根标签;Vue3中,允许组件有多个根标签,会默认把这些标签包裹在一个虚拟标签中。
从API上,在Vue2中,使用选项类型API,将组件的选项(如data、computed、methods等)分割到不同的属性中;在Vue3中,引入合成型API,允许使用方法来分割组件的逻辑。
从定义数据变量和方法上,在Vue2中,数据放在data中,方法定义在methods中;在Vue3中,使用setup()方法定义响应性数据和方法。
从生命周期钩子函数上,在Vue2中,生命周期钩子函数包括beforeCreate、created、beforeMount、mounted、beforeUpdate、updated等;在Vue3中,Vue3中的生命周期钩子在调用前需要先进行引入。
从双向数据绑定原理上,在Vue2中,使用ES5的Object.defineProperty()方法对数据进行劫持,结合发布-订阅模式实现双向数据绑定。但这种方法只能监听某个属性,不能对整个对象进行监听;在Vue3中,引入ES6的Proxy API进行数据代理,可以直接绑定整个对象,提升效率,且能监听数组内部数据的变化。
53.Linux常见命令
ls 列出目录内容
cd 用于切换当前目录
cd.. 返回上一级目录
pwd 显示当前目录的路径
exit 退回到原来用户
cp 复制文件或目录
mv 移动或重命名文件或目录
rm 删除文件或目录
shutdown:关闭系统。
useradd:添加新用户。
passwd:设置或更改用户密码
userdel:删除用户
touch 目录/文件名
mkdir 目录名 创建普通文件夹
ifconfig: 显示或配置网络设备
解压压缩包 tar zcvf 压缩文件名.tar.gz
54.where和having区别
where 进行分组前的过滤,后面不能写 聚合函数
having 是分组后的过滤,面可以写 聚合函数
55.Maven关键字
Project:Maven中的基本工作单元
POM(pom.xml):Maven的核心文件
groupId:工程的全局唯一标识符
version:项目的版本号
dependency:项目所依赖的其他包或库
plugin:Maven的插件
scope:依赖的作用域
packaging:项目的打包方式
56.hashmap和hashtable区别
1.从线程安全性方面,HashMap线程不安全,HashTable是线程安全
2.键和值的允许性:HashMap:允许使用null作为键和值。Hashtable:不允许使用null作为键或值。
3.初始容量和扩容机制:HashMap:初始容量为16,当已用容量超过总容量乘以负载因子(默认值为0.75)时,HashMap会进行扩容,扩容为当前容量翻倍。Hashtable: 初始容量为11,当已用容量超过总容量乘以负载因子(同样为0.75)时,Hashtable也会进行扩容,扩容为当前容量翻倍加1。
4.HashMap:没有重写toString()方法。Hashtable:重写了toString()方法。
57.jdk1.8新特性
1.可以使用Lambda表达式,简化我们写匿名函数的步骤
2.加入了Stream API这个特性,我们不需要编写复杂的循环和条件语句,而且支持并发处理,处理大量数据的时候,更加高效
3.加了Optional类,这个类可以帮我们解决空指针异常问题、它可以处理理可能为空的对象。
4.定义接口默认方法,接口中可以定义默认实现的方法,让实现接口的类可以选择性地实现默认方法。引入了新的关键字default来修饰接口的默认方法。
58.四大算法
1.冒泡排序的原理
首先,算法首先比较相邻的两个元素。如果第一个元素比第二个元素大,则交换它们的位置。
其次,对每一对相邻元素进行这样的比较和交换后,最大的元素会在这组数的最后面。
最后,对剩下的元素重复以上步骤,直到没有任何一对元素需要交换。
2.快速排序的原理
首先,从数列中挑出一个元素,称为“基准”
其次,重新排序数列,所有元素比基准值小的摆放在基准的前面,所有元素比基准值大的摆在基准的后面,相同的数可以到任何一边。
最后,把小于基准值元素的子数列和大于基准值元素的子数列排序。
3.归并排序的原理
什么是 简单来说,就是将一个大的问题划分为若干个小问题分别解决,然后合并这些小问题的解以得到原问题的解。
原理
首先,确定分解点,选择中间点作为分解点,将序列分为两个子序列,对两个子序列分别进行归并排序,通过递归调用归并排序函数来实现。
其次,创建临时数组,存放合并后的有序序列,为两个子序列分别设置指针
接着,比较两个指针所指向的元素,将较小的元素复制到临时数组中,并将相应指针向后移动一格。
最后,当其中一个子序列的指针到达序列尾部时,将另一个子序列中剩余的元素全部复制到临时数组的剩余位置。将临时数组中的有序序列复制回原数组中的相应位置,完成一次合并操作。
4.二分查找的原理
什么是 在有序数组中查找某一特定元素的搜索方法
原理
首先,确定查找范围,通常使用两个指针来表示,一个指向查找范围的起始位置,另一个指向查找范围的结束位置。
其次,计算中间位置,其索引通常为(初始位置+结束位置) / 2
接着,将目标元素与中间位置的元素进行比较。
1.如果目标元素等于中间位置的元素,则查找成功,返回该元素的索引。
2.如果目标元素小于中间位置的元素,将结束位置调整中间位置 - 1,继续在前半部分查找。
3.如果目标元素大于中间位置的元素,将初始位置调整为中间位置 + 1,继续在后半部分查找。
最后,不断重复上述比较与调整查找范围的过程,直到发现目标元素不存在于数组中即可实现二分查找。
59.Spring优点
1.是一个轻量级框架,业务逻辑和框架可以实现解耦
2.Spring其中一点核心是IOC,IOC是控制反转,以前我们想获取对象,直接new就可以;现在获取对象,直接和Spring容器中去取,目的是为了解耦
3.另一大核心AOP,AOP是面向切面编程,AOP是一种面向切面编程,是对面向对象的一种补充。AOP的主要思想是将横切关注点(如日志记录、事务管理、安全检查等)与业务逻辑代码分离.
4.简化开发:Spring框架提供了很多常用的功能模块和组件,如Spring Boot、Spring MVC、Spring Data等,这些方便地进行开发和集成其他技术栈。
60.SpringMVC优点
1.灵活性:Spring MVC采用了MVC(Model-View-Controller)设计模式,将业务逻辑、数据访问和界面展示等职责进行分离,使应用程序更易于开发、测试和维护。
2.松耦合:Spring MVC框架最大程度地避免了应用程序组件之间的直接依赖性,将它们连接起来的是Spring IoC容器,这让开发人员能够更加灵活地配置和组织应用程序。
3.易于测试:Spring MVC框架将控制层、业务层和数据访问层等各个组件进行了逻辑分离,使得每个组件可以单独测试,降低了测试成本和测试复杂度。
4.强大的请求处理能力:Spring MVC提供了强大的请求处理能力,包括多种请求映射和数据绑定方式,可以方便地进行请求和响应数据的处理。
5.高度可定制化:Spring MVC框架提供丰富的可配置选项,开发人员可以根据需求进行灵活的定制。
6.集成能力:Spring MVC框架可以轻松与Spring Framework、Hibernate、MyBatis等流行的开源框架无缝集成,扩展性强。
61.SpringBoot优点
1.简化项目配置 这样我们可以专注于业务逻辑的实现,而无需为配置细节分心。
2.快速开发 SpringBoot提供了丰富的开发工具和插件,可以快速创建并部署应用程序。
3.自动装配 通过自动装配来提供默认配置和Bean的管理。
4.简化依赖管理 通过引入相应的“starter”依赖,可以方便地添加所需的第三方库和组件,解决了依赖冲突和版本兼容性问题。
62.SpringCloud优点
1.简化微服务开发:Spring Cloud提供了一组工具和库,帮助开发者更容易地构建和部署微服务。它支持声明式服务发现、配置中心、负载均衡、熔断器等,简化了微服务的开发、部署和运维。
2.强大的生态系统:Spring Cloud拥有庞大的生态系统,包括许多开源项目和第三方库,这些库可以帮助开发者更容易地构建各种类型的微服务,如API网关、认证中心、监控中心等。
3.灵活性和可扩展性:Spring Cloud提供了灵活的依赖管理机制,可以轻松地添加新的依赖项和库。它还支持分布式追踪、分布式日志和监控等高级功能,可以根据业务需求进行灵活扩展。
4.社区活跃:Spring Cloud拥有庞大的社区,提供了丰富的文档、教程和示例,可以帮助开发者快速上手并解决遇到的问题。
5.服务拆分粒度更细:Spring Cloud有利于资源重复利用,提高开发效率,可以更精准地制定优化服务方案,提高系统的可维护性。