网站开发部门工资入什么科目/建立网站流程
Spring 中用到的设计模式
工厂方法
工厂方法定义:父类定义了创建对象的接口,但是由子类来具体实现,工厂方法让类把实例化的动作推迟到了子类当中。
例如实现了 FactoryBean 接口的类,Spring 可以利用 getObject() 方法返回实现了该接口的类的实例;
AbstractFactoryBean 实现了 FactoryBean 接口,由子类去实现 createInstance 的逻辑
public abstract class AbstractFactoryBean<T>implements FactoryBean<T>, BeanClassLoaderAware, BeanFactoryAware, InitializingBean, DisposableBean {@Overridepublic final T getObject() throws Exception {if (isSingleton()) {return (this.initialized ? this.singletonInstance : getEarlySingletonInstance());}else {return createInstance();}}protected abstract T createInstance() throws Exception;}
单例模式
单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
AbstractBeanFactory 提供 getBean 方法,具体调用到 DefaultSingletonBeanRegistry.getSingleton 方法中,使用 Double Check 方式获取单例 Bean
public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {@Nullableprotected Object getSingleton(String beanName, boolean allowEarlyReference) {Object singletonObject = this.singletonObjects.get(beanName);if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {synchronized (this.singletonObjects) {singletonObject = this.earlySingletonObjects.get(beanName);if (singletonObject == null && allowEarlyReference) {ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);if (singletonFactory != null) {singletonObject = singletonFactory.getObject();this.earlySingletonObjects.put(beanName, singletonObject);this.singletonFactories.remove(beanName);}}}}return singletonObject;}
}
代理模式
AOP 的实现
- 静态代理,编写代理类,通过代理类操作被代理的对象
- 动态代理,利用反射、修改字节码的方式生成代理类
观察者模式
实现 ApplicationListener 接口,就可以接收对应的事件消息
@FunctionalInterface
public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {void onApplicationEvent(E var1);
}
策略模式
通过实现 Resource 接口,提供更强的资源访问能力。
UrlResource、ClassPathResource、FileSystemResource 等等
模板方法模式
模板方法模式:一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行
AbstractApplicationContext 中的 refresh 方法,里面调用的一系列方法,其中 postProcessBeanFactory,onRefresh 的实现由子类去实现
public abstract class AbstractApplicationContext extends DefaultResourceLoader implements ConfigurableApplicationContext {public void refresh() throws BeansException, IllegalStateException {synchronized(this.startupShutdownMonitor) {this.prepareRefresh();ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();this.prepareBeanFactory(beanFactory);try {this.postProcessBeanFactory(beanFactory);this.invokeBeanFactoryPostProcessors(beanFactory);this.registerBeanPostProcessors(beanFactory);this.initMessageSource();this.initApplicationEventMulticaster();this.onRefresh();this.registerListeners();this.finishBeanFactoryInitialization(beanFactory);this.finishRefresh();} catch (BeansException var9) {if (this.logger.isWarnEnabled()) {this.logger.warn("Exception encountered during context initialization - cancelling refresh attempt: " + var9);}this.destroyBeans();this.cancelRefresh(var9);throw var9;} finally {this.resetCommonCaches();}}
}
适配器模式
适配器模式:将一个类的接口转换成客户希望的另外一个接口
Spring MVC 中的 HandlerAdapter
public interface HandlerAdapter {boolean supports(Object var1);@NullableModelAndView handle(HttpServletRequest var1, HttpServletResponse var2, Object var3) throws Exception;long getLastModified(HttpServletRequest var1, Object var2);
}
装饰器模式
装饰器模式:动态地给对象添加额外的功能
Spring 中用到的包装器模式在类名上有两种表现: 一种是类名中含有 Wrapper, 另一种是类名中含有 Decorator。