Spring面试之spring使用的设计模式
Spring中使用到了哪些设计模式,IOC属于那种设计模式?
IOC(Inversion of Control,控制反转)是spring中一个非常重要的概念,它不是什么技术,而是一中解耦的设计思想.它的主要目的是借助于"第三方"(即Spring中的IOC容器)实现具有依赖关系的对象之间的解耦(IOC更容易管理对象,你只管使用即可),从而降低代码之间的耦合度.
IOC是一个原则而不是一个模式.
控制反转怎么理解呢?举个例子:"对象a 依赖了对象 b,当对象 a 需要使用 对象 b的时候必须自己去创建。但是当系统引入了 IOC 容器后, 对象a 和对象 b 之前就失去了直接的联系。这个时候,当对象 a 需要使用 对象 b的时候, 我们可以指定 IOC 容器去创建一个对象b注入到对象 a 中"。 对象 a 获得依赖对象 b 的过程,由主动行为变为了被动行为,控制权反转了,这就是控制反转名字的由来。
DI(Dependency Inject,依赖注入),是实现控制反转的一种设计模式,依赖注入就是将实例变量传入到一个对象中去.
工厂设计模式:
Spring使用工厂模式可以通过BeanFactory和ApplicationContext创建bean对象.
单例设计模式:
Spring中bean的默认作用域就是singleton(单例)的.Spring通过ConcurrentHashMap实现单例注册表的特殊方式实现单例模式.
代理设计模式:
AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无关的,却为业务模块所共同调用的逻辑或责任(例如事物处理,日志管理,权限控制等)封装起来,便于减小系统的重复代码,降低模块间的耦合度.
Spring AOP是属于动态代理的,如果代理对象实现了某个接口,那么Spring AOP会使用JDK Proxy 去创建代理对象,而对于没有实现接口的对象,Spring AOP会使用CGLIB,这时候Spring AOP会使用CGLIB生成一个被代理对象的子类来作为代理.
Spring AOP 和 AspectJ AOP有什么区别?
Spring AOP 属于运行时增强,而AspectJ是编译时增强,
Spring AOP 基于代理(Proxying),而AspectJ 基于字节码操作(Bytecode Manipulation).
Spring AOP 已经集成了AspectJ,AspectJ应该算得上是Java生态系统中最完整的AOP框架了.AspectJ相比于Spring AOP功能更加强大,但是Spring AOP相对来说更简单,功能相对较弱.
模板方法设计模式:
模板方法设计模式是一种行为设计模式,它定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤的实现方式.
Spring中jdbcTemplate,hibernateTemplate等以Template结尾的数据库操作的类,他们就使用了模板方法模式.
观察者模式:
观察者模式是一种对象行为型模式,它表示的是一种对象与对象之间具有依赖关系,当一个对象发生改变的时候,这个对象所依赖的对象也会做出反应,Spring的事件驱动模型就是观察者模式很经典的一个应用.
适配器模式:
适配器模式(Adapter Pattern)将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper).
Spring AOP中的适配器模式:我们知道 Spring AOP的实现是基于代理模式的,但是 Spring AOP的增强或者通知(Advice)使用到了适配器模式,与之相关的接口是AdvisorAdapter.
Spring MVC中的适配器模式:Spring MVC中的Controller种类众多,不同类型的Controller通过不同的方法来对请求进行处理.
装饰者模式:
装饰者模式可以动态的给对象添加一些额外的属性或行为,相比于继承,装饰者模式更加灵活,简单点说就是当我们需要修改原有的功能,但我们又不愿直接取修改原有的代码时,设计一个Decorator套在原有代码外面.其实在JDK中就有很多地方用到了装饰者模式,比如InputStream家族,InputStream类下有FileInputStream(读取文件),BufferedInputStream(增加缓存,使读取文件速度大大提升)等子类都在不修改InputStream代码的情况下扩展了它的功能.