Spring框架
关于Spring框架
Spring框架主要解决了创建对象、管理对象的问题。
通过Spring创建对象
需要Spring创建对象,有2种做法:
@Bean
方法- 组件扫描
关于@Bean
方法
- 在配置类中,自定义某个方法,其返回值类型就是你需要Spring创建对象的类型,在方法体中自行编写创建对象的代码,并且,在此方法上添加
@Bean
注解即可
关于组件扫描
-
通过
@ComponentScan
注解,可以开启组件扫描,并配置扫描的包- 在Spring Boot项目中,启动类上的
@SpringBootApplication
已经使用@ComponentScan
作为元注解 - 在Spring Boot项目中,默认的组件扫描的包就是启动类所在的包
- 任何组件扫描,都会扫描指定的包及其子孙包
- 在Spring Boot项目中,启动类上的
-
在组件类上,需要添加组件注解:基础的组件注解有:
@Component
:通用组件注解@Controller
:建议添加在控制器类上@Service
:建议添加在处理业务逻辑的类上@Repository
:建议添加在数据访问层的类上- 在使用IntelliJ IDEA时,在Mybatis的Mapper接口上添加此注解,只是为了避免IntelliJ IDEA误判而已,并没有实质的作用
- 以上4种注解,在Spring的解释范围内,是完全等效的,只是语义不同
另外,如果某个组件扫描范围内的类添加了@Configuration
,也会被创建对象,添加此注解的类被视为“配置类”,与一般的组件不同,Spring框架会通过CGLib代理模式进行处理。
Spring管理的对象
Spring管理的对象,默认是单例的!并且,默认情况下,单例的对象都是默认加载的。
单例:单一实例,在某个时间点,此类的对象最多只有1个。
默认加载:加载Spring时,就会创建此类的对象,类似于单例模式中的饿汉式单例模式。
注意:Spring并没有使用单例模式,只是Spring管理的对象的表现与单例模式的特点是相同的。
使用@Scope
注解,注解参数值配置为prototype
(原型),可以使得Spring管理的对象不是单例的:
- 使用组件扫描创建对象时,在组件类上添加
@Scope("prototype")
- 使用
@Bean
方法创建对象时,在@Bean
方法上添加@Scope("prototype")
使用@Lazy
注解,可以使得Spring管理的单例对象是懒加载的(第1次获取此对象时才创建对象):
- 使用组件扫描创建对象时,在组件类上添加
@Lazy
- 使用
@Bean
方法创建对象时,在@Bean
方法上添加@Lazy
Spring管理的对象的生命周期
被Spring管理的对象的类型,可以自定义2个生命周期方法,这2个方法会分别在“创建后”和“销毁前”被自动调用!
在自定义类中,可以自定义方法:
- 访问权限:应该使用
public
- 返回值类型:
void
- 方法名称:自定义
- 参数列表:仅可添加少量特定的类型
另外,在“创建后”的方法上,需要添加@PostConstruct
注解,在“销毁前”的方法上,需要添加@PreDestroy
注解,例如:
@PostConstruct
public void init() {
}
@PreDestroy
public void destroy() {
}
自动装配
Spring容器:Spring的本质是一个容器,它会将它创建的所有对象都管理在此容器中。
Spring Bean:每个被Spring创建的对象都是一个Spring Bean。
自动装配:当某个添加了自动装配注解的属性,或某个被Spring自动调用的方法的参数需要值时,Spring会自动尝试从容器中查找适合的Spring Bean,用于为此赋值。
通常,其表现就是在类的属性上添加@Autowired
注解,则Spring会尝试自动为此属性赋值。
关于@Autowired
的装配机制:
- 首先,在Spring容器中查找匹配类型的Spring Bean的数量
- 0个:取决于
@Autowired
注解的required
属性required = true
:加载Spring时出现NoSuchBeanDefinitionException
required = false
:放弃自动装配,则属性值为null
- 1个:直接装配,且成功
- 多个:将尝试根据名称来自动装配,要求被自动装配的属性名与Spring Bean的名称是匹配的,如果存在匹配的,则成功装配,否则,加载Spring时出现
NoUniqueBeanDefinitionException
- 关于名称匹配,可以是属性名改为某个Spring Bean名称,或在属性上添加
@Qualifier
注解来指定某个Spring Bean的名称
- 关于名称匹配,可以是属性名改为某个Spring Bean名称,或在属性上添加
- 0个:取决于
另外,在不使用@Autowired
(含匹配的@Qualifier
)的情况下,也可以在属性上添加@Resource
注解来实现自动装配!
关于@Resource
注解的装配机制:
- 先尝试根据名称查找匹配的Spring Bean,且类型也匹配,则自动装配,如果没有匹配名称的Spring Bean,将尝试按照类型来装配,简单来说,是先根据名称,再根据类型的装配机制。
关于DI与IoC
IoC:Inversion Of Control,控制反转,表示将对象的控制权(创建、管理)交给框架
DI:Dependency Injection,依赖注入,表现为给对象的依赖属性赋值
小结
关于Spring框架,你应该:
- 理解Spring框架的作用
- 掌握使得Spring框架创建对象的2种方式
@Bean
方法- 组件扫描
- 理解Spring框架管理的对象的作用域
- 默认具有单例的特点
- 在单例的状态下,默认是预加载的
- 了解Spring框架管理的对象的生命周期方法
- 理解Spring框架的自动装配的特点,理解
@Autowired
的装配机制
另外,尚未涉及的部分:
- 读取
.properties
配置文件,管理项目中的环境变量Environment
- Spring AOP
Spring MVC框架
关于Spring MVC框架
Spring MVC是建立在Spring框架基础之上的。
Spring MVC主要解决了接收请求、响应结果的问题。
关于接收请求
需要自定义类,在类上添加@Controller
/ @RestController
注解,则此类就是控制器类。
通常,建议在类上也添加@RequestMapping
配置请求路径中的前缀部分。
在类中自定义处理请求的方法:
- 注解:添加
@RequestMapping
系列注解来配置请求路径和某些参数 - 访问权限:应该使用
public
- 返回值类型:在前后端分离的开发模式下,应该使用自定义的数据类型,例如
JsonResult
- 方法名称:自定义
- 参数列表:当请求参数数量只有1个时,或少量参数且没有相关性,直接写,当请求参数数量超过1个且具有相关性时,应该封装为自定义的数据类型,并使用自定义的数据类型作为参数
关于接收的请求参数
如果要求客户端提交的请求参数是JSON格式的,则处理请求的方法的参数列表中,封装的数据类型必须添加@RequestBody
注解,如果要求提交的请求参数是FormData格式的,则不可以添加@RequestBody
注解。
如果某个请求参数是URL的一部分,在使用@RequestMapping
系列注解配置请求路径时,需要使用{}
格式的占位符,例如/albums/{id}/delete
,并且,在处理请求的方法的相关参数上,添加@PathVariable
注解。
另外,还可以在请求参数上添加@RequestParam
,此注解可以指定请求参数名称、限制必须提交、配置默认值,但此注解并不是必须的。
关于RESTful
RESTful是一种服务器端软件的设计风格。
RESTful的典型表现是:在URL中会存在某些具有唯一性的参数值,例如id、用户名等。
RESTful还建议根据对数据操作的方式不同,使用不同的请求方式,例如删除数据时应该使用DELETE
这种请求方式,但,通常仍只使用GET
和POST
。
RESTful只是一种风格,并不是设计规范。
处理响应
在前后端分离的开发模式下,响应方式都是“响应正文”的,可以:
- 在方法上添加
@ResponseBody
- 在类上添加
@ResponseBody
- 在类上添加
@RestController
以上3种方式均可。
通常,为了保证服务器端响应结果的格式是统一的,会自定义数据类型,封装需要响应的数据,至少包括:
- 业务状态码
- 错误时的提示文本
- 成功时的数据
当处理请求的方法的返回值类型是以上封装的类型(即项目中的JsonResult
)时,且当项目中已经添加了jackson-databind
依赖时,此依赖项中的Converter会自动将方法返回的对象转换为JSON格式并响应到客户端去。
统一处理异常
自定义统一处理异常的类,在类上添加@ControllerAdvice
/ @RestControllerAdvice
注解。
在类中自定义处理异常的方法:
- 注解:
@ExceptionHandler
- 访问权限:应该使用
public
- 返回值类型:参考处理请求的方法
- 方法名称:自定义
- 参数列表:至少有1个被处理的异常类型参数,可按需添加特定类型的参数,例如
HttpServletRequest
、HttpServletResponse
等,但不可以像处理请求的方法那么自由
在同一个项目中,可以有多个统一处理异常的类,每个类中都可以有多个处理异常的方法,只要这些方法处理的异常不完全相同(各方法处理的异常允许存在继承关系)即可。
Spring MVC的核心处理流程
Spring MVC的核心组件:
DispathcerServlet
:用于统一接收请求,并分发HandlerMapping
:记录了请求路径与处理请求的控制器组件的对应关系Controller
:实际请求的组件ModelAndView
:封装了数据与视图名称的结果ViewResolver
:根据视图名称确定实际应用的视图组件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CED30aa0-1661861928866)(images/springmvc.png)]
小结
关于Spring MVC框架,你应该:
- 理解Spring MVC框架的作用
- 掌握使用控制器接收请求,并响应结果
- 理解
JsonResult
这种封装响应数据的类型的作用、设计思路 - 掌握处理异常
- 理解RESTful
另外,暂未涉及的:
- Spring MVC拦截器
Mybatis框架
关于Mybatis框架
Mybatis框架主要实现了简化数据库编程。
依赖项
通常,使用Mybatis框架时,需要添加依赖:
mybatis
:Mybatis框架mybatis-spring
:Mybatis整合Springmysql-connector-java
:数据库依赖项spring-jdbc
:Spring整合JDBC
除此以外,通常还会添加:
spring-test
:执行测试commons-dbcp
/druid
等:数据库连接池
在Spring Boot项目中,只需要添加mybatis-spring-boot-starter
和mysql-connector-java
即可,测试时,另外添加spring-boot-starter-test
。
基本配置
在Spring Boot项目中,在application.properties
中配置:
spring.datasource.url
spring.datasource.username
spring.datasource.password
然后,需要在配置类上使用@MapperScan
指定Mapper接口所在的包,在启动项目时,Mybatis会扫描此包,并找到相关的接口,自动生成这些接口的代理对象。
另外,还需要在application.properties
中配置mybatis.mapper-locations
属性,用于指定XML文件的位置。
使用Mybatis实现数据库编程
使用Mybatis实现数据库编程主要:
- 设计Mapper接口中的抽象方法
- 配置抽象方法映射的SQL语句
关于抽象方法:
- 返回值类型:增删改使用
int
,查询只需要保证返回值类型足够装得下查询结果即可 - 方法名称:自定义,建议参考阿里的规范
- 参数列表:取决于需要执行的SQL语句中的参数,如果SQL语句中只有1个参数,直接声明为方法的参数即可,如果有多个参数,且这些参数具有相关性,则应该封装,并使用封装的类型作为方法的参数,如果多个参数没有相关性,则一一声明为方法的参数,并且,为每个参数添加
@Param
注解- 在某些集成环境中,多个参数也可以不添加
@Param
- 在某些集成环境中,多个参数也可以不添加
关于配置SQL语句:
-
可以使用
@Insert
等节点配置SQL语句,但是不推荐,推荐使用XML文件来配置SQL语句 -
必须在
<mapper>
上配置namespace
属性,用于指定对应的接口 -
使用
<insert>
等节点配置SQL语句,每个节点必须配置id
属性,用于指定对应的抽象方法 -
在配置
<insert>
时,如果表的id是自动编号的,则应该配置useGeneratedKeys
和keyProperty
属性,以获取自动编号的id -
在配置
<select>
时,必须配置resultMap
或resultType
这2个属性中的某1个 -
可以使用
<sql>
节点封装SQL语句片段,并使用<include>
节点进行引用,通常,使用<sql>
封装字段列表 -
使用
<resultMap>
节点用于指导Mybatis封装查询结果 -
使用动态SQL的
<foreach>
可以实现对数组或List
集合类型的参数的遍历 -
使用动态SQL的
<if>
可以实现根据参数决定SQL语句中是否包含某个片段,用于处理更新数据的操作时,通常结合<set>
节点一起使用-
注意:
<if>
并没有匹配的类似else
的节点,如果要实现if...else
效果,可以使用2个条件完全相反的<if>
,但是,这种做法效率偏低,另外,可以使用<choose>
系列节点来实现:<choose> <when test="条件"> 满足条件时的SQL语句片段 </when> <otherwise> 不满足条件时的SQL语句片段 </otherwise> </choose>
-
小结
需要掌握以上所有内容
Spring Boot框架
关于Spring Boot框架
Spring Boot是一个基于Spring框架在的Maven项目,每个自行创建的Spring Boot项目都使用了官方的Spring Boot项目作为父级项目!
Spring Boot是一个基于“约定大于配置”思想的、自动完成了许多配置的框架。
Spring Boot框架的基础依赖项是spring-boot-starter
,而其它以spring-boot-starter
为Artifact前缀的依赖项都包含了它。
关于基础依赖项
在spring-boot-starter
中,包含的典型依赖项有:
- Spring框架的基础依赖项:
spring-context
- 日志
所以,任何一个Spring Boot项目,都可以使用Spring框架的特性,并且可以使用日志。
并且,在Spring Boot项目中,默认在src/main/resource
下就有application.properties
文件,是项目中默认自动读取的配置文件。
关于Profile配置
关于application.properties
配置,在不同的环境下,某些配置的值应该是不同的,例如连接数据库的URL、用户名、密码等,所以,应该针对不同的环境,使用不同的配置,即Profile配置。
通常,关于Profile配置,至少分为3类:
- 开发环境下的配置
- 测试环境下的配置
- 生产环境下的配置
甚至,同样是开发环境下,可能因为团队协作开发,各开发人员也使用了不同的配置。
使用Profile配置的方式是:
- 自行创建
application-xxx.properties
文件,文件名中的xxx
是自定义的名称,通常是dev
、test
、prod
等,把各个环境下不同的配置编写在此文件中 - 在
application.properties
中使用spring.profiles.active
属性激活某个Profile配置,此属性的值就是application-xxx.properties
文件中的xxx
部分
当使用Profile配置后,这些配置文件默认并不会直接读取并应用,需要被激活才会被读取并应用!
在application.properties
中的配置是始终被读取并应用的!
关于YAML配置
YAML配置是以.yml
作为扩展名的配置文件。
Spring框架本身并不支持读取这类文件,需要额外添加依赖项,在Spring Boot项目中,默认已经集成必要的依赖项,可以直接读取这类文件。
在Spring Boot项目中,可以将.properties
的配置完全转移到.yml
文件中,并且,同样支持Profile配置,即可以同时存在application.yml
、application-dev.yml
等。
关于YAML配置,其语法特征是:
- 原有的例如
spring.datasource.url
这类属性,将根据小数点拆分为2行,每一行使用冒号表示结束,从下一行开始,缩进2个空格(不可以是TAB,但是,IntelliJ IDEA在编辑YAML时,按下的TAB会自动转换成2个空格),当属性名写完后,在冒号右侧添加1个空格,再填写属性值
例如:
spring:
datasource:
url: jdbc:mysql://localhost:3306/mall_pms
username: root
password: root
注解大全
注解 | 所属框架 | 作用 |
---|---|---|
@ComponentScan | Spring | 添加在配置类上的,配置组件扫描,如果配置此注解的value属性,可指定组件扫描的根包(basePackages) |
@Component | Spring | 添加在类上,表示当前类是一个组件,但并不能直接确定是哪一种组件 |
@Controller | Spring | 添加在类上,表示当前类是一个组件,建议添加在控制器类上 |
@Service | Spring | 添加在类上,表示当前类是一个组件,建议添加在处理业务逻辑的类上 |
@Repository | Spring | 添加在类上,表示当前类是一个组件,建议添加在数据访问层的类上 |
@Configuration | Spring | 添加在类上,表示当前类是一个配置类 |
@Scope | Spring | 添加在组件类上,或添加在@Bean 方法上,通过配置参数prototype 将Spring管理此对象调整为“非单例” |
@Lazy | Spring | 添加在组件类上,或添加在@Bean 方法上,将Spring管理此对象调用为“懒加载” |
@PostConstruct | Spring | 这是javax.annotation 包中的注解,添加在生命周期方法上,表示此方法是“创建后”的方法(初始化方法) |
@PreDestroy | Spring | 这是javax.annotation 包中的注解,添加在生命周期方法上,表示此方法是“销毁前”的方法(销毁方法) |
@Autowired | Spring | 添加在属性上、方法上、构造方法上,表示Spring框架将为此属性自动装配,或自动调用对应的方法 |
@Qualifier | Spring | 添加在属性上、方法的参数上,与@Autowired 匹配使用,当尝试自动装配的数据有多个匹配类型的Spring Bean,但名称并不匹配,可以使用此注解指定使用特定名称的Spring Bean |
@Resource | Spring | 这是javax.annotation 包中的注解,添加在属性上,表示Spring框架将为此属性自动装配,当尝试自动装配的数据有多个匹配类型的Spring Bean,可以配置此注解的name 属性,用于指定使用特定名称的Spring Bean |
@ResponseBody | Spring MVC | 添加在方法上、控制器类上,表示此方法或此控制器中所有方法在响应时,都是响应正文的 |
@RestController | Spring MVC | 添加在控制器类上,表示此类是一个控制器类,并且,此类中所有方法在响应时,都是响应正文的,它的元注解中包含@ResponseBody 和@Controller |
@RequestMapping | Spring MVC | 添加在方法上、控制器类上,主要用于配置请求路径,及某些参数 |
@GetMapping | Spring MVC | 添加在方法上,只接收GET 方式的请求,主要用于配置请求路径,其它参数的配置与@RequestMapping 相同 |
@PostMapping | Spring MVC | 添加在方法上,只接收POST 方式的请求,主要用于配置请求路径,其它参数的配置与@RequestMapping 相同 |
@PutMapping | Spring MVC | 添加在方法上,只接收PUT 方式的请求,主要用于配置请求路径,其它参数的配置与@RequestMapping 相同 |
@DeleteMapping | Spring MVC | 添加在方法上,只接收DELETE 方式的请求,主要用于配置请求路径,其它参数的配置与@RequestMapping 相同 |
@RequestBody | Spring MVC | 添加在处理请求的方法的参数上,用于要求客户端使用JSON格式来提交请求参数 |
@PathVariable | Spring MVC | 添加在处理请求的方法的参数上,用于接收URL中使用{} 格式 占位符对应的参数,如果{} 占位符名称与方法的参数名称不同,还可以在此注解中配置{} 占位符名称,用于解决名称不一致的问题 |
@RequestParam | Spring MVC | 添加在处理请求的方法的非封装类型的参数上,用于指定请求参数名称、限制必须提交、配置默认值 |
@ControllerAdvice | Spring MVC | 添加在类上,此类中的特定方法会在每次处理请求时被调用 |
@RestControllerAdvice | Spring MVC | 添加在类上,此类中的特定方法会在每次处理请求时被调用,并且,如果这些方法会进行响应,会是响应正文的,此注解使用了@ResponseBody 和@ControllerAdvice 作为元注解 |
@ExceptionHandler | Spring MVC | 添加在处理异常的方法上,表示此方法是处理异常的,如果此方法需要同时应用于多种不同的异常,可以在此注解上配置参数,使用异常类的数组,表示此方法需要处理的多种异常 |
@MapperScan | Mybatis | 添加在配置类上,用于指定Mapper接口所在的包,在启动项目时,Mybatis框架会生成这些接口的代理对象,注意:不要将包的值配置范围过大! |
@Param | Mybatis | 添加在Mapper接口的抽象方法的参数上,用于指定参数名称,在SQL语句中将可以通过#{} 占位符且大括号使用配置的参数名称,来表示SQL语句中的参数 |
@ApiOperation | Swagger | 添加在方法上,表示一个http 请求访问该方法的操作,参数: value=“方法的用途和作用” |
@ApiOperationSupport | Swagger | 添加在方法上,配置方法的排序位置,参数:order |
@ApiImplicitParam | Swagger | 添加在方法上,表示单独的请求参数,用于対API文档时対请求参数进行说明。 |
@ApiImplictParams | Swagger | 用在请求的方法上,包含多@ApliImplictParam,一般不会用到,当有多个参数时,常进行封装。 |
@ApiModelProperty | Swagger | 添加在实体类的属性上,対属性进行描述,参数:value,example,required。 |
@ApiIgnore | Swagger | 添加在类、方法上或方法参数前面,不显示在文档页面上 |
@Data | Lombok | 添加在POJO类上,要求此类的父类中存在无参数构造方法。帮助生成所有属性对应的Setters & Getters、规范的hashCode()和equals()、toString() |
@Getter | Lombok | Lombok也提供相应的@Setter,@ToString,@EqualsAndHashCode注解,用在无法使用@Data类上。 |
@Slf4j | Lombok | 添加在类上,用于添加日志 |
@EnableGlobalMethodSecurity | Security | 添加在Security配置类上,用于开启全局方法权限检查,参数:prePostEnabled |
@PreAuthorize | Security | 配置在业务方法上,用于対业务进行授权,只有拥有权限才能调用方法,参数:value = “hasAuthority(“xxx”)” |
@Transactional | Spring | 开启事务关联管理,建议添加在业务接口上 |
@Value | Spring | 将与配置文件中的键对应的值分配给其带注解的属性 |
@EnableScheduling | Spring | 添加在配置类上,开启计划调度功能 |
@Scheduled | Spring | 执行计划任务,添加在方法上,要使用@Scheduled注解,首先需要在启动类添加@EnableScheduling,启用Spring的计划任务执行功能,这样可以在容器中的任何Spring管理的bean上检测@Scheduled注解,执行计划任务 |
@JsonFormat | JJWT | 时间格式化注解,添加在时间属性上 |
面试题
Spring框架中,如何通过组件扫描来创建类的对象
在某个配置类上添加@ComponentScan
注解,必要的话,配置这个注解的value
/ basePackages
属性,可以指定组件扫描的根包。
将需要被Spring创建对象的类型,声明在这个根包之下,并且,在类上添加组件注解即可。
常用的基本组件注解有:@Component
、@Controller
、@Service
、@Repository
。
使用Spring框架时,如何选取@Bean方法和组件扫描,使得Spring创建对象
自定义的类应该使用组件扫描,其它类(不是自行创建的类型)必须使用@Bean
方法。
请描述@Autowired
的自动装配机制
首先,在Spring容器中查找匹配类型的Spring Bean的数量
- 0个:取决于
@Autowired
注解的required
属性required = true
:加载Spring时出现NoSuchBeanDefinitionException
required = false
:放弃自动装配,则属性值为null
- 1个:直接装配,且成功
- 多个:将尝试根据名称来自动装配,要求被自动装配的属性名与Spring Bean的名称是匹配的,如果存在匹配的,则成功装配,否则,加载Spring时出现
NoUniqueBeanDefinitionException
- 关于名称匹配,可以是属性名改为某个Spring Bean名称,或在属性上添加
@Qualifier
注解来指定某个Spring Bean的名称
- 关于名称匹配,可以是属性名改为某个Spring Bean名称,或在属性上添加
请描述@Autowired
与@Resource
的装配机制的区别
【先回答以上@Autowired
的装配机制】
@Resource
的装配机制是:先尝试根据名称查找匹配的Spring Bean,且类型也匹配,则自动装配,如果没有匹配名称的Spring Bean,将尝试按照类型来装配,简单来说,是先根据名称,再根据类型的装配机制。
请描述@Autowired
与@Resource
的区别
【先回答以上题目的答案】
@Resource
是javax.annotation
包中的注解,而@Autowired
是Spring框架定义的注解。
@Resource
注解可以添加在类上、属性上、方法上,但是,只有添加在属性上,才被解释为自动装配。
@Autowired
注解可以添加在属性上、Setter方法上、构造方法上,所以,当尝试自动装配时,可以:
public class BrandController {
@Autowired
private IBrandService brandService;
}
// 本示例代码的效果,使用@Resource无法实现
public class BrandController {
private IBrandService brandService;
@Autowired
public void setBrandService(IBrandService brandService) {
this.brandService = brandService;
}
}
// 本示例代码的效果,使用@Resource无法实现
public class BrandController {
private IBrandService brandService;
@Autowired
public BrandController(IBrandService brandService) {
this.brandService = brandService;
}
}
其实,关于Spring框架自动调用构造方法:
- 如果类中仅有无参构造方法,则直接调用(不需要使用
@Autowired
注解) - 如果类中仅有1个非无参构造方法,则直接调用(不需要使用
@Autowired
注解) - 如果类中有多个构造方法,则尝试调用无参数构造方法(不需要使用
@Autowired
注解) - 如果类中有多个构造方法,且都是有参数的,则尝试调用带
@Autowired
的那1个
由于@Autowired
可以添加在方法上,如果方法的参数需要被自动装配,但名称不匹配,还可以在方法的参数前添加@Qualifier
来指定Spring Bean的名称。
在Spring框架中,IoC与DI的区别
IoC:Inversion Of Control,控制反转,表示将对象的控制权(创建、管理)交给框架
DI:Dependency Injection,依赖注入,表现为给对象的依赖属性赋值
Spring框架通过DI实现了(完善了)IoC。
Spring MVC的核心处理流程
Spring MVC的核心组件:
DispathcerServlet
:用于统一接收请求,并分发HandlerMapping
:记录了请求路径与处理请求的控制器组件的对应关系Controller
:实际请求的组件ModelAndView
:封装了数据与视图名称的结果ViewResolver
:根据视图名称确定实际应用的视图组件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bqtLl4E5-1661861948721)(images/springmvc.png)]
使用Mybatis的查询时,如何选取resultType和resultMap
在配置<select>
节点时,必须配置resultType
或resultMap
,其中,resultType
是直接指定返回值的类型,此属性的取值为返回值类型的全限定名,而resultMap
的取值为自行配置的<resultMap>
节点的id
属性的值,而自定义的<resultMap>
是用于指导Mybatis如何封装查询结果的。
当抽象方法的返回值类型是基本数据类型(例如统计查询)或其它基本值类型(通常包括String
)时,只能使用resultType
。
当抽象方法的返回值类型是封装的类型时,强烈推荐使用resultMap
,因为<resultMap>
可能具有一定的复用性,并且,复杂的关联查询只能使用<resultMap>
的配置。