2024年最全JAVA面试八股文之框架相关(1)

}

}



public interface SpiceBaseMapper extends BaseMapper {

/\*\*

* 批量插入
* {@link com.baomidou.mybatisplus.extension.injector.methods.InsertBatchSomeColumn}
*
* @param entityList 要插入的数据
* @return 成功插入的数据条数
*/
int insertBatchSomeColumn(List entityList);
}


## springboot排除依赖?


* 启动类注解设置需要排除的自动装配类



@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})


* 在配置文件中指定需要排除的类



spring.autoconfigure.exclude = org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

或者这样

spring.autoconfigure.exclude[0] = org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration


* 单独使用@EnableAutoConfiguration注解



@EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class)


## 控制配置类的优先级?


* 使用@order注解;
* 使用Ordered 接口;


## BeanFactory 和 ApplicationContext 的区别?


* **BeanFactory 是最基础的接口,是 Spring IoC 容器的底层实现**。它提供了最基本的 IoC 功能,即管理和获取 Bean 对象。BeanFactory 使用延迟加载策略,只有在获取 Bean 的时候才会实例化对象。
* **ApplicationContext 是 BeanFactory 的一个高级实现,它提供了更多的功能和扩展性**。ApplicationContext 在 BeanFactory 的基础上添加了更多的企业级特性,例如国际化支持、事件发布机制、AOP(面向切面编程)等。ApplicationContext 在容器初始化时就会实例化所有的单例 Bean,提供更快的访问速度。


## Spring的注入方式有哪些?


1,构造器注入;  
 2,Setter方法注入;  
 3,字段注入;  
 4,接口注入;


## mybatis如何实现分页?


底层通过拦截器实现,拦截底层通过责任链+动态代理+反射机制实现  
 当MyBatis执行查询操作时,拦截器会拦截该操作,并根据传入的参数计算出分页相关的信息,然后修改SQL语句,添加分页相关的限制条件,最后执行修改后的SQL语句,返回分页结果。


## Controller和Restcontroller的区别是什么?


主要的区别在于返回值的处理方式,@Controller返回的是视图,而@RestController返回的是对象,并将其转化为JSON格式。


## SpringBoot的优点有哪些?


1,简化配置;  
 2,快速开发;  
 3,微服务支持;  
 4,自动化配置;  
 5,强大的社区服务;  
 6,生态系统;


## SpringBoot自动装配?


Springboot自动装配的原理是通过条件注解@Conditional和SpringBootStarter来实现。在项目启动时Springboot会根据条件注解判断是否需要自动装配某些组件,并将这些组件自动注册到spring容器中,从而实现自动装配。


## @Bean和@Component和@Configuration的区别?


* @Bean注解用于在配置类中声明Bean对象;
* @Component用于标记一个类为Spring管理;
* @Configuration用于标记一个类为配置类;


## 什么是RestFul风格?


Restful是一种新软件架构风格,通过资源路径可以判断访问的资源,请求方式可以判断进行的操作,GET表示查询,POST表示添加,PUT表示修改,DELETE表示删除。


## Spring中那些模块?


核心容器:核心容器提供spring框架的基本功能;  
 spring上下文:是一个配置文件,向spring框架提供上下文信息;  
 springAOP:可以很容易地使 Spring 框架管理的任何对象支持 AOP;  
 springDAO:jdbc DAO异常方面;  
 springORM:提供orm对象关系工具;  
 SpringWeb:为基于web应用提供上下文;  
 SpringMVC:构建web应用的实现;


## spring中有那些设计模式


1,单例模式,spring容器中的bean都是单例的;  
 2,工厂模式:spring中的BeanFactory和ApplicationContext都是使用工厂模式来创建;  
 3,依赖注入:灵活的管理Bean之间的关系;  
 4,观察者模式:spring的事件机制基于观察者模式;  
 5,代理模式:SpringAOP;  
 6,模板方法模式、适配器模式,策略模式,迭代器模式,组合模式,装饰器模式,责任链模式;


## RequestMapping有那些参数?


1,value:用来指定映射路径;  
 2,method:用来指定请求的http方法;  
 3,params:用来指定请求的参数条件;  
 4,headers:指定请求头的条件;  
 5,consums:用来指定请求的content-type的条件;  
 6,produces:用来指定响应的content-type的条件;


## @Autowired和@Resource的区别?


* @Autowired是Spring框架提供的注解,按照类型自动装配通,常结合@qualifier注解一起使用解决歧义性问题;
* @Resource是javaEE标准的注解,按照名称自动装配;


## @service、@Controller、@Component,@Repository的区别?


* @Component是通用的组件注解,表示该类是一个Spring的Bean,交由Spring容器管理;
* @service和@Component作用一样,主要用来标识服务层;
* @Controller和@Component作用一样,主要用来标识控制层;
* Repository和@Component作用一样,主要用来标识数据访问层;


## spring单例bean是线程安全的嘛?


spring中的单例bean是线程不安全的,当有很多请求访问同一个服务时,容器会为每一个请求分配一个线程,这时多线程并发执行请求对应的业务逻辑时,需要考虑线程安全问题。(比如对成员变量的修改)


但是,我们在项目中依赖注入用到的service类或者mapper类是不可改变的,是线程安全。


要想变成线程安全可以使用@Scope修改**singleton**为**prototype**。


## 什么是aop?


aop是将与业务无关的那些系统服务分离开来,系统服务做一个增强,业务逻辑只关注业务,**降低耦合**。


## AOP的底层实现?


常见的AOP底层实现原理包括基于JDK动态代理和基于CGLIB的动态代理。  
 JDK动态代理是通过反射机制实现的,它可以在运行时动态创建接口的代理对象。  
 而CGLIB动态代理则是通过继承目标类来实现代理,它可以代理非接口类型的类。


## 项目中有没有使用?


在项目中事务管理,记录操作日志(aop+自定义注解),缓存,安全性控制,都用到。


## spring中的事务如何实现?


在spring中有两种事务,一种是编程式事务,通过用代码进行事务控制,**对业务有侵入性**。


一种式声明式事务,通过加@Transactional注解进行事务控制,其本质就是通过aop的环绕通知,对方法前后进行拦截,在方法前开启事务,在执行完目标方法之后,根据情况进行提交事务或者回滚事务。


## spring事务的隔离级别?


四种:  
 1.读未提交  
 2.读已提交  
 3.重复读(默认)  
 4.序列化


## 事务的传播机制?


有7种:  
 1.如果当前存在事务,则加入该事务,如果当前没有事务,则创建一个新的事务;(默认)  
 2.如果当前存在事务,则加入该事务,没有则以非事务方式执行;  
 3.如果当前存在事务,则加入该事务,没有则抛出异常;  
 4.创建一个新的事务,暂停当前事务;  
 5.以非事务方式执行,暂停当前事务;  
 6.以非事务方式执行,如果当前存在事务抛出异常;  
 7.如果当前存在事务,则在当前事务嵌套事务中执行;


## 运行时异常事务会回滚


## spring事务失效的场景有哪些?


1.**异常捕获处理**,自己处理了异常没有抛出,解决方法,手动抛出。


2.**检查异常**,解决方法,@Transactional上配置rollbackFor属性为Exception。


* **检查型异常**(Checked Exception)


所谓检查(Checked)是指编译器要检查这类异常,检查的目的一方面是因为该类异常的发生难以避免,另一方面就是让开发者去解决掉这类异常,所以称为必须处理(try …catch)的异常。如果不处理这类异常,集成开发环境中的编译器一般会给出错误提示。


常见的检查性异常:输入输出异常(IOException)、文件不存在异常(FileNotFoundException)、SQL语句异常(SQLException)等


例如:一个读取文件的方法代码逻辑没有错误,但程序运行时可能会因为文件找不到而抛出FileNotFoundException,如果不处理这些异常,程序将来肯定会出错。所以编译器会提示你要去捕获并处理这种可能发生的异常,不处理就不能通过编译。


* **非检查型异常**(Unchecked Exception)


所谓非检查(Unchecked)是指编译器不会检查这类异常,不检查的则开发者在代码的编辑编译阶段就不是必须处理,这类异常一般可以避免,因此无需处理(try …catch)。如果不处理这类异常,集成开发环境中的编译器也不会给出错误提示。


常见的运行时异常:空指针异常(NullPointerException)、除零异常(ArithmeticException)、数组越界异常(ArrayIndexOutOfBoundsException)等;


例如:你的程序逻辑本身有问题,比如数组越界、访问null对象,这种错误你自己是可以避免的。编译器不会强制你检查这种异常。


3.**非public修饰的方法导致**,解决方法,加上public。


## spring的bean的生命周期?


![在这里插入图片描述](https://img-blog.csdnimg.cn/e8e595eb4b184ad8af10c8b3db446a29.png)


一简:


1.实例化,在这个阶段通过调用构造函数或者工厂方法来实例化对象。


2.属性注入,将配置文件或者注解设置的值注入到bean对象中。


3.初始化,Spring会调用Bean的初始化方法(如果有定义的话)。可以使用@PostConstruct注解或实现InitializingBean接口来定义初始化方法。


4。销毁,当应用程序或者容器关闭时,spring会调用销毁方法。


二详:


首先会通过一个非常重要的类,叫做BeanDefinition获取bean的定义信息,这里面就封装了bean的所有信息,比如,类的全路径,是否是延迟加载,是否是单例等等这些信息。


在创建bean的时候,第一步是调用构造函数实例化bean。


第二步是bean的依赖注入,比如一些set方法注入,像平时开发用的@Autowire都是这一步完成。


第三步是处理Aware接口,如果某一个bean实现了Aware接口就会重写方法执行。


第四步是bean的后置处理器BeanPostProcessor,这个是前置处理器。


第五步是初始化方法,比如实现了接口InitializingBean或者自定义了方法init-method标签或@PostContruct。


第六步是执行了bean的后置处理器BeanPostProcessor,主要是对bean进行增强,有可能在这里产生代理对象。


最后一步是销毁bean。


## 什么是spring的循环依赖?


循环依赖是指两个或者两个以上的bean相互持有对方,最终形成闭环。


spring框架根据3级缓存已经解决大部分的循环依赖。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/26bd29b2c1244917b6a7124762c74be8.png)  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/edd2a066220548feaa57c9c800ea865e.png)


二级缓存可以解决一般对象的循环依赖,如果是代理对象的话就需要3级缓存。


![在这里插入图片描述](https://img-blog.csdnimg.cn/cce495fc29a44732a13d4d8fa75f0c53.png)


3级缓存的对象工厂会生成一个代理对象或者普通对象来注入。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/aaee80f5fcf34ec7a0385463b8e06f22.png)


如果是构造方法注入则需要手动解决,spring的3级缓存只能解决初始化阶段的循环依赖,  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/aeb1b39e1c694083ba58e6c3c1f4099e.png)


## springMVC执行的流程?


![在这里插入图片描述](https://img-blog.csdnimg.cn/ec1723ee79d74b48b5fffaaeb642a429.png)  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/95dd65d42bc640d3a4300634daadc3eb.png)


1.用户发送出的请求先到前端控制器DispatcherServlet它是一个调度中心


2.DispatcherServlet收到请求再调用HandlerMappering处理器映射器


3.handlerMappering找到具体的处理器,生成处理器对象及拦截器对象,并一起返回给·DispatcherServlet


4.DispatcherServlet再调用HandlerAdapter处理器适配器


5.HandlerAdapter再调用具体处理器(controller的方法)


6.方法上加有@responseBody,转换为json并响应。


## 过滤器和拦截器的区别?


* 过滤器在web.xml中配置,由servlet容器触发,对所有请求生效。
* 拦截器由Spring框架内部维护,在SpringMVC中配置,只对SpringMVC的请求生效。
* 过滤器在请求进入Servlet容器前和响应离开容器时触发。
* 拦截器在在controller之前,之后和视图渲染之后触发。
* 过滤器不能修改内容,拦截器可以修改响应内容。


## springboot的自动配置原理?


在springboot项目中有一个@springbootapplication注解他包含3个注解,


SpringBootApplication=


* @SpringBootConfiguration
* @EnableAutoConfiguration
* [@ComponentScan](https://bbs.csdn.net/topics/618540462)


其中@EnableAutoConfiguration是实现自动配置的核心注解,该注解会通过@import注解导入对应的配置选择器,内部是读取项目和该项目引用的Jar包的的classpath路径下**META-INF/spring.factories**文件中的所配置的类的全类名。通过springboot的条件注解判断是否需要加载到bean容器中。


通过条件注解和Springboot Start 机制实现的,在Springboot主启动类上有一个SpringbootApplication注解,他由3个注解组成,其中EnableAutoConfiguration,他是实现自动装配的核心注解,他通过@import注解导入对应的配置选择器,他内部就是读取项目和该项目引入的依赖的classpath路径下META-INF/spring.facotries文件中配置的类的全类名,然后通过条件注解判断是否需要加载到容器中。


## spring常见注解?


![在这里插入图片描述](https://img-blog.csdnimg.cn/a69c9140bd244f0fba73fcf7275cda73.png)


## springmvc常见注解?


![在这里插入图片描述](https://img-blog.csdnimg.cn/bce587c7e04b48c8b88637402f76978e.png)


## springboot常见注解?


![在这里插入图片描述](https://img-blog.csdnimg.cn/4c36fa05a5964013a6ed893372999175.png)


* @Conditional:  
 作用:条件注解,根据给定的条件判断是否需要配置某些Bean或组件。  
 使用方式:可以结合@ConditionalOnProperty、@ConditionalOnClass等条件注解一起使用,根据配置属性或类是否存在来决定是否创建某个Bean。
* @Indexed:  
 作用:标记一个类为可被Spring Boot自动配置的候选类。  
 使用方式:通常与@Configuration一起使用,表示该类可能包含自动配置相关的Bean定义,Spring Boot会根据类路径中的条件进行自动配置。
* @Import:  
 作用:用于导入其他配置类或组件。  
 使用方式:在Spring Boot中,可以使用@Import注解来导入其他配置类,进一步组合多个配置类来实现复杂的配置。


## mybatis的执行流程?


![在这里插入图片描述](https://img-blog.csdnimg.cn/0d6f457d6c3044729a371761b5f0b10e.png)


1.加载mybatis的核心配置文件(包含运行环境和映射文件)


2.构建sqlsessionfactory会话工厂,一个项目只需要一个,单例的,一般spring容器管理。


## 学习路线:

这个方向初期比较容易入门一些,掌握一些基本技术,拿起各种现成的工具就可以开黑了。不过,要想从脚本小子变成黑客大神,这个方向越往后,需要学习和掌握的东西就会越来越多以下是网络渗透需要学习的内容:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/7a04c5d629f1415a9e35662316578e07.png#pic_center)





**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值