Spring中的设计模式

Spring中的设计模式 设计模式:表示面向对象软件开发中最好的计算机编程实践。 1、工厂模式(ioc是一种思想,但DI注入是ioc思想的结果行为,是工厂设计

Spring中的设计模式

设计模式:表示面向对象软件开发中最好的计算机编程实践。

1、工厂模式(ioc是一种思想,但DI注入是ioc思想的结果行为,是工厂设计模式)

(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的数据库和数据源的确认,可能访问不同的数据库,通过装饰者模式能够准确地动态切换不同的数据源。