Spring中的设计模式
工厂设计模式
BeanFactory
- 延迟注入(当需要某个bean的时候才会注入),相比于ApplicationContext来说会占用更少的空间,程序启动速度更快
ApplicationContext
-
容器启动的时候,不管有没有用到,一次性创建所有的bean。除了有beanfactory的功能还有额外更多的功能,所以使用ApplicationContext的更多
-
ApplicationContext的三个实现类
- ClassPathXmlApplication,把上下文文件当初类路径资源
- FileSystemXmlApplication,从文件系统中的XML文件载入上下文定义信息
- XmlWebApplicationContext,从web系统中的XML文件载入上下文定义信息
单例设计模式
在系统中,有一些对象我们只需要一个,如线程池、缓存之类。这一类对象只能有一个实例,如果创造出多个可能会导致一些问题的产生比如程序行为异常,资源使用过量或者不一致性的结果
使用单例模式的好处
- 对于频繁使用的对象,可以省略创建对象所花费的实际,这对于那些重量级对象而言,是非常客观的一笔系统开销
- 由于new操作的次数减少,因而对系统内存的使用频率也会降低
Spring中的bean默认就是单例模式
-
spring实现单例的方式
- xml:
- 注解:@Scope(value = “singleton”)
代理设计模式
代理模式在AOP中的应用
- AOP编程能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务管理,日志管理,权限控制等)封装起来,减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性
- SpringAOP就是基于动态代理的,如果代理的对象实现了某个接口,那么SpringAOP会使用JDK Proxy去创建代理对象;对于没有实现接口的对象,SpringAOP会使用Cglib生成一个被代理对象的子类来作为代理
Spring AOP和Aspectj AOP的区别
- SpringAOP是属于运行时增强,基于代理实现,已经继承Aspectj,SpringAOP相对来说更简单
Aspectj是编译时增强,基于字节码操作实现
模板方法
模板方法模式是一种行为设计模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,模板方法使子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤的实现方式
如Spring中的jdbcTemplate,hibernateTemplate等以template结尾的对数据库操作的类,都使用到了模板模式
观察者模式
观察者模式是一种对象行为模型,表示的是一种对象与对象之间具有依赖关系,当一个对象发生改变的时候,这个对象所依赖的对象也会做出反应
Spring事件驱动模型中的三种角色
- 事件角色
- 事件监听者角色
- 时间发布者角色
适配器模式
适配器模式将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器
SpringAOP中的适配器模式
- SpringAOP的增强或者通知使用到了适配器模式,与之相关的接口是AdvisorAdapter。Advice常用类型有beforeadvice,afteradvice,afterreturningadvice,每个Advice都有对应的拦截器MethodBeforeAdviceInterceptor、AfterReturningAdviceAdapter、AfterReturningAdviceInterceptor
SpringMVC中的适配器模式
- SpringMVC中的controller种类众多,不同类型的controller通过不同的方法来对请求进行处理,如果不利用适配器模式的话,dispatcherservlet之间获取对应类型的controller需要自行来判断