范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Spring框架中都用到了哪些设计模式?

  Spring控制反转IOC控制反转IOC: Inversion of Control 是一种解耦设计原则 主要目的是借助第三方,比如Spring IOC容器实现具有依赖关系的对象之间的解耦,从而降低代码之间的耦合度Spring IOC容器: Spring IOC容器负责创建对象并将对象连接在一起,配置这些对象.从创建中处理这些对象的整个生命周期,直到对象被完全销毁 Spring IOC容器类似一个工厂 在创建对象时,只需要配置好配置文件或者是注解即可,不需要关注对象是如何创建的控制反转示例: 对象a依赖于对象b, 当对象a需要使用对象b时必须由对象a创建对象b的实例 引入IOC容器后,当对象a需要使用对象b时,可以指定IOC容器去创建一个对象b注入到对象a中 引入IOC容器之后,对象a获取对象b的过程,由主动行为变为被动行为实现了IOC原则的设计模式: 服务定位器模式ServiceLocator 工厂模式Factory 抽象工厂模式AbstractFactory 模板方法模式TemplateMethod 策略模式Strategy 依赖注入Depedency Inject依赖注入DI依赖注入DI: Dependency Inject 将实例变量传入到一个对象中去 是实现控制反转的一种设计模式工厂设计模式FactorySpring框架中BeanFactory和ApplicationContext类使用工厂模式创建Bean对象BeanFactory延迟注入,即使用到某个Bean时才会进行注入和ApplicationContext相比会占用更少的内存,程序启动速度更快ApplicationContext容器启动时就创建所有的Bean和BeanFactory相比 ,BeanFactory仅提供了最基本的依赖注入支持 . ApplicationContext扩展了BeanFactory, 除了BeanFactory的功能外还包含其余更多的功能,通常使用ApplicationContext创建BeanApplicationContext的三个实现类: ClassPathXmlApplication: 将上下文文件作为类路径资源 FileSystemXmlApplication: 从文件系统中的XML文件中载入上下文定义信息 XmlWebApplicationContext: 从Web系统中的XML文件中载入上下文定义信息单例设计模式SingletonSpring中的Bean的作用域默认就是单例Singleton的 . Spring中的Bean还可以定义以下作用域: prototype: 每次请求都会创建一个新的Bean实例 request: 每一次HTTP请求都会创建一个新的Bean实例,该Bean实例仅在当前HTTP request中有效 session: 每一次HTTP请求都会创建一个新的Bean实例,该Bean实例仅在当前HTTP session中有效Spring实现单例Bean的方式: xml的方式:  复制代码 注解的方式: @Scope(value="singleton") 复制代码Spring底层通过ConcurrentHashMap实现单例注册表来实现单例模式:// 通过线程安全的concurrentHashMap实现单例注册表 private final Map singletonObjects = new ConcurrentHashMap(64);  public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) { 	Assert.notNull(beanName, ""beanName" must not be null"); 	synchronized(this.singletonObjects) { 		// 检查缓存中是否存在实例 		Object singletonObject = this.singletonObjects.get(beanName); 		if (singletonObject == null) { 			... 			try { 				singleton = singletonFactory.getObject(); 			} 			... 			// 如果实例对象不存在,则将对象注册到单例注册表中 			addSingleton(beanName, singletonObject); 		} 		return (singletonObject != NULL_OBJECT ? singletonObject : null); 	} }  protected void addSingleton(String beanName, Object singletonObject) { 	synchronized(this.singletonObjects) { 		this.singletonObjects.put(beanName, (singletonObject != null ? singletonObject : NULL_OBJECT)); 	} } 复制代码代理设计模式ProxyAOP中的代理模式面向切面编程AOP: Aspect-Oriented Programming 面向切面编程能够将和业务无关,但是是业务模块中所共同调用的逻辑或者业务功能封装起来, 比如事务管理,日志管理,权限控制等 有利于减少重复代码,降低模块之间的耦合度,并有利于面向未来的可拓展性和可维护性 使用AOP可以将一些通用功能抽象出来,在需要使用的地方直接使用,这样可以大大简化代码量 需要增加新功能也会更加简单方便,这样可以提高系统的扩展性Spring AOP基于动态代理实现的: 代理对象实现了接口: Spring AOP会使用Java动态代理JDK Proxy创建代理对象 完成对象的代理操作 代理对象没有实现接口: Spring AOP会使用Cglib Proxy生成一个被代理对象的子类作为代理类完成对象的代理操作
  Spring AOP集成了AspectJ,AspectJ是Java中最为完整的AOP框架AspectJ和Spring AOP比较AspectJAspectJ是编译时增强AspectJ基于字节码操作Bytecode Manipluation实现AspectJ在切面较多的情况下要比Spring AOP的性能强很多Spring AOPSpring AOP是运行时增强Spring AOP基于代理Proxy实现Spring AOP中集成了AspectJSpring AOP比较简单,在切面比较少的情况下和AspectJ的性能相似模板方法模式TemplateMethod模板方法模式: 是一种行为型模式,基于继承的代码复用 定义一个操作的算法骨架,将一些实现步骤延迟到子类中 模板方法使得子类可以不改变一个算法结构的情况下即可重新定义算法的某些特定步骤的实现方式
  Spring中以Template结尾的类,比如jdbcTemplate等,都是使用了模板方法模式 通常情况下,都是使用继承来实现模板模式 在Spring中,使用了Callback与模板方法相结合的方式,既达到了代码复用的效果,又增加了系统的灵活性观察者模式Observer观察者模式: 是一种对象行为模式 表示的是一种对象和对象之间具有依赖关系,当一个对象发生改变,依赖于这个对象的对象也会发生改变Spring事件驱动模型就是基于观察者模式实现的 Spring事件驱动模型可以在很多应用场景中解耦代码 比如每次添加商品时都需要更新商品索引,这时就可以使用观察者模式Spring事件驱动模型Spring事件驱动模型包含三种角色: 事件Event角色 事件监听者Listener角色 事件发布者Publisher角色事件角色EventApplicationEvent: org.springframework.context 事件角色抽象类 继承java.util.Event并实现了java.io.Serializable接口Spring中默认存在以下事件,都是继承自ApplicationContext事件角色抽象类: ContextStartedEvent: ApplicationContext启动后触发的事件 ContextStoppedEvent: ApplicationContext停止后触发的事件 ContextRefreshedEvent: ApplicationContext初始化或者刷新后触发的事件 ContextClosedEvent: ApplicationContext关闭后触发的事件
  事件监听者角色ListenerApplicationListener: 事件监听者角色 ApplicationListener接口中定义了一个onApplicationEvent() 方法来处理ApplicationEvent. 只要实现onApplicationEvent() 方法即可完成监听事件@FunctionalInterface public interface ApplicationListener extends EventListener { 	void onApplicationEvent(E event); } 复制代码事件发布者角色PublisherApplicationEventPublisher: 事件发布者角色 ApplicationEventPublisher接口中定义了publishEvent() 方法来发布事件,这个方法在AbstractApplicationContext中实现 在AbstractApplicationContext中,事件是通过ApplicationEventMulticaster广播的@FunctionalInterface public interface ApplicationEventPublisher { 	default void publishEvent(ApplicationEvent event) { 		publishEvent((Object) event); 	}  	void publishEvent(Object event); } 复制代码Spring事件流程定义一个事件: 实现一个继承自ApplicationEvent的事件类,并写出相应的构造函数定义一个事件监听者: 实现ApplicationListener接口 重写onApplicationEvent() 方法使用事件发布者发布消息: 使用ApplicationEventPublisher的publishEvent() 方法 重写publishEvent() 方法发布消息Spring事件模型示例适配器模式Adapter适配器模式: 是结构型模式,也是各种结构型模式的起源 将一个接口转换为调用方需要的接口 适配器使得接口不兼容的类之间可以一起工作.适配器又被称为包装器WrapperSpring AOP中的适配器模式Spring AOP中的增强和通知Advice使用了适配器模式,接口是AdvisorAdapter常用的Advice类型包括: BeforeAdvice: 前置通知. 目标方法调用前增强 AfterAdvice: 后置通知. 目标方法调用后增强 AfterReturningAdvice: 目标方法执行结束之后 ,return之前每个通知Advice都有对应的拦截器: BeforeAdvice - MethodBeforeAdviceInterceptor AfterAdvice - MethodAfterAdviceInterceptor AfterReturningAdvice - MethodAfterReturningAdviceInterceptorSpring中预定义的通知要通过对应的适配器,适配成为MethodInterceptor接口类型的对象Spring MVC中的适配器模式Spring MVC中 ,DispatchServlet根据请求信息调用HanlderMapping, 解析请求对应的Handler, 解析到对应的Handler后,开始由HandlerAdapter适配器进行处理HandlerAdapter作为期望接口,具体的适配器实现类对具体目标类进行适配 .controller作为需要适配的类通过使用适配器AdapterHandler可以对Spring MVC中众多类型的Controller通过不同的方法对请求进行处理装饰器模式Decorator装饰器模式: 动态地给对象添加一些额外的属性或者行为 和继承相比,装饰器模式更加灵活装饰器模式使用场景: 当需要修改原有的功能,但是不想直接修改原有的代码,就可以设计一个装饰器Decorator类在原有的代码的外面,这样可以在不修改原有的类的基础上扩展新的功能Spring中配置DataSource时 ,DataSource可以是不同的数据库和数据源.为了在少修改原有类的代码下动态切换不同的数据源,这时就用到了装饰器模式Spring中含有Wrapper和含有Decorator的类都用到了装时期模式,都是动态地给一个对象添加一些额外的属性或者功能总结Spring框架中使用的设计模式:
  设计模式
  Spring框架
  工厂模式
  BeanFactory
  ApplicationContext
  单例模式
  Spring中的Bean
  代理模式
  Spring AOP
  模板方法模式
  Spring中以Template结尾的类
  观察者模式
  Spring事件驱动模型
  适配器模式
  Spring AOP中的AdvisorAdapter
  Spring MVC中的HandlerAdapter
  装饰器模式
  Spring中含有Wrapper和含有Decorator的类

C实现USB插拔检测Begin前言最近有学员咨询,如何实现串口设备的插拔检测。传统的方式是不断地通过SerialPort。GetPortNames方法获取所有串口,判断是否有变化。但是更合适的方式,应Java教程IterationTag接口使用教程在自定义标签的开发过程中,有时需要对标签体的内容进行重复处理,这时,可以使用IterationTag接口,它继承自Tag接口,在Tag接口基础上新增了一个EVALBODYAGAIN定时任务之elasticjob概述定时任务有哪些?Timer定时器ScheduledExecutorServiceSpring自带的ScheduledQuartz定时任务当当elasticjob定时任务Quartz面试官杠上重复消费消息堆积消息丢失顺序消息?消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360的刁难。面试官杠上消息队列?重复消费消息堆积消息丢失顺序消息什么zookeeper常用运维命令上一篇ZooKeeper集群部署流程zookeeper常用运维操作启动zookeeperzkServer。shstart关闭zookeeperzkServer。shstopzk客户科学家发现电子烟减害新证据电子烟相比卷烟可减害,已经是众所周知的了,那同为新型烟草的加热不燃烧产品和电子烟相比,哪个减害效果更好呢?近日,有科研人员已经对此做了研究电子烟加热不燃烧卷烟三类产品相比,电子烟的1999年电脑报发出的联想十问,原来早有人发现了问题1999年6月28日,电脑报在头版位置发表了署名采访文章。一问一答简洁明了,十问十答影响深远。每一个问题,可谓是切中要害遗憾的是,每一个解答都痛心疾首。联想集团放弃技术创新是公司高为什么药店越开越多,完全不受网购影响?药店的确越开越多,它的确给人们买药提供了方便。这是事实,所以,这些药店对百姓来说还是有相当好处的。我老伴下午收被子,被子几床,似乎拦住了视线。下一个台阶,不小心脚扭了一下。当时是一实体店和网上卖的电视机区别是什么?实体店和网上的彩电差距非常大。别的牌子不清楚,以海信为例,现在的海信彩电实体店款和电商款已经互相不通了,实体店买不到线上款,线上也买不到实体店款。可以说线上线下是不同生产线出来的产币圈的合约是不是变相的赌博?上文正是上世纪著名操盘手杰西罗利斯通利文摩尔(JesseLauristonLivermore)所描述的上世纪初交易市场的一点回忆。100多年过去了,正如他所说的华尔街不曾变过。口袋广州移动电信联通工作哪个比较好?本人非体制内,也没有在类似公司工作过,不过个人觉得移动吧,总体来说,三大运营商日子都不好过。移动吧,看着规模挺大的,但任务压力也大,自从携号转网开始,移动的收入基本上是走下坡路。如
马斯克盛赞中国工人勤奋称中国会出现一些非常强大的公司北京时间11日凌晨,特斯拉CEO马斯克周二赞扬中国工人,并表示相比之下,美国工人试图完全避免去上班。当被问及特斯拉在电动汽车行业的最大竞争对手是谁时,这位身为世界首富的企业家发表了重新定义旗舰机?摩托罗拉X30冠军版发布,主打性价比刚刚,老牌手机厂商摩托罗拉又搞事情了。摩托罗拉最新旗舰机型摩托罗拉X30冠军版正式发布,该机的发布,引起了全网的轰动。究竟摩托罗拉X30冠军版有哪些亮点值得外界如此关注呢?下面跟随Android13系统正式发布折叠屏OPPOFindN首批适配5月12日,谷歌举办IO2022开发者大会,正式发布Android13系统。OPPOFindN将会是全球首批适配Android13开发者预览版的折叠屏手机,极客玩机用户第一时间就能电信麦芒11今晚发布256GB2TB超大存储空间怎么说?手机中国新闻5月10日,正值麦芒10周年之际,麦芒将正式推出全新智能机麦芒11,新机发布会将于今晚708分召开。麦芒11手机中国了解到,麦芒这款新机或将刷新以往大众对麦芒手机的认识为啥安卓旗舰标配的2K屏幕,苹果愣是不愿意做?前几天托尼在办公室和同事们聊天,谈到了如今手机的发展。然后就发现了一个问题,目前国产手机的旗舰机型,基本都习惯宣称他们是2K屏幕(3216x1440)。像realmeGT2Pro小从京东卸任后,刘强东开始套现了京东怎么了?在刚刚过去的4月份,刘强东卸任,并将手中大部分的权利交给徐磊。但值得关注的是,刘强东卸任后不久,居然也开始套现了。那么,针对此次刘强东套现的行为我们怎么看呢?一刘强东套钉钉被曝裁员30?相关人士整体调整比例不到10鞭牛士5月12日消息,今日网络上有消息称,钉钉裁员开始,按员工口径比例达到30。钉钉官方对此未予置评。网络上流传的消息称,钉钉裁员开始,按员工口径比例达到30,可能为阿里集团今年为520送什么礼物好呢适合送女朋友的礼物推荐一年一度的520节日马上就来了,这种如此有爱的节日里怎么能少得了送礼物的仪式感?相信很多小伙伴在为对方选礼物的时候,都犯愁,纠结送什么好?是被琳琅满目的商品闪花了眼?还是在究竟送什互联网种养殖新模式中国是农业大国,拥有悠久的农业发展历史,农业在国民经济中占有非常重要的地位。百姓有粮,心中不慌国家有粮,天下安康农业是国泰民安的基础保障。粮油产业作为农业的一部分有着举足轻重的作用新诺基亚N72曝光2K曲屏7。1英寸,后置五颗摄像头还记得2006年诺基亚发布的诺基亚N73吗?它是手机圈首批拥有专属影像浏览键的机型,在当时被誉为行走的口袋相簿,深受年轻用户的喜爱,以至于诺基亚在来年又加推了诺基亚N73探索版。没从3199跌至2249元,曲面屏72万跑分1亿像素,vivo拒绝高价低配vivo在中国市场销量很好,在今年第一季度市场份额排名第一,很多网友吐槽高价低配智商鉴定机厂妹机但是不得不说,销量那么好,证明产品的品质和体验肯定是不差的。vivo有X系列S系列,