Spring中的设计模式
设计模式:表示面向对象软件开发中最好的计算机编程实践。
1、
(1)通过BeanFactory或ApplicationContext容器创建Bean对象
ApplicationContext的三个实现类:
=1、ClassPathXmlApplication:把上下文文件当成类路径资源
=2、FileSystemXmlApplication:从文件系统中的XML文件载入上下文定义信息。
=3、XmlWebApplicationContext:从Web系统中的XML文件载入上下文定义信息。
(2)区别:
=1、BeanFactory: 容器启动时,延迟注入bean依赖,要使用某个bean时才会注入,内存占用更少,程序启动更快。
=2、ApplicationContext:容器启动时,所有的bean都会被创建。
=3、BeanFactory提供最基本的依赖注入支持
=4、ApplicationContext扩展了BeanFactory,有更强大的功能
2、单例模式
某些对象只需要一个实例就好,多个实例会导致资源使用过量,不一致性结果等异常。 (例如:线程池、缓存、对话框、注册表、日志对象、充当打印机、显卡等设备驱动程序的对象)
(1)单例的好处:减少频繁使用的对象的创建的时间,创建一次就好;
new操作次数减少,降低内存的使用频率,减轻GC
(2)Spring中的单例
=1、bean的默认作用域 singleton(单例)
=2、实现单例的方式:
xml:<bean id="userService" class="com.heyuliang.UserService" scope="singleton"/>
注解:@Scope(value="singleton")
3、代理模式
(1)Spring中的代理设计模式 AOP AspectJ
(2)AOP:面向切面编程,将非业务的模块抽取出来,正常运行,降低耦合
=基于动态代理
1、要代理的对象实现了某个接口,使用JDK动态代理,创建代理对象(实现接口)
2、要代理的对象没有实现接口,使用CGLIB动态代理,会生成一个被代理对象的子类来作为代理(继承)
4、模板模式
定义一个操作中的算法的骨架,由子类继承该算法并实现。
(1)XXXTemplate结尾的类,例如:jdbcTemplate、redisTemplate等
(2)使用继承来实现模板模式,实现代码复用的效果,增加灵活性
5、观察者模式
对象行为模式,表示一种对象间的依赖关系,一个对象发生改变,所依赖的对象也要改变。
(1)Spring中经典应用——Spring事件驱动模型
事件流程:=1、定义事件 继承ApplicationEvent,重载构造函数
=2、定义一个事件监听者,实现ApplicationListener接口,重写onApplicationEvent()方法
=3、使用事件发布者发布信息:调用ApplicationEventPublisher.publishEvent()方法发布信息。
6、适配器模式
适配器模式使接口不兼容的类一起工作,将一个接口转换成客户希望的另一个接口。
(1)AOP中的适配器模式——增强或通知Advice
=1、相关的接口 AdvisorAdapter
=2、 通知——拦截器——适配器
通过对应的适配器,适配成MethodInterceptor接口(方法拦截器)类型的对象,再负责适配通知
==通知只是定义了增强时将要被调用的方法
==方法具体何时调用需要由通知对应的拦截器来进行管理
==适配器的作用就是根据通知得到其对应的拦截器
=== BeforeAdvice(目标方法调用前,前置通知),对应的拦截器 MethodBeforeAdviceInterceptor
===AfterAdvice(目标方法调用后,后置通知),对应的拦截器 AfterReturningAdviceInterceptor
=== AfterReturningAdvice(目标方法执行结束后,return之前),对应的拦截器AfterReturningAdviceInterceptor
(2)MVC中的适配器
=1、MVC中适配器流程
==DispatcherServlet根据请求信息调用HandlerMapping,解析请求对应的Handler(即解析到对应的Controller控制器)
==解析获取对应Handler后,由HandlerAdapter适配器处理
==HandlerAdapter适配器接口,器实现类对目标类Controller类进行适配,
=2、为什么MVC要使用适配器模式
SpringMVC中Controller类型多,不同类型的Controller要使用不同的方法对请求进行处理,没有使用适配器模式,则DispatcherServlet直接获取对应类型的Controller,需要自行判断,同时增加Controller类型需要对代码进行改变,增加了耦合性。
7、装饰者模式
装饰者模式可以动态给对象添加一些额外的属性或行为,比使用继承更加灵活。
Spring中配置DataSource的数据库和数据源的确认,可能访问不同的数据库,通过装饰者模式能够准确地动态切换不同的数据源。