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即可。"
关键点:
- 依赖:mybatis starter + 数据库驱动
- 配置:数据源 + mapper路径
- 结构:实体类 -> Mapper接口 -> XML映射文件
- 使用: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 等注解) |
@Validated | Spring 的校验注解,支持分组校验 |
@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 | 标记业务逻辑层组件(语义化注解,本质同 @Component ) | java @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 /prototype ) | java @Scope("prototype") @Component public class Task { ... } |
三、生命周期回调
注解 | 作用 | 示例 |
---|---|---|
@PostConstruct | 初始化方法(替代 XML 的 init-method ) | java @PostConstruct public void init() { ... } |
@PreDestroy | 销毁前方法(替代 XML 的 destroy-method ) | java @PreDestroy public void cleanup() { ... } |
四、Lombok 简化代码(非 Spring 注解)
注解 | 作用 | 示例 |
---|---|---|
@Data | 自动生成 getter /setter /toString /equals /hashCode | java @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 |