实例化
Spring中的bean
的实例化主要有三种方式
- 无参构造方法,这种方式最常用
- 使用静态工厂
- 使用实例工厂
注入方式
属性的注入有两种方式:byType
和byName
。
byType
:如果容器中存在一个与指定属性类型相同的bean,那么将该属性自动装配。
比如在Controller
注入Service
private IUserService userService
byType
方式会自动注入IUserService
的实现类UserServiceImpl
,如果实现类有多个,默认会抛出异常。下文讲述如何解决。
byName
:通过属性名称自动装配。
比如在Controller
注入Service
private IUserService userService
通过byName
的方式需要指定实现类UserServiceImpl
的Name
@Service(“userService”)
public class UserServiceImpl implements IUserService {…}
事务隔离级别
Spring提供了五种隔离级别:
DEFAULT
(默认):意思就是数据库用啥我用啥SERIALIZABLE
(串行化):事务之间以一种串行的方式执行REPEATABLE READ
(可重复读):是MySQL默认的隔离级别,同一个事务中相同的查询会看到同样的数据行READ COMMITED
(读已提交):一个事务可以读到另一个事务已经提交的数据READ UNCOMMITED
(读未提交):一个事务可以读到另一个事务未提交的数据
除了第一个是Spring新增的,其余的四个都是和数据库的事务隔离级别一一对应
事务传播机制
事务传播机制是指在一个可能含有事务的方法中,调用了另一个可能含有事务的方法,这两个事务应该如何去取舍。最常见的场景就是在Service层。比如OrderService#createOrder()
方法里调用了StockService#decreaseStock()
,而这两个方法明显都是有事务的。这时,两个事务如何相互影响就是事务传播机制。
Spring提供了七种事务传播机制:
REQUIRED
:Spring默认值,如果存在事务,则加入当前事务;如果没有事务,则开启一个新的事务。REQUIRES_NEW
:如果当前存在事务,把当前事务挂起,新建事务。SUPPORTS
:支持当前事务,如果当前没有事务,就以非事务方式执行。NOT_SUPPORTED
:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。MANDATORY
:如果当前存在事务,则加入当前事务;如果没有事务,就抛出异常。NEVER
:以非事务方式执行,如果当前存在事务,则抛出异常。NESTED
:支持当前事务,新增Savepoint,与当前事务同步提交或回滚。外层事务失败时,会回滚内层事务所做的动作。而内层事务操作失败并不会引起外层事务的回滚。
生命周期
Spring管理了对象的生命周期,所以有必要了解Spring到底是怎么管理bean的生命周期的。如果我们想要在bean生命周期的某个时刻执行特定的功能应该怎么办?
Spring bean的生命周期颇为复杂,以下是整个过程,参考org.springframework.beans.factory.BeanFactory
常用注解
标识类
@Component
:标识此类由Spring IOC容器管理@Controller
:标识此类是接收和转发请求用的Controller
类,是@Component
的细化注解@Service
:标识此类是处理业务逻辑的Service
类,是@Component
的细化注解@Repository
:标识此类是处理持久化操作相关的类,通常是XxxDao
,是@Component
的细化注解
注入类
@Autowired
:属于Spring,是根据类型(byType
)的方式自动注入属性,默认是必须的。如果要设置成可选,需要把required
设置成false
@Autowired(required = false)
private IUserService userService;
如果IUserService
的实现类不止一个,默认会报错。需要配合注解@Qualifier
指定具体的实现类
public interface IUserService {
}
@Component(“helloUserService”)
public class HelloUserServiceImpl implements IUserService {
}
@Component(“worldUserService”)
public class WorldUserServiceImpl implements IUserService {
}
正确注入方式
@Autowired
@Qualifier(“helloUserService”)
private IUserService userService;
@Qualifier
:见@Autowired
@Resource
属于JDK,默认是按照名称(byName
)进行装配的。- 如果没有指定
name
属性,默认取字段的名称作为bean名称寻找依赖对象。 - 如果没有指定
name
属性,且byName
的方式无法装配,则会按照byType
的方式进行装配。 - 如果仅指定的
type
属性,也会通过byType
的方式进行装配,找不到或者找到多个都会抛异常。 - 只要指定了
name
属性,就不会再按照byType
的方式进行装配。 @Value
:用于注入一些配置文件中的常量,如jdbc相关的配置等
web相关
@RequestMapping
:这个注解会将HTTP请求映射到Controller
的处理方法上。
// 简单用法
@RequestMapping(“/index”)
// 映射多个url
@RequestMapping({“/index”, “/home”})
// 限制请求方式为Post,等同于注解 @PostMapping(“/index”)
@RequestMapping(value = “/index”, method = RequestMethod.POST)
@RequestBody
:将HTTP请求正文插入方法中,用来处理请求的Content-Type
不是application/x-www-form-urlencoded
(表单)编码的内容,例如:application/json
、application/xml
等。也就是说当客户端向后台提交数据不是以表单,而是以JSON数据的方式时,可以使用@RequestBody
注解将数据映射到后台参数列表
// 前端
$.ajax({
type: ‘POST’,
dataType: “json”,
contentType: “application/json; charset=utf-8”,
data: JSON.stringify(paramJson),
url: “”,
success: function (data) {
}
});
// 后台
@RequestMapping(“/xxx”)
public Sring xxx(@RequestBody UserDTO userDTO) {
return “success”;
}
@RequestParam
:用来辅助绑定特殊要求的参数
// 表示该接口必须传递参数id
@RequestMapping(“/xxx”)
public String xxx(@RequestParam(“id”) String id) {
return “”;
}
// 参数id可以不传
@RequestMapping(“/xxx”)
public String xxx(@RequestParam(name = “id”, required = false) String id) {
return “success”;
}
@PathVariable
:表示将url中的参数变量绑定到参数列表
// 将参数列表中的值自动填充到url中的变量中
@RequestMapping(“/order/{orderId}”)
public String xxx(@PathVariable String orderId) {
return “success”;
}
// 如果参数列表中的参数名和url中的不一致,则需要指定@PathVariable的name属性
@RequestMapping(“/order/{orderId}”)
public String xxx(@PathVariable(name = “orderId”) String id) {
return “success”;
}
最后
关于面试刷题也是有方法可言的,建议最好是按照专题来进行,然后由基础到高级,由浅入深来,效果会更好。当然,这些内容我也全部整理在一份pdf文档内,分成了以下几大专题:
- Java基础部分
- 算法与编程
- 数据库部分
- 流行的框架与新技术(Spring+SpringCloud+SpringCloudAlibaba)
这份面试文档当然不止这些内容,实际上像JVM、设计模式、ZK、MQ、数据结构等其他部分的面试内容均有涉及,因为文章篇幅,就不全部在这里阐述了。
作为一名程序员,阶段性的学习是必不可少的,而且需要保持一定的持续性,这次在这个阶段内,我对一些重点的知识点进行了系统的复习,一方面巩固了自己的基础,另一方面也提升了自己的知识广度和深度。
加入社区:https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0
计模式、ZK、MQ、数据结构等其他部分的面试内容均有涉及,因为文章篇幅,就不全部在这里阐述了。
作为一名程序员,阶段性的学习是必不可少的,而且需要保持一定的持续性,这次在这个阶段内,我对一些重点的知识点进行了系统的复习,一方面巩固了自己的基础,另一方面也提升了自己的知识广度和深度。
加入社区:https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0