欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 文化 > springboot+mybatis+springmvc面试题

springboot+mybatis+springmvc面试题

2025/9/20 3:46:26 来源:https://blog.csdn.net/yang_xiao_wu_/article/details/148615635  浏览:    关键词:springboot+mybatis+springmvc面试题

1.MyBatis工作流程

        1.加载配置文件

        2.生成SqlSessionFactory

        3.建立SqlSession

        4.调用Mybatis提供的API

        5.查询Mapper配置文件

        6.返回结果

        7.关闭session

2.${} 和 #{}的区别? 

 ${}:简单字符串替换,把${}直接替换成变量的值,不做任何转换,这种是取值以后再去编译SQL语句,底层采用Statement语句,不能防止sql注入攻击。

• #{}:预编译处理,sql中的#{}替换成?,补全预编译语句,有效的防止Sql语句注入,这种取值是编译好SQL语句再取值。

3.mybatis多表关联查询如何实现一对一关联、一对多关联?怎么设置关联对象的类型? 

一对一关联和一对多关联都需要自定义标签 Assocication  Collection。

一对一通过标签定义,通过javaType指定关联对象的类型

一对多通过标签定义,通过ofType指定关联对象的类型

4.Mybatis的好处?mybatis的缓存机制,一级,二级介绍一下

 把Sql语句从Java中独立出来。

• 封装了底层的JDBC,API的调用,并且能够将结果集自动转换成JavaBean对象,简化了Java数据库编程的重复工作。

• 自己编写Sql语句,更加的灵活。

• 入参无需用对象封装(或者map封装),使用@Param注解

mybatis提供了缓存机制减轻数据库压力,提高数据库性能

mybatis的缓存分为两级:一级缓存、二级缓存

一级缓存是SqlSession级别的缓存,缓存的数据只在SqlSession内有效

二级缓存是mapper级别的缓存,同一个namespace公用这一个缓存,所以对SqlSession是共享的

5.mybatis给我们提供了哪些标签来生成动态SQL? 

if标签: 判断标签,当参数符合判断条件拼接SQL语句。

where标签: 替代where关键字。

foreach标签: 向SQL传递数组或list,MyBatis使用foreach解析。

sql标签: 将实现的动态SQL判断代码块抽取出来,组成一个SQL片段,其它的statement中就通过`<include>`标签就可以引用SQL片段,方便程序员进行开发。

set标签:替代set关键字。

choose、when、otherwise标签:用于实现类似于编程语言中的 switch 语句的逻辑判断功能。

6.Mybatis中resultType 和 resultMap 的区别? 

resultType:自动映射,如果数据库结果集中的列名和要封装实体的属性名完全一致的话用 resultType 属性。

resultMap:手动映射,如果数据库结果集中的列名和要封装实体的属性名有不一致的情况用 resultMap 属性,通过 resultMap标签手动建立对象关系映射。

7.Spring IOC、DI、AOP是什么?

IOC:控制反转,将创建对象的权力转交给Spring,由 Spring 负责创建对象,管理对象,装配对象,并且管理这些对象的整个生命周期。

DI:我们在使用Spring 容器的时候,容器通过调用set 方法或者是构造器来建立对象之间的依赖关系。

AOP:面向切面编程,通过在不修改原有代码的情况下,将横切关注点(如事务管理、日志记录等)从核心业务逻辑中解耦出来,并在需要的地方进行统一的切面逻辑处理。

8.Spring中配置的单例bean默认什么时候初始化?如何实现懒加载? 

Spring中配置的单例bean默认在容器启动时就初始化。

懒加载:通过给添加lazy-init=”true”属性就可以将bean初始化的时机延迟到使用时

懒加载只要单例模式下有效

单例模式:默认情况下,在创建ioc容器时,创建对象。

    创建对象时,默认调用无参构造方法创建对象。  无参构造只执行一遍。

    初始化方法(在对象创建后,自动调用的方法)。 初始化方法只执行一遍。

    销毁前调用的方法(关闭ioc容器时,自动调用的) 。只执行一次。

懒加载:只针对单例模式有效。

    在首次使用对象时创建对象(而不是在创建容器时创建对象)。

多例模式下:可以创建很多对象,不是提前创建的对象,是使用是创建对象。

    每获取一次对象,创建一个对象,执行一次构造方法,执行一次初始化方法。

单例模式下,关闭容器时销毁。

多例模式下:对象  由  jvm虚拟机 垃圾回收器 在 后台进程自动销毁。

9.Springboot日志级别有哪些?如何更改日志级别 

日志级别:error、warn、info、debug、trace

更改日志级别:application.yml中配置:

logging:

 level:

  com:

   lanou: debug

10.Springboot自动配置的原理。 

1.当启动项目时,会执行@SpringbootApplication

2.该注解会启动其下的@EnableAutoConfiguration(自动装配)

3.自动装配的注解就是从 组件自动装配选择器(AutoConfigurationImportSelector)中读取组件列表

4.组件列表(META-INF/spring.factories)中就列举了众多需要进行整合的组件

5.就会找到对一个的组件类(xxxAutoConfiguration)

6.在组件类的上方就会判断当前项目是否需要与此组件整合 (@ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class}))

7.如果判断当前项目没有此类,则不会进行该组件的加载

8.如果判断当前项目有此类,则会读取与该组件整合的配置文件 (@EnableConfigurationProperties({DataSourceProperties.class}))

9.如果读取失败,则装配失败,项目报错

10,如果读取成功,则装配成功,springboot与该技术即整合成功

总结:整合什么技术 -- 导入该技术的jar包(场景包) -- 设置相关的属性 -- 整合成功

结论:

SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration;

每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。

xxxxProperties里面拿。

xxxProperties和配置文件进行了绑定;

生效的配置类就会给容器中装配很多组件;

只要容器中有这些组件,相当于这些功能就有了;

11. Springboot添加Interceptor拦截器时,拦截器中preHandle、postHandle、afterCompletion方法含义?

perHandle:在controller的方法调用前调用执行。

postHandle:在controller的方法执行之后,返回给前端数据之前调用执行。

afterCompletion:在整个执行流程结束之后调用执行。

12.@ConditionalOnClass、@ConditionalOnMissingClass分别是什么含义

@ConditionalOnClass:判断项目中是否有对应的类,有:创建bean对象,没有:不创建bean对象。

@ConditionalOnMissingClass:判断项目中是否有对应的类,有:不创建bean对象,没有:创建bean对象。

13.我们要写一个过滤器、拦截器需要哪些步骤?

1. 创建一个普通Java类 

2. 实现Filter接口,重写doFilter、init(FilterConfig config)、destroy 

3. 通过在web.xml中配置、或者通过@WebFilter注解注册到容器中 

————————————————————————————

1)创建类实现@HanlderInterceptor

2)重写preHanlder前置拦截    postHanlder后置拦截    afterCompletion最后执行

3)配置拦截路径

配置文件类   实现webMvcConfigure接口

重写addInterceptor方法配置拦截器信息

添加拦截路径addPathPatterns("/**")、放行路径excludePathPatterns("/user/download")

14.SpringMVC拦截器和Servlet中的过滤器有什么区别?

拦截器是SpringMVC框架中封装的一个组件,拦截的是让不让一个请求执行对应的Handler,过滤器是Servlet标准中的组件,拦截的是让不让一个请求访问Servlet或者页面。

1.拦截器是基于 java 的反射机制的,而过滤器是基于函数回调。

2.拦截器不依赖与 servlet 容器,过滤器依赖与 servlet 容器。

3.拦截器只能拦截控制器,过滤器可以拦截所有的资源:Servlet,JSP,HTML。

4.拦截器在控制器的生命周期中,可以多次被调用,过滤器在所有请求调用之前。

5.拦截器可以访问控制器上下文、值栈里的对象,而过滤器不能访问。

15.springmvc接收参数的几种形式?

方式一、原生 HttpServletRequest 接收数据

方式二:通过参数名称接收 要求 url后传递的参数名和方法的形参名保持一致

方式三、参数名称不一致时  @RequestParam(name = "username")  参数映射
     1、限制是否允许为空  @RequestParam 默认不允许为空
     @RequestParam(required = false)
     required = false  是否允许为空
     2、是否给默认值 @RequestParam(defaultValue = "12345")
方式四、通过对象接收数据 (当前端传递的参数名和对象的属性名保持一致时)

方法五、restful风格接收(@PathVariable 地址栏传参)

16.SpringMVC的工作流程? 

17.Spring 中事务的传播行为和隔离级别分别代表什么含义?并分别列举几个常用的传播行为和隔离级别

事务的传播行为说的是事务与事务之间的嵌套关系。比如B事务如果嵌套在A事务中时,是复用A事务,还是各用各的事务,还是将A事务挂起,仅在B事务中运行,亦或是不在事务中运行。

常用的传播行为:

传播行为含义
REQUIRED(默认)当前有事务则加入,没有则新建事务。
REQUIRES_NEW总是新建事务,并挂起当前事务(如果存在)。
SUPPORTS当前有事务则加入,没有则以非事务方式运行。
NOT_SUPPORTED以非事务方式运行,并挂起当前事务(如果存在)。
MANDATORY必须在事务中调用,否则抛出异常。
NEVER必须在非事务中调用,否则抛出异常。
NESTED如果当前有事务,则在嵌套事务中执行(子事务回滚不影响父事务)。

事务的隔离级别说的是事务与事务之间的可见性关系。比如A事务在提交到数据库之前,B事务能否读取到A事务操作的数据。

常用的隔离级别:

隔离级别含义存在的问题
READ_UNCOMMITTED最低级别,可能读到其他事务未提交的数据(脏读)。脏读、不可重复读、幻读。
READ_COMMITTED只能读到其他事务已提交的数据(解决脏读)。不可重复读、幻读。
REPEATABLE_READ同一事务内多次读取结果一致(解决脏读、不可重复读)。幻读(MySQL 通过 MVCC 部分解决)。
SERIALIZABLE最高级别,完全串行化执行(解决所有并发问题,但性能最差)。无并发问题,但性能低。

18.SpringMvc的作用及你对springmvc的理解?

作用:

spring MVC是一个分层的java web开发框架,MVC模式提供了一个分层的体系结构,其中每一层对其它层进行了抽象,具体如下:

1.模型(Model):应用程序所使用的特定域信息的表现形式

2.视图(View):域模型的表现形式(通过使用诸如输入元素和按钮之类的用户界面元素,而这些元素与模型进行交互)。

3.控制器(Controller):主要负责解释用户的输入并转换为模型,然后将转换后的结果显示给用户。

优点:

让我们能非常简单的设计出干净的Web层,进行更简洁的Web层的开发

天生与Spring框架集成(如IoC容器、AOP等)

提供强大的约定大于配置的契约式编程支持

非常灵活的数据验证、格式化和数据绑定机制

支持Restful风格

19.事务相关注解

@EnableTransactionManagement 开启全局事务支持
@Transactional 使用事务
    readOnly = true, 只读事务  当前事务中查询出的数据,不能用户更新操作
    rollbackFor = Exception.class  当遇到特定异常,执行rollback回滚
    noRollbackFor = {} 当发生某种异常,不回滚
    timeout=数值   超时时间
    propagation =  事务的传播机制  a--调用-->b b是否能够使用事务的问题
            Propagation.REQUIRED
    isolation =  事务的隔离行为  两个方法在使用事务时,对方操作的数据是否可见

20.sql注解有哪些

注解名称用途说明关键参数适用场景
@Insert定义插入操作value: SQL 语句(可省略)插入单条数据
@Update定义更新操作value: SQL 语句(可省略)更新数据
@Delete定义删除操作value: SQL 语句(可省略)删除数据
@Select定义查询操作value: SQL 语句(可省略)简单查询
@Options配置 SQL 执行选项useGeneratedKeys: 是否使用自增主键
keyProperty: 实体类主键属性名
keyColumn: 数据库主键列名
flushCache: 是否刷新缓存
需要获取自增 ID 的操作
@Results定义结果集映射value@Result 数组
id: 映射 ID(可复用)
复杂结果映射(字段名不一致)
@Result单字段映射配置column: 数据库列名
property: 实体类属性名
javaType: Java 类型
jdbcType: JDBC 类型
字段与属性名不一致时
@One定义一对一关联select: 关联查询方法名
fetchType: 加载方式(LAZY/EAGER
一对一关联查询(如用户-档案)
@Many定义一对多关联select: 关联查询方法名
fetchType: 加载方式(LAZY/EAGER
一对多关联查询(如用户-订单)

21.如何实现延迟加载

当我们不需要另一个查询时,该查询先不执行。

当我们需要另一个查询的数据时,再执行该查询。

需要??:当我们访问这个关联属性时,进行查询;不访问关联属性时,不执行查询。

select="sql语句唯一标识" 嵌套查询

fetchType="eager" 立即加载
fetchType="lazy" 延迟加载


fetchType="eager" 数据的抓取策略:
                eager立即加载 
                lazy延迟加载 : 使用数据时查询(比如return返回时json序列化,或者debug模式看数据内容)

22.分页插件如何实现

MyBatis分页可以通过PageHelper插件实现。首先引入PageHelper的starter依赖,然后在查询方法前调用PageHelper.startPage(pageNum, pageSize)设置分页参数。

需要注意PageHelper.startPage()必须紧跟在查询方法前调用,且只对紧接着的第一个查询有效。

23.如何实现实现springboot和mybatis的整合

"搭建SpringBoot+MyBatis项目主要分四步:首先引入mybatis-spring-boot-starter和数据库驱动依赖;接着在application.yml配置数据源和mapper.xml路径;然后创建实体类和带@Mapper注解的接口;最后在XML文件写SQL,Service层调用Mapper即可。"

关键点:

  1. 依赖:mybatis starter + 数据库驱动
  2. 配置:数据源 + mapper路径
  3. 结构:实体类 -> Mapper接口 -> XML映射文件
  4. 使用:Service注入Mapper执行SQL

24.sqlMapper文件新增返回自增主键

<!--useGeneratedKeys="true"  获取自动生成的主键keyProperty="studentId"  主键对应的属性名--><insert id="insertStudent" useGeneratedKeys="true" keyProperty="studentId">insert into student(name,gender,birth_date,class_id,enrollment_date)values (#{name},#{gender},#{birthDate},#{classId},now())</insert>

25.如何实现参数校验功能

1)pom.xml文件添加 spring-boot-starter-validation依赖

2)相关的注解有哪些? 

  • @NotNull:用于检查被注解的元素值是否为null。适用于字符串、集合、Map等任何对象类型,但不适用于基本数据类型(如int、long等)。
  • @NotBlank:用于检查被注解的字符串元素是否不为null且去除两端空白字符后长度大于0。只适用于字符串类型。
  • @NotEmpty:用于检查被注解的元素不为null且不为空。适用于字符串、集合、Map等。如果是字符串,相当于同时检查null和长度大于0。
  • @Size:用于指定字段的长度范围。可以指定最小长度(min)和最大长度(max)。
  • @Email:用于检查被注解的字符串是否为有效的电子邮件地址。
  • @Pattern:用于检查被注解的字符串是否符合指定的正则表达式。
  • @Min 和 @Max:分别用于检查被注解的数值是否大于等于最小值和小于等于最大值。
  • @DecimalMin 和 @DecimalMax:分别用于检查被注解的小数是否大于等于最小值和小于等于最大值。
  • @Range 是 Hibernate Validator 提供的一个用于数据校验的注解,它主要用于对数值类型(如 int、long、BigDecimal 等)的属性进行范围校验,确保属性值在指定的最小值和最大值之间。

3)针对方法参数,单独校验如何实现?----在Controller的方法参数上使用`@Valid`或`@Validated`注解来触发校验。`@Valid`通常用于方法参数,而`@Validated`可以用于方法参数或类上。

4)针对接收的bean对象,如何整体校验---接受对象定义(在对象属性上添加相应注解,比如

 @Emailprivate String email;,然后在controller上使用,例如public R m2(@Valid User user))

26.springmvc异常处理两种方式

局部异常处理----@ExceptionHandler(Exception.class)

全局异常处理----可以限制特定的包、特定的类、使用了特定注解的类, 还可以限制只处理特定的异常-----@RestControllerAdvice(annotations = RestController.class,
        basePackages = "com.hl.springboot3.web",
        basePackageClasses = {UserController.class})

        @ExceptionHandler(Exception.class)

@RestControllerAdvice=@ControllerAdvice+@ResponseBody

27.定时器  相关的注解,如何定时功能

//开启定时----在启动类上添加该注解
@EnableScheduling

//表示每隔6秒打印一次
@Scheduled(cron = "*/6(秒) *(分) *(时) *(日) *(月) *(周)")(再往后加*还有年,但老师没演示成功,好像不可用)

//表示每隔6秒打印一次
@Scheduled(fixedRate = 6000)

//第一次延迟5秒执行,之后10秒执行一次
@Scheduled(initialDelay = 5000, fixedDelay = 10000)

@Scheduled(fixedRate = 6000) :上一次开始执行时间点之后6秒再执行
@Scheduled(fixedDelay = 6000) :上一次执行完毕时间点之后6秒再执行

28.springboo如何集成jdbc

1)创建springboot项目,导入jar包  spring-boor-starter-jdbc.jar

2)配置数据库连接信息  application.yml

         spring.datasource.url  username  pasword  driver-class-name

3)创建持久层  实现jdbc增删改查

      jdbcTemplate工具类

      增删改----jdbcTemplate.update(sql,参数赋值)

      查----jdbcTemplate.query(sql, new BeanProperty<>Goods.class,参数赋值)

 29.如何实现文件上传、下载

 springboot 环境下

前端 ----post请求、body-->form-data---选择file类型

后端----  接受文件对象  @PostMapping  public String  upload(MultipartFile  file)

              保存文件对象  接收到的临时文件转存到指定目录(底层是字节流copy   从输出流copy到输入流)

              返回文件路径
————————————————————————————

1)前端发起请求,传递要下载的文件名

heep://localhost:8080/user/download?filename=001.jpg

2)接受要下载的文件名

3)找到文件路径

File file = new File(path+"/"+filename)

4)将file对象转为输出相应流,响应给前端

OutputStream out = HttpServletResponse.getOutputStream();

5) response.setHeader("Content-Disposition","attachment;filename"+filename);

通知浏览器以下载附件的方式打开响应流

IOUtils.copy(in,out)

6)关闭流

 30.常见的错误及其解决方案

常见错误类型:
404:路径未找到   http://localhost:8080/product/save4
405: 方法不匹配   前端get ---->  服务端@PostMapping       @RequestMapping(method="")
400: 参数赋值错误
        前端id=abc   服务端:Integer id
        前端没有传递id null  服务端  int id  null--->int 报错
        前端id没有传值     服务端  @RequestParam(required=true)  Integer id
500: 服务端错误
    1、接收到请求了
    2、接收到数据
    3、方法体报错

错误码主要原因解决方案示例场景
404
Not Found
1. URL 路径错误
2. 控制器未加载
1. 检查 @RequestMapping 路径拼写
2. 确认类有 @RestController 或 @Controller 注解
错误示例
/produkt/list(拼写错误)
正确示例
/product/list
405
Method Not Allowed
HTTP 方法不匹配(如 GET 请求访问 POST 接口)1. 统一前后端请求方法
2. 使用 @GetMapping/@PostMapping 明确指定
前端GET /api/user
后端@PostMapping("/api/user")
400
Bad Request
1. 参数类型转换失败
2. 必填参数缺失
1. 使用包装类(如 Integer 代替 int
2. 添加 @RequestParam(required=false)
错误示例
id=abc 传给 int id
正确示例
@RequestParam(required=false) Integer id
500
Internal Server Error
服务端代码异常(如 NPE、数据库错误)1. 添加 try-catch 捕获异常
2. 使用 @ControllerAdvice 全局异常处理
错误示例
userService.findById(null)(空指针异常)
415
Unsupported Media Type
请求媒体类型不匹配(如未声明 JSON 格式)1. 添加 @RequestBody 注解
2. 设置请求头 Content-Type: application/json
前端:发送 JSON 但未加 @RequestBody
后端public User add(@RequestBody User user)
401
Unauthorized
未授权访问(如 Token 无效或未登录)1. 检查 Token 有效性
2. 配置 Spring Security 白名单
错误示例
访问 /admin 接口未携带 Token

 31.转发和重定向的联系和区别

联系:都可以进行页面跳转

区别:

1、转发,是服务端转发,是服务端行为。 重定向是有浏览器重新发起请求,是客户端行为。

2、转发,浏览器只发起一次请求。重定向:浏览器至少发起两次请求。

3、转发,浏览器地址栏不更改。重定向:浏览器地址栏更改。

4、转发,可以转发到当前应用任何页面。重定向:不能访问web-inf下的页面。

5、转发,不能转发到其他应用中。重定向:可以重定向到外部项目。

6、转发,可以携带request作用域的数据,重定向不可以。

 32.get、post区别

  • 参数可见性。get请求的参数是放在地址栏中的,post请求的参数是放在请求体中(用户在地址栏看不到)
  • 安全性。get请求是不安全的,而post请求是"安全"的
  • 编码方式不一样。get请求的编码是通过URLEncoder.encode()(地址栏编码); 而post请求的编码是将参数转成二进制流的形式发送
  • 数据长度限制。get请求参数长度是有上限的(几Kb级别),而post请求理论参数长度无上限

 33.服务端接受请求的几种方式

注解HTTP 方法支持简写等价形式典型用途
@RequestMapping所有方法(需显式指定 method 参数)灵活定义多种请求(兼容旧代码)
@GetMapping仅 GET@RequestMapping(method = RequestMethod.GET)查询数据、页面跳转
@PostMapping仅 POST@RequestMapping(method = RequestMethod.POST)提交表单、创建资源
@PutMapping仅 PUT@RequestMapping(method = RequestMethod.PUT)全量更新资源(如修改用户信息)
@DeleteMapping仅 DELETE@RequestMapping(method = RequestMethod.DELETE)删除资源
@PatchMapping仅 PATCH@RequestMapping(method = RequestMethod.PATCH)部分更新资源(如修改状态字段)

34.服务端响应数据给前端的几种方式

方式是否自动转 JSON是否需要视图解析适用场景
HttpServletResponse否(需手动处理)文件下载、自定义响应、低级控制
@ResponseBody混合使用(部分方法返回 JSON)
@RestController纯 API 接口(全部方法返回 JSON)

 35.DI依赖注入有哪些方式

配置文件模式

注解模式

36.DI依赖注入常用的注解有哪些?

注解作用适用场景
@Autowired按类型(byType)自动注入 Bean,可配合 @Qualifier 按名称注入Spring 项目中的自动依赖注入
@Qualifier指定 Bean 名称,解决多个同类型 Bean 冲突配合 @Autowired 使用(如:@Autowired @Qualifier("beanName")
@Resource按名称(byName)注入 Bean(Java 标准注解,优先名称匹配,再按类型匹配)替代 @Autowired + @Qualifier(如:@Resource(name = "beanName")
@Value注入简单类型(String、int 等)或配置文件属性(支持 SpEL 表达式)读取 application.properties、动态配置(如:@Value("${app.name}")

 37.@Autowired 和 @Resource的区别?

特性@Autowired (Spring 原生)@Resource (Java 标准)
来源Spring 框架注解Java 标准注解 (javax.annotation)
默认注入方式按类型(byType)按名称(byName)→ 失败时按类型
名称指定需配合 @Qualifier("name")直接通过 name 属性(如 @Resource(name="beanName"))
是否支持 required支持(@Autowired(required=false)不支持
适用场景纯 Spring 项目需要兼容非 Spring 环境(如 JNDI)

38.IOC创建对象相关的注解有哪些?

39.IOC容器创建有哪些方式

  • xml配置文件配置方式【使用读取xml中的bean来创建对象】
  • 纯注解方式

BeanFactory接口:这是 IOC 容器的基本实现,是 Spring 内部使用的接口。面向 Spring 本身,不提供给开发人员使用。
ApplicationContext接口:BeanFactory 的子接口,提供了更多高级特性。面向 Spring 的使用者,几乎所有场合都使用 ApplicationContext 而不是底层的 BeanFactory。
ClassPathXmlApplicationContext:通过读取类路径下的 XML 格式的配置文件创建 IOC 容器对象。
AnnotationConfigApplicationContext:通注解方式创建 IOC 容器对象。

 40.bean的作用域范围

作用域说明
singleton默认作用域,每个 IoC 容器中仅存在一个共享实例
prototype每次请求(getBean() 或注入)都创建新实例
request每个 HTTP 请求创建一个实例(Web 环境)
session每个 HTTP 会话共享一个实例(Web 环境)

 41.从容器中获取对象的三种方式

// 方式一: 推荐  名称+类型
Goods goods = context.getBean("goods", Goods.class);
System.out.println(goods);
// 方式二: 名称  需要强制类型转换
Goods goods2 = (Goods)context.getBean("goods");
System.out.println(goods2);
// 方式三: 通过类型获取
Goods goods3 = context.getBean(Goods.class);
System.out.println(goods3);

42.相关的注解有哪些?各自作用?

一、核心配置注解

注解作用
@SpringBootApplication组合注解,包含 @Configuration + @EnableAutoConfiguration + @ComponentScan,标识主启动类
@Configuration声明当前类为配置类(替代 XML 配置)
@Bean在配置类中定义 Bean,方法返回对象由 Spring 管理
@ComponentScan自动扫描指定包下的组件(@Component@Service 等)
@PropertySource加载外部配置文件(如 @PropertySource("classpath:app.properties")
@ConfigurationProperties将配置文件属性绑定到 Java 类(前缀匹配)

二、Web MVC 注解

1. 路由映射
注解作用
@RestController组合注解,包含 @Controller + @ResponseBody,直接返回 JSON/XML 数据
@RequestMapping通用请求映射,可指定路径、方法(GET/POST 等)
@GetMapping限定 GET 请求的快捷注解
@PostMapping限定 POST 请求的快捷注解
@PathVariable从 URL 路径中获取参数(如 /user/{id}
@RequestParam从请求参数中获取值(如 ?name=Alice
@RequestBody将请求体 JSON/XML 解析为 Java 对象
@ResponseBody将方法返回值直接作为响应体(通常用于返回 JSON)
2. 请求与响应
注解作用
@RequestHeader获取请求头值
@CookieValue获取 Cookie 值
@ResponseStatus自定义响应状态码(如 @ResponseStatus(HttpStatus.NOT_FOUND)
@CrossOrigin允许跨域请求(可配置来源、方法等)

三、依赖注入注解

注解作用
@Autowired按类型自动注入 Bean(Spring 原生)
@Resource按名称注入 Bean(JSR-250 标准)
@Qualifier指定注入的 Bean 名称(解决多个同类型 Bean 冲突)
@Value注入简单值或配置文件属性(如 @Value("${app.name}")

四、数据校验与转换

注解作用
@Valid触发 JSR-303 校验(如验证 @NotNull@Size 等注解)
@ValidatedSpring 的校验注解,支持分组校验
@DateTimeFormat格式化日期参数(如 @DateTimeFormat(pattern="yyyy-MM-dd")
@JsonFormat指定 JSON 序列化的日期格式(Jackson 库支持)

五、异常处理注解

注解作用
@ControllerAdvice全局异常处理类,结合 @ExceptionHandler 使用
@ExceptionHandler处理特定异常(如 @ExceptionHandler(NullPointerException.class)

六、事务管理注解

注解作用
@Transactional声明事务(可配置隔离级别、传播行为等)
@EnableTransactionManagement启用注解式事务管理(通常放在配置类上)

七、AOP 相关注解

注解作用
@Aspect声明切面类
@Before/@After定义前置/后置通知
@Around环绕通知(可控制目标方法执行)
@Pointcut定义切点表达式

八、测试相关注解

注解作用
@SpringBootTest启动完整 Spring 上下文进行集成测试
@MockBean模拟 Bean(用于测试环境替换真实 Bean)
@Test标识测试方法(JUnit)

一、容器配置注解

注解作用示例
@Configuration标记类为配置类(替代 XML 配置文件)java @Configuration public class AppConfig { ... }
@ComponentScan指定 Spring 扫描的包路径(自动注册 @Component 等注解的类)java @ComponentScan("com.example")
@Import导入其他配置类(模块化配置)java @Import({DatabaseConfig.class, SecurityConfig.class})

二、对象创建与管理

1. 组件注册
注解作用示例
@Component通用组件注解(@Service/@Repository 的父注解)java @Component public class UserService { ... }
@Service标记业务逻辑层组件(语义化注解,本质同 @Componentjava @Service public class OrderService { ... }
@Repository标记数据访问层组件(自动转换数据库异常为 Spring 异常)java @Repository public class UserDao { ... }
@Controller标记 Web 控制层组件(配合 @RequestMapping 使用)java @Controller public class UserController { ... }
2. 特殊对象注册
注解作用示例
@Bean在配置类中定义方法,返回对象由 Spring 管理(适用于第三方库类)java @Bean public DataSource dataSource() { return new HikariDataSource(); }
@Lazy延迟初始化(首次使用时创建)java @Lazy @Service public class HeavyService { ... }
@Scope指定 Bean 作用域(如 singleton/prototypejava @Scope("prototype") @Component public class Task { ... }

三、生命周期回调

注解作用示例
@PostConstruct初始化方法(替代 XML 的 init-methodjava @PostConstruct public void init() { ... }
@PreDestroy销毁前方法(替代 XML 的 destroy-methodjava @PreDestroy public void cleanup() { ... }

四、Lombok 简化代码(非 Spring 注解)

注解作用示例
@Data自动生成 getter/setter/toString/equals/hashCodejava @Data public class User { private String name; }
@Getter仅生成 getter 方法java @Getter public class User { private String name; }
@Setter仅生成 setter 方法java @Setter public class User { private String name; }

五、JUnit 测试注解(非 Spring 注解)

注解作用示例
@Test标记测试方法java @Test public void testMethod() { ... }
@Before每个 @Test 方法前执行java @Before public void setup() { ... }
@After每个 @Test 方法后执行(无论是否抛出异常)java @After public void teardown() { ... }

43.@RequestBody和@ResponseBody区别

特性@RequestBody@ResponseBody
作用方向请求(客户端 → 服务端)响应(服务端 → 客户端)
处理的数据解析请求体(如 JSON/XML)为 Java 对象将返回值序列化为响应体(如 JSON/XML)
常用位置方法参数前方法或类上(类上时所有方法生效)
默认支持的格式JSON、XML(需配置 HttpMessageConverter)JSON、XML(需配置 HttpMessageConverter)
组合注解@RestController 已包含 @ResponseBody

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词