简言:
第九章 Spring IoC 的概念
IoC(Inversion of Control)控制反转: 比如想喝橙汁, 在没有饮品店的日子, 最直观的做法是买果汁机, 橙汁. 这是你自己 "主动" 创造的过程, 也就是一杯橙汁需要主动创造. 然而到了今时今日, 由于饮品店的盛行, 已经没必要自己去榨橙汁了. 饮品店提供给你橙汁, 这一过程你没有去 "主动" 创造, 但是也完全达到了你的要求. 这就是控制反转.
在 Spring 中, 它会认为一切 Java 类都是资源, 而资源都是 Bean, 容纳这些 Bean 的是 Spring 所提供的 IoC 容器, 所以 Spring 是一种基于 Bean 的编程.
Spring IoC 容器
在 Spring 中实现控制反转的是 IoC 容器, 其实现方式是依赖注入(Dependency Injection,DI), 简单的说, IoC 容器是用来存放一些实例的, 通过依赖注入, 将实例注入 IoC 容器, 此时你不需要去主动创建实例, 只需要从 IoC 容器中取就好了.
Spring IoC 容器的设计主要基于 BeanFactory 和 ApplicationContext 两个接口. ApplicationContext 是 BeanFactory 的子接口之一, 换句话说 BeanFactory 是 Spring IoC 容器说定义的最底层接口, 而 ApplicationContext 是其高级接口之一.
Spring IoC 容器的初始化和依赖注入
过程: 先定义 Bean, 然后初始化 Bean, 然后依赖注入 Spring IoC 容器.
Bean 的定义:
Resource 定位, 这步是 Spring IoC 根据开发者的配置, 进行资源定位. 在 Spring 的开发过程中, 开发者通过 xml 或注解进行配置.
BeanDefinition 的载入, 这个时候只是将 Resource 定位到的信息, 保存到 Bean 定义 (BeanDefinition) 中, 此时部位创建 Bean 的实例.
BeanDefinition 的注册, 这个过程就是将 BeanDefinition 的信息发布到 Spring IoC 容器中. 注意, 此时仍旧没有对应的 Bean 的实例创建.
Bean 的初始化:
Spring Bean 还有一个配置选项 --lazy-init, 其含义及时是否初始化 Spring Bean(意思是时候采用懒汉模式). 默认值为 false, 默认会自动初始化 Bean. 如果将其设置为 true, 那么只有当我们使用 Spring IoC 容器的 getBean 方法获取它时, 它才会进行 Bean 的初始化, 完成依赖注入.
Spring Bean 的生命周期
一下是 Spring Bean 的生命周期过程:
第十一章 面向切面编程(AOP)
如果说 IoC 是 Spring 的核心, 那么面向切面编程就是 Spring 最为重要的功能之一了, 在数据库事务中, 切面编程被广泛使用.
AOP: 通过动态代理模式, 带来管控各个对象操作的切面环境, 管理包括日志, 数据库事务等操作, 让我们拥有可以在反射原有对象方法之前正常返回, 异常返回时候插入自己的路基代码的能力, 有时候甚至取代原有方法.
相关概念:
1. 切面(Aspect)
切面就是在一个怎么杨的环境中工作. 在动态代理中可以把它理解成一个拦截器.
2. 通知(Advice)
通知是切面开启后, 切面的方法, 它根据在代理对象真实方法调用前, 后的顺序和逻辑区分.
前置通知(Before): 在动态代理反射原有对象或者执行环绕通知前执行的通知功能.
后置通知(After): 在动态代理反射原有对象方法或者执行环绕通知后执行的通知功能. 无论是否抛出一行, 它都会被执行
返回通知 (AfterReturning): 在动态代理对象反射原有对象方法或者执行环绕通知后, 正常返回(无异常) 执行的通知功能.
异常通知(AfterThrowing): 在动态代理对象反射原有对象方法或者执行环绕通知后, 产生异常执行的通知功能.
环绕通知(Around): 在动态代理中, 它可以取代当前被拦截对象的方法, 提供回调原有被拦截对象的方法.
3. 引入(Introduction)
允许我们在现有的类里添加自定义的类和方法.
4. 切点(Pointcut)
告诉 SpringAOP 在什么时候启动拦截并织入对应的流程中, 因为并不是所有的开发都需要启动 AOP 的, 它往往通过正则表达式进行限定.
5. 连接点(join point)
连接点对应的是具体需要拦截的东西, 比如通过切点的正则表达式去判断哪些方法是连接点, 从而织入对应的通知.
6. 织入(Weaving)
织入是一个生成代理对象并将切面内容放入到流程中的流程.
来源: https://www.cnblogs.com/shiboinfo/p/10298423.html