跳至主要內容

面试-Spring

TenSoFlow...大约 6 分钟面试面试-Spring

面试-Spring

对Spring的理解

问:对Spring的理解

答:Spring核心思想为IOC、DI、AOP。Spring框架使用了Java里面的反射机制。IOC就是把对象的创建控制权转移到IOC容器并且负责对象的创建、初始化等一系列工作。被创建的对象在IOC容器中称为Bean。在容器中建立Bean与Bean之间的关系就称为依赖注入。AOP底层是代理模式,可以在不改变原有代码结构的情况下增强功能。具体操作核心是先定义切面来封装通用逻辑,再通过切点明确要切入的目标方法(如指定包 / 类 / 方法规则),接着定义通知确定增强逻辑的执行时机(前置 / 后置 / 环绕 / 异常 / 最终)。

Spring的二种注入方式

问:Spring的二种注入方式

答:setter方式和构造方法的方式

AOP有哪些应用场景

问:AOP有哪些应用场景

答:事务管理、日志打印。

Spring中的事务是如何实现的

问:Spring中的事务是如何实现的

答:Spring支持编程式事务和声明式事务两种方式。一般使用声明式事务即在方法上加入@Transactional注解

Spring事务失效场景

问:Spring事务失效场景

答:1. 异常捕获并自己处理了并没有抛出异常
2. 抛出检查异常(throws xxxException),可以为@Transactional配置rollbackFor属性,@Transactional(rollbackFor=Exception.class)
3. 非public方法导致事务失效
4. 同类内部调用(this):原因是用this没有走代理,用的是原生对象

@Autowired 和@Resource的区别?

问:@Autowired 和@Resource 的区别?

答:@Autowired是按照类型进行注入其属于Spring框架注解。@Resource会按照名称注入,名称找不着会按照类型来找其属于JDK自带注解。

为什么Bean要设计成单例

问:为什么Bean要设计成单例

答:资源利用效率:单例模式可以节省系统资源,避免重复创建和销毁对象。当一个对象被多次请求时,只需要创建一次实例并重复使用,提高了系统的资源利用效率。对象一致性:对于某些需要保持一致状态或共享数据的对象,使用单例模式可以确保全局只有一个实例。这样可以避免多个实例之间的数据不一致性问题,简化了数据管理和同步的复杂性。全局访问性:单例模式使得对象在整个应用程序的上下文中可被访问。这对于需要在不同的组件或模块中共享数据或提供共享服务的对象非常有用。配置和管理简便性:在Spring框架中,Bean的单例模式使得对象的创建、依赖注入和生命周期管理更加简便。通过Spring容器的管理,可以统一配置和管理Bean的创建和销毁过程。

Spring中Bean的生命周期

问:Spring中Bean的生命周期

答:通过BeanDefinition获取Bean的定义信息
调用构造函数实例化Bean
Bean的依赖注入
处理Aware接口
Bean的后置处理器BeanPostProcessor-前置
初始化方法
Bean的后置处理器BeanPostProcessor-后置
销毁Bean

Spring解决循环依赖

问:Spring解决循环依赖

答:循环依赖就是两个Bean互相依赖对方最终形成闭环,比如A依赖B,B依赖A。Spring解决通过setter方式注入的循环依赖问题是通过三级缓存。
一级缓存:缓存完整的Bean对象
二级缓存:缓存Bean对象的半成品
三级缓存:缓存Bean对象的工厂对象
解决构造方法依赖注入的方式是使用@Lazy注解进行懒加载,什么时候需要对象再进行Bean的创建

public A(@Lazy B b) {
    System.out.println("A的构造方法执行了...");
    this.b = b;
}

JDK代理和CGLIB代理使用场景

问:JDK代理和CGLIB代理使用场景

答:目标类实现了接口用JDK动态代理
没有接口用CGLIB代理

Spring事务传播机制

问:Spring事务传播机制

答:required:有事务则加入,没有则创建(默认行为)
requires_new:无论有无事务,都新建独立事务
supports:有事务则加入,无事务则非事务运行
mandatory:必须在事务内运行,无事务抛出异常
not_supported:始终非事务运行,有事务则挂起
never:必须在非事务内运行,有事务抛出异常
nested:外层有事务则嵌套执行,无事务则新建事务

Spring事务是如何和数据库连接绑定的

问:Spring事务是如何和数据库连接绑定的

答:Spring事务通过ThreadLocal把数据库连接绑定到当前线程,实现事务与连接的绑定事务开启时,从数据源获取连接,放入ThreadLocal缓存,不再释放回连接池。同一线程内的所有DAO操作,都从ThreadLocal取同一个连接,共用同一事务事务提交 / 回滚后,连接才释放并归还连接池,同时清空ThreadLocal。多线程环境下互不干扰,每个线程持有独立连接,实现事务隔离。

BeanFactory和FactoryBean

问:BeanFactory和FactoryBean

答:BeanFactory:是Spring的Bean容器顶层接口,负责加载、创建、管理 Bean
FactoryBean:是一个能生产Bean对象的工厂Bean,通过getObject () 返回实例,可定制复杂Bean创建逻辑

@Configuration和@Component区别

问:BeanFactory和FactoryBean

答:@Configuration本质是@Component的增强版,用于声明配置类@Configuration会被CGLIB代理,调用内部@Bean方法是单例。@Component不会代理,多次调用会新建新对象。

Spring中常用注解

问:Spring中常用注解
@Component
@Controller
@Service
@Repository
@Autowired
@Qualifier
@Scope
@Configuration
@ComponentScan
@Bean
@Import
@Aspect
@Before
@After
@Around
@Pointcut

SpringMVC中常用注解

问:SpringMVC中常用注解
@RequestMapping
@RequestBody
@RequestParam
@PathViriable
@ResponseBody
@RequestHeader
@RestController

拦截器与过滤器

问:拦截器与过滤器

答:过滤器(Filter):Servlet规范,它能拦截所有进入应用的请求和响应,比如静态资源、登录访问等,它可以修改请求和响应,但无法访问Spring容器内部的Bean。
拦截器(Interceptor):SpringMVC框架自带,作用于Spring容器内部,它只拦截Controller层方法,可以完全访问Spring的上下文,比如获取Bean,处理业务逻辑等。所以在做登录校验、日志记录或权限控制时倾向于使用拦截器。

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.8