简单工厂(StaticFactory Method)
Spring 中的 BeanFactory的getBean方法实现了简单工厂模式:将参数传递给工厂类,动态决定应该创建哪一个产品类。通过getBean(bean.class)获得对应的bean实例。
原理:
Bean容器启动阶段:
读取Bean的XML文件,将bean元素转换为BeanDefinition对象。
然后通过BeanDefinitionRegistry将这些bean注册到BeanFactory中,将它们保存在一个ConcurrentHashMap中。
容器中bean的实例化阶段,主要是通过反射、cglib对bean进行实例化。
工厂方法(Factory Method)
Spring中的FactoryBean使用的就是工厂方法模式
静态工厂方法模式
<!--
通过静态工厂方法来配置Bean,注意不是配置静态工厂方法实例, 而是配置Bean实例
class:指向静态工厂方法的全类名
factory-method:静态工厂方法名
constructor-arg:赋值,如果工厂方法需要传入参数,则使用constructor-arg来配置参数-->
<bean id="car1" class="factory.StaticCarFactory" factory-method="getCar"><constructor-arg value="Audi"/></bean>
实例工厂方法
<!--配置工厂的实例--><bean id="carFactory" class="factory.InstanceCarFactory"/><!--
通过实例工厂方法来配置bean
factory-bean:指向实例工厂方法的bean
factory-method:静态工厂方法名
constructor-arg:赋值,如果工厂方法需要传入参数,则使用constructor-arg来配置参数-->
<bean id="car2" factory-bean="carFactory" factory-method="getCar"><constructor-arg value="大众"/></bean>
单例(Singleton)
spring的单例是指实例在spring容器中是单例的
spring中的单例是通过单例注册表((登记式单例))实现的。
单例注册表:
单例注册表是一组单例类的实例,将这些实例存储到一个Map(登记簿)中,对于已经登记过的单例,则从工厂直接返回,对于没有登记的,则先登记,而后返回
spring 中加载单例的过程都是在BeanFactory接口中定义的getBean(…)这个方法中定义的,实现默认是在AbstractBeanFactory中,大致就是将我们需要的对象放在map中,下次需要的时候就直接从map中获取
适配器(Adapter)
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
Spring中在对于AOP的处理中有Adapter模式的例子
Spring AOP 模块对 BeforeAdvice、 AfterAdvice、 ThrowsAdvice 三种通知类型的支持实际上是借助适配器模式来实现的,在spring中 基本adapter结尾都是适配器
比如:HandlerAdapter
装饰(Decorator)
Spring中用到的包装器模式在类名上有两种表现:一种是类名中含有Wrapper,另一种是类名中含有Decorator。基本上都是动态地给一个对象添加一些额外的职责。
实际应用案例:
springsession框架使用HTTP请求包装类SessionRepositoryRequestWrapper和Session存储过滤器 SessionRepositoryFilter 实现实现分布式session;
代理(Proxy)
Spring的Proxy模式在aop中有体现,比如JdkDynamicAopProxy和Cglib2AopProxy。
AOP底层,就是采用【动态代理】模式实现的。采用了两种代理:JDK动态代理和CGLIB动态代理。
如果目标类实现了接口,则采用jdkproxy生成代理对象,如果目标类没有实现接口,则采用cglibproxy生成代理对象,而生成代理对象是由spring容器内部完成的。
观察者(Observer)
当一个对象变化时,其它依赖该对象的对象都会收到通知
Spring中Observer模式常用的地方是listener的实现。如ApplicationListener。
一、spring事件:ApplicationEvent,该抽象类继承了EventObject类,jdk建议所有的事件都应该继承自EventObject。
- spring事件监听器:ApplicationLisener,该接口继承了EventListener接口,jdk建议所有的事件监听器都应该继承EventListener。
我们一般通过ApplicationListener接口来实现事件的监听,比如文件传送状态、接口回调状态等
Spring中提供的标准事件:
ContextRefreshEvent,当ApplicationContext容器初始化完成或者被刷新的时候,就会发布该事件。比如调用ConfigurableApplicationContext接口中的refresh()方法。此处的容器初始化指的是所有的Bean都被成功装载
ContextStartedEvent,当ApplicationContext启动的时候发布事件,即调用ConfigurableApplicationContext接口的start方法的时候。这里的启动是指,所有的被容器管理生命周期的Bean接受到一个明确的启动信号。在经常需要停止后重新启动的场合比较适用。
ContextStoppedEvent,当ApplicationContext容器停止的时候发布事件,即调用ConfigurableApplicationContext的close方法的时候。这里的停止是指,所有被容器管理生命周期的Bean接到一个明确的停止信号。
ContextClosedEvent,当ApplicationContext关闭的时候发布事件,即调用ConfigurableApplicationContext的close方法的时候,关闭指的是所有的单例Bean都被销毁。关闭上下后,不能重新刷新或者重新启动。
RequestHandledEvent,只能用于DispatcherServlet的web应用,Spring处理用户请求结束后,系统会触发该事件。
策略模式(strategy)
实例化对象的时候用到了,根据不同的情况使用不同的策略进行实例化对象
模板方法(Template Method)
Spring 中的 jdbcTemplate、hibernateTemplate 等以 Template 结尾的对数据库操作的类,这些就使用到了模板模式。