IOC + DI
控制反转+依赖注入
在spring的理念中,IOC是Spring框架的核心,所有使用者应该必须掌握其原理。
对于IOC和DI这两个概念,本人有以下简单的理解,不吝赐教
前面我用了+ 连接了IOC和DI,顾名思义,在我的理解下,控制反转和依赖注入密不可分。
首先简单介绍IOC:
对于常规的java面向对象编程,我们要去主动的new一个对象的实例,然后去对这个实例进行所需业务的操作。
Eg:person 王二麻子 = new person();
王二麻子。Getname();
王二麻子。Setname();
person 王二麻子2 = new person();
person 王二麻子3 = new person();
。。。。。。。。。。。。。
。。。。。。。。。。。。
对于项目的业务来说,这重复的new对象的过程是一个浪费时间的无用功。所以spring框架的学者们,运用了控制反转的思想(将new对象的过程交给一个容器去处理,程序员不再去关注new对象的这个过程,而更多的去关注业务逻辑)
上图是笔者摘录的一个更权威的解释。
仔细琢磨后笔者对控制反转的解释如下:
1 spring是个容器,就像是一个娃娃机。项目开始,我们将bean注入到这个容器中,通过注册,我们就可以使用已经注册的bean,在使用对象时,我们就不用去new xxx();
而是直接xx.getbean(“xxx”);
在SSM整合后,使用注解开发则更为简单。
DI(依赖注入)
在笔者眼中,依赖注入和控制反转是一个相辅相成的概念,对于依赖注入简单来说,就是将类的属性、方法、依赖的对象,注入到已经在spring容器中注册的bean。
Spring 依赖注入四种方式
构造器注入 set方法注入 静态工厂注入 实例工厂
5 种不同方式的自动装配
Spring 装配包括手动装配和自动装配,手动装配是有基于 xml 装配、构造方法、setter 方法等 自动装配有五种自动装配的方式,可以用来指导 Spring 容器用自动装配方式来进行依赖注入。
1. no:默认的方式是不进行自动装配,通过显式设置 ref 属性来进行装配。
2. byName:通过参数名 自动装配,Spring 容器在配置文件中发现 bean 的 autowire 属性被设置成 byname,之后容器试图匹配、装配和该 bean 的属性具有相同名字的 bean。
3. byType:通过参数类型自动装配,Spring 容器在配置文件中发现 bean 的 autowire 属性被 设置成 byType,之后容器试图匹配、装配和该 bean 的属性具有相同类型的 bean。如果有多个 bean 符合条件,则抛出错误。
4. constructor:这个方式类似于 byType, 但是要提供给构造器参数,如果没有确定的带参数的构造器参数类型,将会抛出异常。
5. autodetect:首先尝试使用 constructor 来自动装配,如果无法工作,则使用 byType 方式。
AOP(面向切面)
对于面向切面,笔者有以下简单理解,便于小白入门:先从一个简单的小故事引入。
所有人每天都要吃午饭,对于吃午饭这个事,我们可能想要一个更完美的流程,吃午饭前我们要洗手,吃午饭时候我们还想看电视,吃午饭后我们还想睡觉,吃午饭的时候,突然有人想要我们去玩游戏,我们应该还有有对待这个场景的解决方案。这听起来有点像装饰者模式。
上面的场景假设我们当前已经存在了吃午饭这个类,不能对其修改,那么我们就无法进行添加洗手、打游戏、睡觉、看电视等操作。这就很烦
但是对于Spring框架来说,研究人员为我们提供了AOP的思想和实现,使我们这个想法得以实现,并且完美整合到当下javaee项目开发流程中。
对于aop的开发,离不开java的jdk动态代理和cjlib的两种代理方法。
AOP 两种代理方式
Spring 提供了两种方式来生成代理对象: JDKProxy 和 Cglib,具体使用哪种方式生成由 AopProxyFactory 根据 AdvisedSupport 对象的配置来决定。默认的策略是如果目标类是接口, 则使用 JDK 动态代理技术,否则使用 Cglib 来生成代理。
简单来说:代理就是将上面的吃午饭业务进行升华,可以在代理类中实现,吃午饭befor去洗手,after睡觉,中途去完,吃饭时看电视等操作。最中目的:在不影响代码的前提下,去给同一类操作去增加更好更多的业务。
Spring APO 原理 6.1.8.1. 概念
"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块, 并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共 同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未 来的可操作性和可维护性。
使用"横切"技术,AOP 把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流 程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生 在核心关注点的多处,而各处基本相似,比如权限认证、日志、事物。AOP 的作用在于分离系统 中的各种关注点,将核心关注点和横切关注点分离开来。
AOP 主要应用场景有:
Authentication 权限
Caching 缓存
Context passing 内容传递
Error handling 错误处理
Lazy loading 懒加载
Debugging 调试
logging, tracing, profiling and monitoring
Performance optimization 性能优化
Persistence 持久化
Resource pooling 资源池
Synchronization 同步
Transactions 事务
记录跟踪 优化 校准
AOP 核心概念
1、切面(aspect):类是对物体特征的抽象,切面就是对横切关注点的抽象
2、横切关注点:对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点。 3、连接点(joinpoint):被拦截到的点,因为 Spring 只支持方法类型的连接点,所以在 Spring
中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器。 4、切入点(pointcut):对连接点进行拦截的定义
5、通知(advice):所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、 异常、最终、环绕通知五类。
6、目标对象:代理的目标对象 7、织入(weave):将切面应用到目标对象并导致代理对象创建的过程
8、引入(introduction):在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法 或字段。