Spring依赖注入Bean实例默认是double check的单例模式。
Spring中的单例与设计模式里面的单例略有不同,设计模式的单例是在整个应用中只有一个实例,而Spring中的单例是在一个IOC容器中就只有一个实例。
实现方式: AOP底层就是动态代理模式的实现。
JDK和CGLIB
如果没有接口,jdk会失效
cglib可以解决这个问题
Spring中的BeanFactory就是工厂模式的体现,将对象的创建交给工厂来做。
设计意义: 松耦合
原来只有依赖方和被依赖方,现在我们引入了第三方,即spring的beanFactory,由它来解决bean之间的依赖问题,达到了松耦合的效果.
实现方式:SpringMVC中的适配器HandlerAdatper。
实现原理:HandlerAdatper根据Handler规则执行不同的Handler。
实现过程:
DispatcherServlet根据HandlerMapping返回的handler,向HandlerAdatper发起请求,处理Handler。HandlerAdapter根据规则找到对应的Handler并让其执行,执行完毕后Handler会向HandlerAdapter返回一个ModelAndView,最后由HandlerAdapter向DispatchServelet返回一个ModelAndView。
实现意义:
HandlerAdatper使得Handler的扩展变得容易,只需要增加一个新的Handler和一个对应的HandlerAdapter即可。因此Spring定义了一个适配接口,使得每一种Controller有一种对应的适配器实现类,让适配器代替controller执行相应的方法。这样在扩展Controller时,只需要增加一个适配器类就完成了SpringMVC的扩展了。
Mybatis中用到以下的设计模式
Builder模式 :
例如 SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、CacheBuilder;
工厂模式 :
例如SqlSessionFactory、ObjectFactory、MapperProxyFactory;
单例模式 :例如ErrorContext和LogFactory;
代理模式 :Mybatis实现的核心,比如MapperProxy、ConnectionLogger,用的jdk的动态代理;还有executor.loader包使用了cglib或者javassist达到延迟加载的效果;
组合模式 :例如SqlNode和各个子类ChooseSqlNode等;
模板方法模式 : 例如BaseExecutor和SimpleExecutor,还有BaseTypeHandler和所有的子类例如IntegerTypeHandler;
适配器模式 : 例如Log的Mybatis接口和它对jdbc、log4j等各种日志框架的适配实现;
装饰者模式 : 例如cache包中的cache.decorators子包中等各个装饰者的实现;
迭代器模式 : 例如迭代器模式PropertyTokenizer;