Spring核心知识点笔试题及答案
一、选择题(每题4分,共20分)
下列关于SpringBean作用域的说法,错误的是()
A.singleton是默认作用域,容器中仅存在一个Bean实例
B.prototype作用域下,每次获取Bean都会创建新实例
C.request作用域的Bean,在整个HTTP请求期间仅创建一次
D.session作用域的Bean,可在多个浏览器会话间共享
SpringAOP中,用于“在目标方法执行后,无论是否抛出异常都执行”的通知类型是()
A.@BeforeB.@AfterC.@AfterReturningD.@AfterThrowing
下列哪种依赖注入方式,更适合依赖项较多的场景()
A.构造器注入B.setter注入C.字段注入(@Autowired直接注在字段上)D.接口注入
关于Spring事务传播行为,若当前没有事务,就新建一个事务;若已有事务,就加入当前事务,该传播行为是()
A.REQUIREDB.REQUIRES_NEWC.SUPPORTSD.NOT_SUPPORTED
下列哪个注解,不能用于将类标识为Spring管理的Bean()
A.@ComponentB.@ServiceC.@ControllerD.@Autowired
二、简答题(每题10分,共40分)
简述SpringIOC容器的核心作用,以及BeanFactory和ApplicationContext的主要区别。
说明SpringBean的完整生命周期(从创建到销毁),并列举2种初始化阶段的实现方式。
实际开发中,为什么不推荐用“字段注入(@Autowired注在字段上)”?举一个例子说明可能出现的问题。
SpringAOP的动态代理有哪两种实现方式?分别适用于什么场景?它们的核心区别是什么?
三、应用题(每题20分,共40分)
请编写一个基于Spring注解的AOP切面,实现“记录Service层所有方法的调用日志”功能,要求日志包含:方法名、入参列表、调用时间。
现有一个用户注册的Service方法(如下),需保证“用户插入数据库”和“发送注册短信”两个操作要么同时成功,要么同时失败。请补充代码,通过Spring事务实现该需求,并说明关键配置的作用。
@Service
publicclassUserService{
@Autowired
privateUserMapperuserMapper;
@Autowired
privateSmsServicesmsService;
//需补充事务配置的方法
publicvoidregister(Useruser){
//1.插入用户到数据库
userMapper.insert(user);
//2.发送注册成功短信
smsService.sendRegisterSms(user.getPhone());
}
}
答案部分
一、选择题
D(session作用域的Bean仅在当前浏览器会话内有效,不同会话不共享)
B(@After是最终通知,无论方法成功或异常都会执行;@AfterReturning仅成功后执行,@AfterThrowing仅异常时执行)
A(构造器注入强制依赖项在Bean创建时就初始化,避免后续使用NPE;setter注入适合可选依赖,依赖多则setter冗余)
A(REQUIRES_NEW是无论当前有无事务,都新建事务;SUPPORTS是有事务则加入,无则不使用事务)
D(@Autowired是用于注入Bean,而非标识Bean;前三者是标识Bean的注解,分别对应通用组件、服务层、控制层)
二、简答题
IOC容器核心作用:管理Bean的创建、依赖注入、生命周期,将对象的创建和依赖关系从代码中剥离,降低耦合。
BeanFactory与ApplicationContext区别:
BeanFactory是最基础的IOC容器,仅提供Bean的获取和依赖注入,延迟初始化(获取Bean时才创建);
ApplicationContext是BeanFactory的子类,除基础功能外,还支持国际化、事件发布、资源加载(如@Value读配置),立即初始化(容器启动时就创建所有singletonBean)