1.某不知名小厂:

AOP(面向切面编程)的实现原理:

AOP 是一种编程范式,用于将横切关注点(cross-cutting concerns)从业务逻辑中分离出来。AOP 的实现原理主要依赖于代理模式。在 Java 中,AOP 通常通过以下两种方式实现:

  1. 静态代理:在编译时期,通过 AOP 框架生成代理类的字节码,直接编译成 class 文件。这种方式通常通过AspectJ等工具实现。

  2. 动态代理:在运行时期,通过反射机制动态创建目标对象的代理对象。Java 提供了 java.lang.reflect.Proxy 类和 java.lang.reflect.InvocationHandler 接口来实现动态代理。Spring AOP 就是基于动态代理实现的。

    以下是一些关于面向切面编程(AOP)的代码题目及其答案:

    题目1:编写一个简单的AOP示例,实现对某个方法执行前后添加日志功能。

    答案1:

    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.aspectj.lang.annotation.After;
    import org.aspectj.lang.annotation.Pointcut;
    @Aspect
    public class LoggingAspect {
        @Pointcut("execution(* com.example.service.*.*(..))")
        public void businessMethods() {}
        @Before("businessMethods()")
        public void logBefore() {
            System.out.println("方法执行前,记录日志...");
        }
        @After("businessMethods()")
        public void logAfter() {
            System.out.println("方法执行后,记录日志...");
        }
    }
    

    题目2:编写一个AOP切面,实现对某个方法进行权限校验。

    答案2:

    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.aspectj.lang.annotation.Pointcut;
    @Aspect
    public class PermissionAspect {
        @Pointcut("execution(* com.example.service.*.update*(..))")
        public void updateMethods() {}
        @Before("updateMethods()")
        public void checkPermission() {
            // 假设有一个方法用于校验权限
            if (!hasPermission()) {
                throw new RuntimeException("没有权限执行该操作!");
            }
        }
        private boolean hasPermission() {
            // 这里是模拟权限校验,实际项目中需要根据具体业务实现
            return true;
        }
    }
    

    题目3:编写一个AOP切面,实现对某个方法进行异常捕获并记录日志。

    答案3:

    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.AfterThrowing;
    import org.aspectj.lang.annotation.Pointcut;
    @Aspect
    public class ExceptionHandlingAspect {
        @Pointcut("execution(* com.example.service.*.*(..))")
        public void businessMethods() {}
        @AfterThrowing(pointcut = "businessMethods()", throwing = "e")
        public void logException(Throwable e) {
            System.out.println("捕获到异常:" + e.getMessage());
            // 这里可以将异常信息记录到日志文件中
        }
    }
    

    这些题目和答案仅供参考,实际项目中可能需要根据具体需求进行调整。希望这些题目能帮助你更好地理解AOP。

SpringBoot 的装配过程和实现原理:

SpringBoot 的装配过程主要依赖于 SpringFactoriesLoader 类和 @EnableAutoConfiguration 注解。以下是简要的装配过程:

  1. 启动类:SpringBoot 应用通常有一个带有 @SpringBootApplication 注解的启动类,这个注解包含了 @EnableAutoConfiguration

  2. 自动配置@EnableAutoConfiguration 注解告诉 SpringBoot 启动时自动配置。SpringBoot 会读取 classpath 下的 META-INF/spring.factories 文件,查找并加载所有可用的配置类。

  1. 条件注解:自动配置类通常会使用条件注解(如 @ConditionalOnClass@ConditionalOnMissingBean 等)来确保只有在满足特定条件时才会应用配置。

关于其他开源经历,这需要根据个人经验来回答。

Java 里的强引用和弱引用:

  • 强引用(Strong Reference):最常见的引用类型,如果一个对象具有强引用,那么垃圾回收器绝不会回收它。

  • 弱引用(Weak Reference):指向一个对象,但并不足以保证对象的生命周期。如果一个对象只有弱引用,那么在垃圾回收器线程扫描时,不管当前内存是否足够,都会回收该对象。

其他两种引用类型:

  • 软引用(Soft Reference):用于实现内存敏感的高速缓存。软引用指向的对象,当系统内存充足时,不会被回收;当系统内存不足时,会被回收。

  • 虚引用(Phantom Reference):也称为幽灵引用,它是最弱的一种引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。

HashMap 多线程并发问题:

HashMap 在多线程并发情况下可能出现以下问题:

  1. 数据覆盖:多个线程同时执行 put 操作,可能导致后一个线程的值覆盖前一个线程的值。

  2. 死循环:在 JDK 1.7 中,HashMap 的扩容操作可能引起链表成环,导致 get 操作出现死循环。

  1. 安全问题:在并发环境下,HashMap 的行为是不可预测的,可能导致数据丢失或脏读。

间隙锁(Gap Lock):

间隙锁是 InnoDB 中的一种锁机制,用于解决幻读问题。它锁定一个范围,但不包括记录本身。间隙锁可以防止其他事务在这个范围内插入新的记录,从而保证了事务的隔离性

行级锁解决的问题:

行级锁解决了事务在操作数据时,锁定整个数据表所带来的性能问题。通过锁定需要操作的数据行,减少了锁定的范围,提高了并发性能。

可重复读的实现:

可重复读是事务隔离级别的一种,InnoDB 通过以下方式实现:

  1. 多版本并发控制(MVCC):为每行数据生成多个版本,每个事务看到的数据都是快照版本。

  2. 行级锁:事务操作数据时,对数据行加锁。

事务的隔离级别及其保证方式:

  • 读未提交(Read Uncommitted):允许读取尚未提交的数据变更,通过共享锁实现。

  • 读已提交(Read Committed):只允许读取已经提交的数据变更,通过行级锁实现。

  • 可重复读(Repeatable Read):确保在事务内可以多次读取同样的数据结果,通过 MVCC 和行级锁实现。

  • 串行化(Serializable):确保事务可以从数据库中检索到的数据,就好像其他事务不存在一样,通过锁定整个范围的数据实现。

间隙锁的底层实现:

间隙锁是 InnoDB 通过在索引记录之间的空间插入特殊锁对象来实现的。

为什么选择短链接项目,项目难点,遇到的问题:

选择短链接项目的原因可能包括:

  • 节省字符:在短信、社交媒体等场景中,短链接可以节省字符空间。

  • 便于分享:短链接更易于分享和记忆。

  • 数据跟踪:通过短链接可以跟踪点击量、用户行为等。

#牛客创作赏金赛##软件开发薪资爆料#
Java大中厂秋招八股一本通 文章被收录于专栏

八股文分类整理 老哥们点点赞,订阅一下,纯福利做数据。

全部评论

相关推荐

不愿透露姓名的神秘牛友
10-24 09:25
菜鸟 后端 19×16 硕士211
点赞 评论 收藏
分享
点赞 1 评论
分享
牛客网
牛客企业服务