文章目录
- Spring中的AOP
- AOP的概念
- 为什么需要AOP
- AOP的分类
- Spring中的IOC和DI
- IOC的概念
- IOC的优点
- DI的概念
- IOC与DI的关系
- Spring是否支持配置多例对象
- 单例、多例的使用场景
- 单例、多例的配置方式
- Spring中都用到了哪些设计模式
Spring中的AOP
AOP的概念
AOP (Aspect Orient Programming),直译过来就是 面向切面编程。AOP 是一种编程思想,是面向对象编程的一种补充。面向对象编程将程序抽象成各个层次的对象,而面向切面编程是将程序抽象成各个切面。
为什么需要AOP
AOP采用的是横向切面的方式,注入与主业务流程无关的功能,例如事务管理和日志管理。
AOP的分类
AOP 要达到的效果是,保证开发者不修改源代码的前提下,去为系统中的业务组件添加某种通用功能。
按照 AOP 框架修改源代码的时机,可以将其分为两类:
- AspectJ 静态 AOP 实现, AOP 框架在编译阶段对程序源代码进行修改,生成了静态的 AOP代理类(生成的
*.class
文件已经被改掉了,需要使用特定的编译器)。
- 动态 AOP 实现, AOP 框架在运行阶段对动态生成代理对象(在内存中以 JDK 动态代理,或 CGlib 动态地生成 AOP 代理类),如 SpringAOP。
- JDK动态代理:使用JDK动态代理,目标类必须实现的某个接口,如果某个类没有实现接口则不能生成代理对象。
- CGLIB代理:Cglib原理是针对目标类生成一个子类,覆盖其中的所有方法,所以目标类和方法不能声明为final类型。
Spring中的IOC和DI
IOC的概念
IoC——Inversion of Control,即“控制反转”,不是技术,是一种设计思想。在Java开发中,IOC意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。
IOC的优点
使用IOC后,我们不需要自己去创建某个类的实例,而是交由IOC容器去创建;当我们需要使用某个对象时,直接到容器中去获取就可以了。
DI的概念
DI——Dependency Injection(依赖注入)。创建被调用对象由Spring来完成,在容器实例化对象的时候主动的将被调用者注入给调用者,这样就产生为了“依赖注入”的概念,也就是"DI"。
IOC与DI的关系
其实它们是同一个概念的不同角度描述,由于控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以2004年大师级人物 Martin Fowler 又给出了一个新的名字:“依赖注入”,相对 IoC 而言,“依赖注入”明确描述了 “被注入对象依赖IoC容器配置依赖对象” 。
Spring是否支持配置多例对象
在Spring中,bean可以被定义为两种模式:
prototype
(多例)和singleton
(单例)。所谓单例,就是所有的请求都由一个对象来进行处理,比如我们常用的service和dao层的对象通常都是单例的,而多例则指每个请求用一个新的对象来处理。
- singleton:只有一个共享的实例存在,所有对这个bean的请求都会返回这个唯一的实例。不管new多少次,只生成一个对象。
- prototype:对这个bean的每次请求都会创建一个新的bean实例,类似于new。
单例、多例的使用场景
当对象含有可改变的状态时(更精确的说就是在实际应用中该状态会改变),就使用多例,否则使用单例。例如dao和service这两层的数据一般不会有相应的属性修改,所以可以考虑用单例,而Controller层会存储很多需要操作的vo类(value object值对象),此时这个对象的状态就会被改变,就要使用多例。
单例、多例的配置方式
<!-- 单例模式 -->
<!-- Spring bean 默认就是单例模式,scope="singleton" 可以省略不写 -->
<bean id="user" class="..." scope="singleton"/>
<!-- 多例模式 -->
<bean id="user" class="..." scope="prototype"/>
Spring中都用到了哪些设计模式
设计模式 | 说明 |
---|---|
工厂设计模式 | Spring使用工厂模式通过 BeanFactory 、ApplicationContext 创建 bean 对象 |
代理设计模式 | Spring AOP 功能的实现 |
单例设计模式 | Spring 中的 Bean 默认都是单例的 |
模板方法模式 | Spring 中 jdbcTemplate 、hibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式 |
包装器设计模式 | 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。 这种模式让我们可以根据客户的需求能够动态切换不同的数据源 |
观察者模式 | Spring 事件驱动模型就是观察者模式很经典的一个应用 |
适配器模式 | Spring AOP 的增强或通知(Advice)使用到了适配器模式,Spring MVC 中也是用到了适配器模式来适配Controller |