Spring相关的面试题

1.Spring框架的单例bean是线程安全的吗?

不是线程安全的。Spring框架中又一个@Scope注解,默认的值是singleton,单例的。因为一般在spring的bean中都是注入无状态的对象,没有线程安全问题,如果在bean中定义了可修改的成员变量,可以考虑线程的安全问题,或者使用多例或者加锁来解决。

当多个用户同时请求一个服务时,容器会给每一个请求分配一个线程,这个是多线程并发执行请求对应的业务逻辑,如果改处理逻辑中对该单列状态的修改,则要考虑线程同步问题。

2.什么是AOP,你们项目中有没有使用AOP?

(1)什么是AOP?

AOP是面向切面编程,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取公共模块复用,降级了耦合。

(2) 在项目中有没有使用过AOP?

记录操作日志,缓存,spring实现的事务。

记录操作日志:使用aop中的环绕通知+切点表达式(找到要记录事务的方法),通过环绕通知的参数获取请求的参数(类,方法,注释,请求方法,ip地址等),获取到这些参数以后,保存到数据库。

如何自己定义一个注解?

java 复制代码
@Component
@Aspect
public class SysAspect{
    // 连接点 加入Log注解 @Log(name = "xxxx")
    @Pointcut("@annotation(com.xxx.annotation.Log)")
    private void pointcut(){
    }
    
    // 环绕通知
    @Around("pointcut()")
    public Object around(ProceedingJoinPoint joinPoint) throw Throwable{
        //获取用户名
        //需要通过解析seesion或token获取

        //获取被增强类和方法的信息
        Signature signature = joinPoint.getSignature();
        MethodSignature methodSignature = (MethodSignature) signature;
        //获取被增强方法的名称
        Method method = methodSignature.getMethod();
        //从方法中解析注解
        if(method!=null){
            Log logAnnotation = method.getAnnotation(Log.class);
            System.out.println(logAnnotation.name());
        }

        // 通过工具类获取Request对象
        RequestAttributes reqa = RequestContextHolder.getRequestAttributes();
        ServletRequetAttributes sra = (ServletRequestAttributes)reqa;
        HttpServletRequest request = sra.getRequest();
        //访问url
        //请求方法
        //登录ip
        //操作时间

    }
}


@public @interface Log{
    public String name() default "";
}

(3)Spring中的事务是如何实现的?

其本质是通过AOP功能,对方法前后进行拦截,在执行方法前开启事务,在执行玩目标方法之后执行提交或者事务的回滚。

3.什么时候会导致Spring的事务失效?

(1)异常的捕捉处理。

事务通知只有捕捉到目标抛出的异常,才能进行后续的后滚处理,如果目标异常自己处理异常,事务通知无法知道。

解决:在catch块中添加 throw new RuntimeException(e)抛出。

(2)抛出检查异常

原因:Spring默认只会回滚非检查异常。

解决:配置rollbackFor属性

@Transactional(rollbackFor=Exception.class)

(3) 非public修饰方法

4.Srping的bean的生命周期

后置助理器

相关推荐
悲且狂20 分钟前
SpringBoot项目改造注意事项(旧项目框架复用)
java·spring boot·后端
花间相见1 小时前
【LangChain组件03】—— LangChain Agents 执行与状态:工作流程与状态管理实战
java·前端·langchain
敲代码的嘎仔1 小时前
28届后端开发-海康威视日常实习一面(已OC)
java·开发语言·后端·面试·海康威视·实习·大厂
IT_陈寒1 小时前
JavaScript数组排序踩的坑,差点让我加班到凌晨
前端·人工智能·后端
接着奏乐接着舞。2 小时前
【2026】73道Redis 常见面试题与参考答案
数据库·redis·后端·缓存
掘金者阿豪2 小时前
Seedance 2.0/2.5 虚拟素材能跨 Key 共用吗?一次讲清 Asset ID、账号隔离与 SaaS 素材架构
前端·后端
程序员黎剑2 小时前
Spring-Bean生命周期-构造器访问Autowired字段为null
java·后端·spring
泡海椒3 小时前
JQuick-Curl 拦截器实战:统一 Token、日志、请求预处理,让第三方接口调用真正工程化
后端
古法安卓3 小时前
Android-重启流程源码解析
android·java·android studio
东方小月3 小时前
一篇文章带你深入拆解Skill的本质与工程实现,让你不再滥用Skill
前端·人工智能·后端