简单工厂(非23种设计模式中的一种)
BeanFactory。Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象
工厂方法
FactoryBean接口。
实现FactoryBean接口,重写getObject方法自定义Bean的实例类型;spring会在使用getBean()调用获得该bean时,会自动调用该bean的getObject()方法。
单例模式
获取单例Bean的方法实现就是单例模式的实现,提供了全局唯一的获取Bean的方法入口,但是没有从构造器级别去控制单例,这是因为spring管理的是任意的java对象。
protected Object getSingleton(String beanName, boolean allowEarlyReference) {
//检查缓存中是否存在实例
Object singletonObject = this.singletonObjects.get(beanName);
if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
//如果为空,则锁定全局变量并进行处理。
synchronized (this.singletonObjects) {
//如果此bean正在加载,则不处理
singletonObject = this.earlySingletonObjects.get(beanName);
if (singletonObject == null && allowEarlyReference) {
//当某些方法需要提前初始化的时候则会调用addSingleFactory 方法将对应的ObjectFactory初始化策略存储在singletonFactories
ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
if (singletonFactory != null) {
//调用预先设定的getObject方法
singletonObject = singletonFactory.getObject();
//记录在缓存中,earlysingletonObjects和singletonFactories互斥
this.earlySingletonObjects.put(beanName, singletonObject);
this.singletonFactories.remove(beanName);
}
}
}
}
return (singletonObject != NULL_OBJECT ? singletonObject : null);
}
适配器模式
在DispatcherServlet中,通过实现HandlerAdapter接口扩展对应不同Handler的适配器实现类,借助适配器实现类动态调用对应的真实Handler的handleRequest方法。这样使得多种类型的Handler可以更好地扩展,只需要增加新的Handler和适配器实现类即可。
public interface HandlerAdapter {
//该方法用于判断是否是目标Handler
boolean supports(Object handler);
//该方法用于调用真实Handler的handleRequest方法执行逻辑
@Nullable
ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
}
protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
if (this.handlerAdapters != null) {
for (HandlerAdapter adapter : this.handlerAdapters) {
if (adapter.supports(handler)) {
return adapter;//返回与当前请求Handler对应的适配器实现类
}
}
}
throw new ServletException("No adapter for handler [" + handler +
"]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler");
}
HttpRequestHandler类型的Handler的适配器实现类的实现
public class HttpRequestHandlerAdapter implements HandlerAdapter {
@Override
public boolean supports(Object handler) {
return (handler instanceof HttpRequestHandler);
}
@Override
@Nullable
public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
((HttpRequestHandler) handler).handleRequest(request, response);
return null;
}
@Override
public long getLastModified(HttpServletRequest request, Object handler) {
if (handler instanceof LastModified) {
return ((LastModified) handler).getLastModified(request);
}
return -1L;
}
}
代理模式
AOP底层,就是动态代理模式的实现。
观察者模式
spring的事件驱动模型使用的是 观察者模式 ,常用的地方是listener的实现。