spring框架中常用到的8种设计模式清单如下:
设计模式 |
使用地方 |
备注 |
工厂模式 |
BeanFactory |
|
单例模式 |
Spring中的Bean |
|
代理模式 |
Spring AOP |
java反射实现动态代理 |
模板方法模式 |
Spring中以Template结尾的类 |
使用继承的方式实现 |
观察者模式 |
Spring事件驱动模型 |
|
适配器模式 |
Spring AOP中的AdvisorAdapter |
|
装饰器模式 |
Spring中含有Wrapper和含有Decorator的类 |
|
策略模式 |
资源访问Resource接口 |
1、BeanFactory
是一种懒汉模式,即使用到某个Bean时才会进行注入和ApplicationContext相比会占用更少的内存,程序启动速度更快
2、ApplicationContext
是一种恶汉模式,容器启动时就创建所有的Bean和BeanFactory相比 ,BeanFactory仅提供了最基本的依赖注入支持 . ApplicationContext扩展了BeanFactory, 除了BeanFactory的功能外还包含其余更多的功能,通常使用ApplicationContext创建BeanApplicationContext的三个实现类: ClassPathXmlApplication: 将上下文文件作为类路径资源
FileSystemXmlApplication: 从文件系统中的XML文件中载入上下文定义信息
XmlWebApplicationContext: 从Web系统中的XML文件中载入上下文定义信息
Spring中的Bean的作用域默认就是单例Singleton的 . Spring中的Bean还可以定义以下作用域: prototype: 每次请求都会创建一个新的Bean实例
request: 每一次HTTP请求都会创建一个新的Bean实例,该Bean实例仅在当前HTTP request中有效 session: 每一次HTTP请求都会创建一个新的Bean实例,该Bean实例仅在当前HTTP session中有效
Spring实现单例Bean的方式:
xml的方式:
注解的方式: @Scope(value="singleton")
Spring底层通过ConcurrentHashMap实现单例注册表来实现单例模式:
Java |
面向切面编程AOP: Aspect-Oriented Programming 面向切面编程能够将和业务无关,但是是业务模块中所共同调用的逻辑或者业务功能封装起来, 比如事务管理,日志管理,权限控制等 有利于减少重复代码,降低模块之间的耦合度,并有利于面向未来的可拓展性和可维护性 使用AOP可以将一些通用功能抽象出来,在需要使用的地方直接使用,这样可以大大简化代码量 需要增加新功能也会更加简单方便,这样可以提高系统的扩展性
Spring AOP基于动态代理实现的: 代理对象实现了接口: Spring AOP会使用Java动态代理JDK Proxy创建代理对象 完成对象的代理操作 代理对象没有实现接口: Spring AOP会使用Cglib Proxy生成一个被代理对象的子类作为代理类完成对象的代理操作
Spring AOP集成了AspectJ,AspectJ是Java中最为完整的AOP框架
AspectJ和Spring AOP比较
AspectJ
AspectJ是编译时增强
AspectJ基于字节码操作Bytecode Manipluation实现
AspectJ在切面较多的情况下要比Spring AOP的性能强很多
Spring AOP
Spring AOP是运行时增强
Spring AOP基于代理Proxy实现
Spring AOP中集成了AspectJ
Spring AOP比较简单,在切面比较少的情况下和AspectJ的性能相似
观察者模式: 是一种对象行为模式 表示的是一种对象和对象之间具有依赖关系,当一个对象发生改变,依赖于这个对象的对象也会发生改变
Spring事件驱动模型就是基于观察者模式实现的 Spring事件驱动模型可以在很多应用场景中解耦代码 比如每次添加商品时都需要更新商品索引,这时就可以使用观察者模式
Spring事件驱动模型
Spring事件流程
1、定义一个事件: 实现一个继承自ApplicationEvent的事件类,并写出相应的构造函数
2、定义一个事件监听者: 实现ApplicationListener接口 重写onApplicationEvent() 方法
3、使用事件发布者发布消息: 使用ApplicationEventPublisher的publishEvent() 方法 重写publishEvent() 方法发布消息
事件角色Event
ApplicationEvent: org.springframework.context 事件角色抽象类 继承java.util.Event并实现了java.io.Serializable接口
Spring中默认存在以下事件,都是继承自ApplicationContext事件角色抽象类: ContextStartedEvent: ApplicationContext启动后触发的事件 ContextStoppedEvent: ApplicationContext停止后触发的事件 ContextRefreshedEvent: ApplicationContext初始化或者刷新后触发的事件 ContextClosedEvent: ApplicationContext关闭后触发的事件
事件监听者角色Listener
ApplicationListener: 事件监听者角色 ApplicationListener接口中定义了一个onApplicationEvent() 方法来处理ApplicationEvent. 只要实现onApplicationEvent() 方法即可完成监听事件
事件发布者角色Publisher
ApplicationEventPublisher: 事件发布者角色 ApplicationEventPublisher接口中定义了publishEvent() 方法来发布事件,这个方法在AbstractApplicationContext中实现 在AbstractApplicationContext中,事件是通过ApplicationEventMulticaster广播的
Spring AOP中的适配器模式
Spring MVC中的适配器模式