提示:以下是本篇文章正文内容,Java系列学习将会持续更新
一、Spring 启动过程
- 第一步,首先会执行一些容器刷新前的准备工作,如设置容器启动时间、一些状态标志位等
- 第二步,创建容器对象,其实就是实例化 DefaultListableBeanFactory对象,这一步包含了 bean定义信息的解析
- 第三步,准备Bean工厂,实际上就是设置 beanFactory 的一些属性
- 第四步,为上下文初始化 MessageSource,即 国际化处理;
- 第五步,注册 Listener 监听器
- 第六步,实例化所有非懒加载的单实例 Bean
- 第七步,Spring容器完成刷新,发布事件:ContextRefreshedEvent
二、AOP 机制
- 创建代理对象阶段:
①创建 Bean 实例从 getBean() 开始;Spring容器将根据AOP的配置去匹配目标类的类名,看目标类是否符合切面规则。
②调用 ProxyFactory 去创建 Bean,缓存到 IoC 容器中。
③根据对象选择不同的代理策略。如果目标类实现了接口,调用JDK的Proxy
;没有实现接口,则调用CGLib Proxy
- 拦截目标对象阶段:
当用户调用目标对象的某个方法时,将会被 AOP Proxy 的对象拦截。该对象默认实现了InvocationHandler
接口,invoke()
方法会按顺序执行 AOP 通知。 - 调用代理对象阶段:
通过反射依次执行 AOP 通知和目标方法。
三、Bean 生命周期
- 实例化 Bean(为 Bean 分配内存空间)
先通过 beanDefinition 拿到合适的构造方法- 默认情况下,取得是无参构造
- 如果有
@Autowired
修饰的构造方法,就取该构造方法
- 属性注入(Bean 注入和装配)
如果该 Bean 的创建依赖于其它 Bean 的存在,则会递归的去初始化其它 Bean - Bean 初始化
- 实现了各种
Aware
接口下的通知方法,如 BeanNameAware、BeanFactoryAware、 - ApplicationContextAware 的接口方法;
- 执行 BeanPostProcessor 初始化前置方法;
- 执行 @PostConstruct 初始化方法,依赖注入操作之后被执行;
- 执行自己指定的 init-method 方法(如果有指定的话);
- 执行 BeanPostProcessor 初始化后置方法。
- 实现了各种
- 使用 Bean
User user = context.getBean(User.class);
- 销毁 Bean
销毁容器的各种方法,如 @PreDestroy、DisposableBean 接口方法、destroy-method。
四、Spring 事务
事务隔离又分为 4 种不同的级别,包括: 读未提交、读已提交、可重复读、可串行化。
需要注意:事务能否生效,取决于数据库引擎是否支持事务,MySQL 的 InnoDB 引擎是支持事务的,但 MyISAM 就不支持。
Spring中使用事务,我们要做的是:
- 对要使用事务的类或者方法,添加注解
@Transactional
。支持事务元数据设置,比如传播特性,回滚设置等,通过AOP将设置生效。 - 增加配置:
@EnableTransactionManagement
,来开启 Spring 中注解驱动的事务管理能力。SpringBoot 中默认开启,不需要加该注解。 - 一般是在 Service 层添加事务,然后其他层或者其他 Service 类来调用该事务类。
默认的事务能力是:
- 传播机制是 REQUIRED,即当前无事务时新建一个事务,当前存在事务,则加入该事务中。
- 隔离级别是 DEFAULT,即使用数据库默认的隔离级别,那么数据库层默认的隔离级别是REPEATABLE_READ (可重复读)。
- transaction is read-write。服务于传播机制,相对应的 read-only 来表明只做只读操作。
- 默认超时时间,跟随底层事务服务提供方,如果不支持超时逻辑则没有。我们使用的默认超时时间是50s。
- 回滚机制适用于 RuntimeException。checked Exception不会触发。
参考文章:Spring的事务详解