Spring Core面试题

news/2025/2/25 7:19:41

Spring Core面试题

基础概念

Q1: Spring的核心特性有哪些?

java">public class SpringCoreBasicDemo {
    // 1. IoC容器
    public class IoCExample {
        public void iocDemo() {
            // XML配置
            @Configuration
            public class AppConfig {
                @Bean
                public UserService userService() {
                    return new UserService(userRepository());
                }
                
                @Bean
                public UserRepository userRepository() {
                    return new JdbcUserRepository();
                }
            }
            
            // 注解配置
            @Component
            public class UserService {
                private final UserRepository userRepository;
                
                @Autowired
                public UserService(UserRepository userRepository) {
                    this.userRepository = userRepository;
                }
            }
        }
    }
    
    // 2. AOP实现
    public class AOPExample {
        public void aopDemo() {
            @Aspect
            @Component
            public class LoggingAspect {
                @Around("execution(* com.example.service.*.*(..))")
                public Object logMethod(ProceedingJoinPoint joinPoint) 
                    throws Throwable {
                    
                    String methodName = 
                        joinPoint.getSignature().getName();
                    logger.info("Before method: " + methodName);
                    
                    Object result = joinPoint.proceed();
                    
                    logger.info("After method: " + methodName);
                    return result;
                }
                
                @AfterThrowing(
                    pointcut = "execution(* com.example.service.*.*(..))",
                    throwing = "ex")
                public void logException(Exception ex) {
                    logger.error("Exception: " + ex.getMessage());
                }
            }
        }
    }
}

Q2: Spring的Bean生命周期是怎样的?

java">public class BeanLifecycleDemo {
    // 1. Bean定义
    public class BeanDefinitionExample {
        public void beanDefDemo() {
            @Component
            public class LifecycleBean implements 
                InitializingBean, 
                DisposableBean, 
                BeanFactoryAware, 
                BeanNameAware {
                
                @Override
                public void setBeanFactory(BeanFactory beanFactory) {
                    // BeanFactory回调
                }
                
                @Override
                public void setBeanName(String name) {
                    // Bean名称回调
                }
                
                @PostConstruct
                public void init() {
                    // 初始化方法
                }
                
                @Override
                public void afterPropertiesSet() {
                    // 属性设置后回调
                }
                
                @PreDestroy
                public void cleanup() {
                    // 销毁前回调
                }
                
                @Override
                public void destroy() {
                    // 销毁方法
                }
            }
        }
    }
    
    // 2. Bean后处理器
    public class BeanPostProcessorExample {
        public void postProcessorDemo() {
            @Component
            public class CustomBeanPostProcessor 
                implements BeanPostProcessor {
                
                @Override
                public Object postProcessBeforeInitialization(
                    Object bean, String beanName) {
                    if (bean instanceof LifecycleBean) {
                        // 初始化前处理
                    }
                    return bean;
                }
                
                @Override
                public Object postProcessAfterInitialization(
                    Object bean, String beanName) {
                    if (bean instanceof LifecycleBean) {
                        // 初始化后处理
                    }
                    return bean;
                }
            }
        }
    }
}

高级特性

Q3: Spring的事务管理是怎样的?

java">public class TransactionDemo {
    // 1. 声明式事务
    public class DeclarativeTransactionExample {
        public void transactionDemo() {
            @Configuration
            @EnableTransactionManagement
            public class TransactionConfig {
                @Bean
                public PlatformTransactionManager transactionManager(
                    DataSource dataSource) {
                    return new DataSourceTransactionManager(dataSource);
                }
            }
            
            @Service
            @Transactional
            public class UserService {
                @Transactional(
                    propagation = Propagation.REQUIRED,
                    isolation = Isolation.READ_COMMITTED,
                    rollbackFor = Exception.class)
                public void createUser(User user) {
                    userRepository.save(user);
                    emailService.sendWelcomeEmail(user);
                }
                
                @Transactional(readOnly = true)
                public User getUser(Long id) {
                    return userRepository.findById(id)
                        .orElseThrow(() -> 
                            new UserNotFoundException(id));
                }
            }
        }
    }
    
    // 2. 编程式事务
    public class ProgrammaticTransactionExample {
        public void programmaticTransactionDemo() {
            @Service
            public class UserService {
                private final PlatformTransactionManager transactionManager;
                private final UserRepository userRepository;
                
                public void createUser(User user) {
                    TransactionTemplate template = 
                        new TransactionTemplate(transactionManager);
                    template.execute(new TransactionCallback<Void>() {
                        @Override
                        public Void doInTransaction(
                            TransactionStatus status) {
                            try {
                                userRepository.save(user);
                                emailService.sendWelcomeEmail(user);
                                return null;
                            } catch (Exception ex) {
                                status.setRollbackOnly();
                                throw ex;
                            }
                        }
                    });
                }
            }
        }
    }
}

Q4: Spring的事件机制是怎样的?

java">public class EventDemo {
    // 1. 事件定义
    public class EventDefinitionExample {
        public void eventDefDemo() {
            // 自定义事件
            public class UserCreatedEvent 
                extends ApplicationEvent {
                
                private final User user;
                
                public UserCreatedEvent(Object source, User user) {
                    super(source);
                    this.user = user;
                }
                
                public User getUser() {
                    return user;
                }
            }
            
            // 事件发布者
            @Service
            public class UserService {
                private final ApplicationEventPublisher eventPublisher;
                
                @Autowired
                public UserService(
                    ApplicationEventPublisher eventPublisher) {
                    this.eventPublisher = eventPublisher;
                }
                
                public void createUser(User user) {
                    userRepository.save(user);
                    eventPublisher.publishEvent(
                        new UserCreatedEvent(this, user));
                }
            }
        }
    }
    
    // 2. 事件监听
    public class EventListenerExample {
        public void eventListenerDemo() {
            @Component
            public class UserEventListener {
                @EventListener
                public void handleUserCreatedEvent(
                    UserCreatedEvent event) {
                    User user = event.getUser();
                    // 处理用户创建事件
                }
                
                @EventListener
                @Async
                public void handleAsyncEvent(AsyncEvent event) {
                    // 异步处理事件
                }
                
                @TransactionalEventListener(
                    phase = TransactionPhase.AFTER_COMMIT)
                public void handleTransactionalEvent(
                    TransactionalEvent event) {
                    // 事务提交后处理事件
                }
            }
        }
    }
}

Q5: Spring的缓存机制是怎样的?

java">public class CacheDemo {
    // 1. 缓存配置
    public class CacheConfigExample {
        public void cacheConfigDemo() {
            @Configuration
            @EnableCaching
            public class CacheConfig {
                @Bean
                public CacheManager cacheManager() {
                    SimpleCacheManager cacheManager = 
                        new SimpleCacheManager();
                    cacheManager.setCaches(Arrays.asList(
                        new ConcurrentMapCache("users"),
                        new ConcurrentMapCache("roles")));
                    return cacheManager;
                }
                
                @Bean
                public KeyGenerator keyGenerator() {
                    return new KeyGenerator() {
                        @Override
                        public Object generate(Object target, 
                            Method method, Object... params) {
                            return target.getClass().getSimpleName() + 
                                ":" + method.getName() + 
                                ":" + Arrays.toString(params);
                        }
                    };
                }
            }
        }
    }
    
    // 2. 缓存使用
    public class CacheUsageExample {
        public void cacheUsageDemo() {
            @Service
            public class UserService {
                @Cacheable(
                    value = "users",
                    key = "#id",
                    condition = "#id != null",
                    unless = "#result == null")
                public User getUser(Long id) {
                    return userRepository.findById(id)
                        .orElse(null);
                }
                
                @CachePut(
                    value = "users",
                    key = "#user.id")
                public User updateUser(User user) {
                    return userRepository.save(user);
                }
                
                @CacheEvict(
                    value = "users",
                    key = "#id")
                public void deleteUser(Long id) {
                    userRepository.deleteById(id);
                }
                
                @CacheEvict(
                    value = "users",
                    allEntries = true)
                public void clearCache() {
                    // 清除所有缓存
                }
            }
        }
    }
}

面试关键点

  1. 理解Spring的核心特性
  2. 掌握Bean生命周期
  3. 熟悉事务管理机制
  4. 了解事件处理机制
  5. 掌握缓存实现原理
  6. 理解AOP的实现
  7. 注意性能优化
  8. 关注最佳实践

http://www.niftyadmin.cn/n/5865156.html

相关文章

Spring Boot 2/3.x 中 MultipartFile 接收问题深度解析与实战解决方案

文章目录 引言&#xff1a;文件上传的暗礁与应对一、核心机制解析1.1 多部分请求处理流程1.2 关键配置参数演进 二、典型问题排查与修复2.1 文件接收为null问题2.2 大文件上传内存溢出 三、版本差异陷阱3.1 Jakarta Servlet API迁移影响3.2 默认配置变更对比 四、高级问题解决方…

代码随想录算法训练day63---图论系列7《prim算法kruskal算法》

代码随想录算法训练 —day63 文章目录 代码随想录算法训练前言一、53. 寻宝—prim算法打印出来最小生成树的每条边 二、53. 寻宝—kruskal算法打印出来最小生成树的每条边 总结 前言 今天是算法营的第63天&#xff0c;希望自己能够坚持下来&#xff01; 今天继续图论part&…

mininet正常,miniedit打开报错

按照我上一篇写的mininet安装方法&#xff0c;无法打开miniedit&#xff08;日期&#xff1a;2025.02.24&#xff0c;可能以后就好了&#xff0c;或者下一个版本就好了&#xff09;&#xff0c;所以我更换了mininet的源&#xff0c;并重写一篇记录之。 折腾原因 mininet安装成…

YOLO11的单独推理程序

YOLO11的单独推理程序,可以实例化加载一次多次推理。 YOLO11的单独推理程序,可以实例化加载一次多次推理。 YOLO11的单独推理程序,可以实例化加载一次多次推理。 YOLO11的单独推理程序,可以实例化加载一次多次推理。 YOLO11的单独推理程序,可以实例化加载一次多次推理…

git中,如何查看具体单个文件的log

在 Git 中&#xff0c;可以使用多种方式查看单个文件的提交日志&#xff08;Log&#xff09;&#xff0c;以下详细介绍不同场景下的查看方法&#xff1a; 目录 一、基本命令查看文件的完整提交日志 二、查看文件提交日志并显示差异内容 三、限制显示的提交日志数量 四、按…

数据异常和数据缺失解决方式记录

一、异常值剔除解决方案 在时间序列预测中&#xff0c;如果检测并剔除了异常值&#xff0c;会导致时间序列不连续&#xff0c;进而影响模型的训练和预测。为了解决这个问题&#xff0c;可以采用以下方法&#xff1a; 1. 填补缺失值 剔除异常值后&#xff0c;可以通过以下方法…

考研/保研复试英语问答题库(华工建院)

华南理工大学建筑学院保研/考研 英语复试题库&#xff0c;由华工保研er和学硕笔试第一同学一起整理&#xff0c;覆盖面广&#xff0c;助力考研/保研上岸&#xff01;需要&#x1f447;载可到文章末尾见小&#x1f360;。 以下是主要内容&#xff1a; Part0 复试英语的方法论 Pa…

【数据结构第十六节】实现链式结构二叉树(详细递归图解—呕心沥血版!)

必须有为成功付出代价的决心&#xff0c;然后想办法付出这个代价。云边有个稻草人-CSDN博客 这节课挺抽象&#xff08;苦笑&#xff09;&#xff0c;没事&#xff0c;我会帮你&#xff01;干就完了&#xff01; &#xff08;目录在路上&#xff09; 正文开始—— 引言 用链表…