Spring Core面试题
基础概念
Q1: Spring的核心特性有哪些?
public class SpringCoreBasicDemo {public class IoCExample {public void iocDemo() {@Configurationpublic class AppConfig {@Beanpublic UserService userService() {return new UserService(userRepository());}@Beanpublic UserRepository userRepository() {return new JdbcUserRepository();}}@Componentpublic class UserService {private final UserRepository userRepository;@Autowiredpublic UserService(UserRepository userRepository) {this.userRepository = userRepository;}}}}public class AOPExample {public void aopDemo() {@Aspect@Componentpublic 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生命周期是怎样的?
public class BeanLifecycleDemo {public class BeanDefinitionExample {public void beanDefDemo() {@Componentpublic class LifecycleBean implements InitializingBean, DisposableBean, BeanFactoryAware, BeanNameAware {@Overridepublic void setBeanFactory(BeanFactory beanFactory) {}@Overridepublic void setBeanName(String name) {}@PostConstructpublic void init() {}@Overridepublic void afterPropertiesSet() {}@PreDestroypublic void cleanup() {}@Overridepublic void destroy() {}}}}public class BeanPostProcessorExample {public void postProcessorDemo() {@Componentpublic class CustomBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) {if (bean instanceof LifecycleBean) {}return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) {if (bean instanceof LifecycleBean) {}return bean;}}}}
}
高级特性
Q3: Spring的事务管理是怎样的?
public class TransactionDemo {public class DeclarativeTransactionExample {public void transactionDemo() {@Configuration@EnableTransactionManagementpublic class TransactionConfig {@Beanpublic PlatformTransactionManager transactionManager(DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}}@Service@Transactionalpublic 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));}}}}public class ProgrammaticTransactionExample {public void programmaticTransactionDemo() {@Servicepublic 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>() {@Overridepublic Void doInTransaction(TransactionStatus status) {try {userRepository.save(user);emailService.sendWelcomeEmail(user);return null;} catch (Exception ex) {status.setRollbackOnly();throw ex;}}});}}}}
}
Q4: Spring的事件机制是怎样的?
public class EventDemo {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;}}@Servicepublic class UserService {private final ApplicationEventPublisher eventPublisher;@Autowiredpublic UserService(ApplicationEventPublisher eventPublisher) {this.eventPublisher = eventPublisher;}public void createUser(User user) {userRepository.save(user);eventPublisher.publishEvent(new UserCreatedEvent(this, user));}}}}public class EventListenerExample {public void eventListenerDemo() {@Componentpublic class UserEventListener {@EventListenerpublic void handleUserCreatedEvent(UserCreatedEvent event) {User user = event.getUser();}@EventListener@Asyncpublic void handleAsyncEvent(AsyncEvent event) {}@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)public void handleTransactionalEvent(TransactionalEvent event) {}}}}
}
Q5: Spring的缓存机制是怎样的?
public class CacheDemo {public class CacheConfigExample {public void cacheConfigDemo() {@Configuration@EnableCachingpublic class CacheConfig {@Beanpublic CacheManager cacheManager() {SimpleCacheManager cacheManager = new SimpleCacheManager();cacheManager.setCaches(Arrays.asList(new ConcurrentMapCache("users"),new ConcurrentMapCache("roles")));return cacheManager;}@Beanpublic KeyGenerator keyGenerator() {return new KeyGenerator() {@Overridepublic Object generate(Object target, Method method, Object... params) {return target.getClass().getSimpleName() + ":" + method.getName() + ":" + Arrays.toString(params);}};}}}}public class CacheUsageExample {public void cacheUsageDemo() {@Servicepublic 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() {}}}}
}
面试关键点
- 理解Spring的核心特性
- 掌握Bean生命周期
- 熟悉事务管理机制
- 了解事件处理机制
- 掌握缓存实现原理
- 理解AOP的实现
- 注意性能优化
- 关注最佳实践