您好!欢迎来到爱源码

爱源码

热门搜索: 抖音快手短视频下载   

Java高级核心知识综合分析——常用框架(Spring)使用了哪些设计模式?) 《源代码交易》

  • 时间:2022-07-07 01:21 编辑: 来源: 阅读:329
  • 扫一扫,手机访问
摘要:Java高级核心知识综合分析——常用框架(Spring)使用了哪些设计模式?) 《源代码交易》
1.控制反转(IoC)和依赖注入(DI)IoC(控制反转)是Spring中一个非常非常重要的概念。它不是一种技术,而是一种解耦设计思想。 其主要目的是通过一个“第三方”(Spring中的IOC容器)的方式实现具有依赖关系的对象之间的解耦(IOC很容易管理对象,你直接用就可以了),从而降低代码之间的耦合度。 国际奥委会是一个标准,而不是一种模式。以下模式(但不限于)实现了IOC标准。 Spring IOC容器就像一个工厂。当我们需要创建一个对象时,我们只需要配置配置文件/注释,而不管对象是如何创建的。 IOC容器负责创建对象,将对象连接在一起,配置对象,解决这些对象从创建到完全销毁的整个生命周期。 在实际项目中,如果一个服务类有几百个甚至上千个类作为底层,我们需要实例化这个服务,你可能每次都要搞清楚这个服务所有底层的构造函数,这可能会把人逼疯。 如果使用IOC,只需要配置好,然后在需要的地方引用,大大增加了项目的可维护性,降低了开发难度。 你怎么知道flip的?比如:“对象A依赖于对象B,当对象A需要使用对象B时,必须自己创建。” 然而,当IOC容器被引入系统时,对象A和对象B失去了之前的直接联系。 这时,当对象A需要使用对象B时,我们可以指定IOC容器创建一个对象B,并将其注入到对象A中。” 对象A获得对对象B的依赖的过程由主动行为变为被动行为,控制权反过来。这就是控制反转这个名字的由来。 DI(依赖注入)是一种实现控制反转的设计模式,依赖注入是将实例变量转移到一个对象中。 其次,工厂设计模式Spring使用工厂模式通过BeanFactory或ApplicationContext创建bean对象。 两者比较:BeanFactory:延迟注入(只有在使用bean的情况下才会执行注入),这样比ApplicationContext占用内存更少,启动程序更快。 ApplicationContext:当容器启动时,立即创建所有bean,不管您是否使用它们。 BeanFactory只为依赖注入提供最基本的支持。ApplicationContext扩展了BeanFactory,除了BeanFactory的还有更多功能,所以一般开发者会更多的使用ApplicationContext。 ApplicationContext的三个实现类:ClassPathXmlApplication:将上下文文件视为类路径资源。 FileSystemXmlApplication:从文件系统中的XML文件加载上下文定义信息 XmlWebApplicationContext:从Web系统中的XML文件加载上下文定义信息 示例:导入org . spring framework . context . application context;import org . spring framework . context . support . file systemxmlaplicationcontext;public class App { public static void main(String[]args){ application context context = new file systemxmlaplicationcontext(" C:/work/IOC Containers/spring framework . application context/src/main/resources/bean-factory-config . XML ");hello application context obj =(hello application context)context . get bean(" hello application context ");obj . getmsg();}}三。单实例设计模式在我们的系统中,有几个对象。其实我们只需要一个,比如:线程池、缓存、对话框、注册表、日志对象,以及充当打印机、显卡等设施驱动的对象。 事实上,这种对象只能有一个实例。如果创建多个实例,可能会导致少数问题,如程序行为异常、资源使用过度或开发人员不一致的结果。 使用singleton模式的优点:对于经常使用的对象,可以省略创建对象所花费的时间,对于那些重量级对象来说,这是相当大的系统开销;因为新操作的数量减少了,使用系统内存的频率也会减少,这样会减轻GC的压力,缩短GC的暂停时间。 Spring bean的默认作用域是singleton(单例)。 除了singleton作用域,Spring中的bean还有以下作用域:prototype:每个请求都创建一个新的bean实例。 请求:每个HTTP请求都会生成一个新的bean,这个bean只在当前的HTTP请求中有效。 会话:每个HTTP请求都会生成一个新的bean,这个bean只在当前的HTTP会话中有效。 Global-session:全局会话范围只在基于portlet的web应用程序中有意义,Spring5已经不存在了。 Portlet是小型Java Web插件,可以生成语义代码片段(例如,HTML) 基于portlet容器,他们可以像servlet一样解决HTTP请求。 然而,与servlet不同,每个portlet都有不同的方式来实现会话Spring中的单件:XML:< bean id = " userService " class = " top . snail climb . userService " scope = " singleton "/& gt;注意:@ scope(value = " singleton ")Spring通过ConcurrentHashMap这种特殊的方式来实现singleton模式,实现singleton注册表。 Spring singleton的核心代码如下。singleton注册表私有最终映射< String,Object & gtsingleton objects = new concurrent hashmap & lt;字符串,对象& gt(64);公共对象getSingleton(String beanName,ObjectFactory & lt?& gtsingleton factory){ assert . not null(beanName," ' bean name '不得为null ");synchronized(this . singleton objects){//检查缓存中是否有实例objectsingleton object = this . singleton objects . get(bean name);If (singletonObject == null) {//...很多代码都省略了try { singleton object = singleton factory . getobject();}//...省略了很多代码。//如果实例对象不存在,我们会在singleton注册表中注册。 addSingleton(beanName,singleton object);} return (singletonObject!= NULL_OBJECT?singleton object:null);} }//将对象添加到singleton注册表受保护的void Add singleton(string bean name,object singleton object){ synchronized(this . singleton objects){ this . singleton objects . put(bean name,(singleton object!= null?singleton OBJECT:NULL _ OBJECT));}}}四。代理设计模式1。AOP中代理模式的应用AOP(面向方面编程)可以封装逻辑或职责(如事务解析、日志管理、权限控制等。)与业务无关但通常由业务模块调用,便于减少系统的重复代码,降低模块间的耦合度,有利于以后的可扩展性和可维护性。 Spring AOP是基于动态代理的。如果代理的对象实现了一个接口,那么Spring AOP将使用JDK代理来创建代理对象,但是对于没有实现接口的对象,它不能使用JDK代理来充当代理。这个时候Spring AOP就会使用Cglib。这时候Spring AOP会使用Cglib生成agent对象的一个子类作为代理,如下图所示:当然也可以使用AspectJ,AspectJ已经集成到Spring AOP中,AspectJ应该算是Java生态系统中最完整的AOP框架了。 使用AOP后,我们可以归纳出几个通用函数,在需要的地方直接使用,大大简化了代码量。 当我们需要添加新功能时也很方便,这也提高了系统的可扩展性。 AOP用于日志功能、事务管理和其他场景。 2.2有什么区别。Spring AOP和AspectJ AOP?Spring AOP是运行时增强,而AspectJ是编译时增强。 Spring AOP基于代理,而AspectJ基于字节码操作。 Spring AOP集成了AspectJ,应该算是Java生态中最完整的AOP框架了。 AspectJ比Spring AOP更强大,但是Spring AOP相对简单。如果我们有更少的方面,它们之间的性能差异很小。 但是当面太多的时候,最好选择AspectJ,比Spring AOP快很多。 5.模板方法模板方法模式(Template method pattern)是一种行为设计模式,它定义了一个算法在运算中的骨架,并向子类延迟了几步。 模板方法使子类能够在不改变算法结构的情况下,重新定义算法某些特定步骤的实现。 Public抽象类Template {//这是我们的模板方法public final void Template method(){ primitiveoperation 1();primitive operation 2();primitive operation 3();}受保护的void原语操作1(){//当前类实现}//子类实现的方法受保护的抽象void原语操作2();受保护的抽象void primitive operation 3();} public class template impl extends template { @ override public void primitive operation 2(){//current class implementation } @ override public void primitive operation 3(){//current class implements } } JDBC Template、hibernateTemplate等Spring中以Template结尾并对数据库进行操作的类,它们使用的是Template模式。 一般我们都是用继承来实现模板模式,但是Spring没有用这种方法,而是用回调模式配合模板方法模式,既达到了代码重用的效果,又增加了灵活性。 不及物动词观察者模式观察者模式是一种对象行为模式。 意味着对象之间存在依赖关系,当一个对象发生变化时,它所依赖的对象也会做出反应。 Spring事件驱动模型是观察者模型的经典应用。 Spring事件驱动模型非常有用,可以在很多场景中解耦我们的代码。 比如我们每增加一次商品,就需要再次升级商品指数。这时,我们可以使用观察者模式来处理这个问题。 1.1中的三个角色。Spring事件驱动模型1)事件角色applicationevent(在org.springframework.context的包下)充当事件的角色,是一个继承java.util.EventObject并实现java.io.Serializable接口的通用类。 Spring默认存在以下事件,都是ApplicationContextEvent的实现(继承自ApplicationContextEvent):ContextStarteEvent:应用上下文启动后触发的事件;ContextStoppedEvent:应用程序上下文中止后触发的事件;刷新事件:应用上下文初始化或刷新完成后触发的事件;ContextCloseEvent:应用程序上下文关闭后触发的事件。 2)事件监听器角色ApplicationListener扮演事件监听器的角色,是一个只定义了一个onApplicationEvent()方法来解决ApplicationEvent的接口。 ApplicationListener接口类的源代码如下。可以看出,接口定义和接口中的事件只需要实现ApplicationEvent即可。 所以在Spring中,我们只需要实现ApplicationListener接口和onApplicationEvent()方法就可以完成对事件package org . Spring framework . context的监控;导入Java . util . event listener;@FunctionalInterface公共接口应用程序监听器& lte扩展应用程序事件& gt扩展event listener { void on application event(E var 1);}3)事件发布者角色ApplicationEventPublisher作为事件的发布者,同时也是一个接口。 @FunctionalInterface公共接口ApplicationEventPublisher {默认void publish event(application event事件){ this.publishEvent((Object)事件);} void publishEvent(对象var 1);ApplicationEventPublisher接口的publishEvent()方法在AbstractApplicationContext类中实现。阅读这个方法的实现,你会发现事件实际上是通过ApplicationEventPublisher广播的。 具体内容太多,这里就不分析了。稍后我可能会单独写一篇文章来提及它们。 2.总结2的事件流程。Spring并定义一个事件:实现一个继承自ApplicationEvent的事件,并编写相应的构造函数;定义一个事件侦听器:实现ApplicationListener接口并重写onApplicationEvent()方法;使用事件发布器发布消息:可以通过ApplicationEventPublisher的publishEvent()方法发布消息。 示例://定义一个从ApplicationEvent继承的事件并编写相应的构造函数,Public Class Demo Event Extensions Application Event { Private Static Final Long SerialVersionUID = 1l;私有字符串消息;public DemoEvent(对象源,字符串消息){ super(源);this.message = message} public String getMessage(){ return message;}//定义一个事件侦听器,实现ApplicationListener接口,并重写onApplicationEvent()方法;@Component公共类DemoListener实现ApplicationListener & ltDemoEvent & gt{//使用onApplicationEvent接收消息@ override public void on application event(demo event事件){ string msg = event . getmessage();System.out.println("收到的信息是:"+msg ");} }//发布事件,可以通过ApplicationEventPublisher的publishEvent()方法发布消息。 @Component公共类demo publisher { @ Autowired application context application context;void publish(string message){//发布事件application context . publish event(新演示事件(this,message));}}调用DemoPublisher的publish()方法,比如demoPublisher.publish ("Hello "),控制台会打印出来:收到的消息是:Hello。 七。适配器模式适配器模式将一个界面转换成用户需要的另一个界面。适配器模式使那些接口不兼容的类能够协同工作,它的别名是包装器。 1.Spring AOP中的适配器模式。我们知道spring AOP的实现是基于代理模式的,但是Spring AOP的增强或者说建议使用的是适配器模式,相关的接口是AdvisorAdapter。 常用的通知类型有:BeforeAdvice(调用目标方法之前的预通知)、AfterAdvice(调用目标方法之后的后通知)、AfterReturningAdvice(执行目标方法之后,返回之前)等等。 每种类型的通知(通知)都有相应的拦截器:MethodBeforeAdviceInterceptor、AfterReturningAdviceAdapter、afterreturningadviceinterceptor。 Spring预留含义的通知要通过相应的适配器适配MethodInterceptor接口(method blocker)类型的对象(例如MethodBeforeAdviceInterceptor负责适配MethodBeforeAdvice)。 2.Spring MVC中的适配器模式在Spring MVC中,DispatcherServlet根据请求信息调用HandlerMapping,解析请求对应的处理程序。 解析到对应的Handler(也就是我们通常所说的Controller控制器)后,由HandlerAdapter求解。 HandlerAdapter是预期的接口,具体的适配器实现类用来适配目标类,Controller是需要适配的类。 为什么在Spring MVC中使用适配器模式?Spring MVC中有很多种控制器,不同类型的控制器使用不同的方法来解决请求。 如果不使用适配器模式,DispatcherServlet可以直接获取对应类型的控制器,需要自己判断。比如下面的代码:if(映射的处理程序。MultiActionController的GetHandler()实例){((MultiActionController)映射的处理程序。GetHandler())。xxx} Elseif(映射的处理程序。XXX的GetHandler()实例){...} Elseif(...) {...}如果我们添加另一个控制器类型,我们就要在上面的代码中添加另一个判断语句。这种形式使得程序很难维护,也违反了设计模式中的开闭规则——展开关闭修改。 八。装饰模式(Decorator mode)装饰模式可以动态地向对象添加少量的附加属性或行为。 与使用继承相比,装饰器模式更加灵活。 简单来说,当我们需要修改原函数,但又不想直接修改原代码时,就设计一个装饰器来覆盖原代码。 实际上,在JDK有很多地方使用装饰模式,比如InputStream家族。InputStream类下还有FileInputStream(读取文件)和BufferedInputStream(添加缓存大大提高读取文件的速度)等子类,都是在不修改InputStream代码的情况下扩展了它的功能。 在Spring中配置DataSource时,DataSource可能是不同的数据库和数据源。 我们是否在对原类代码修改较少的情况下,根据用户需求动态切换不同的数据源?这就是使用装饰器模式的时候了(我自己也不知道这个的具体原理)。 Spring中使用的包装器模式在类名中包含包装器或装饰器。 这些类基本上动态地给一个对象增加了少量额外的职责。九。总结一下Spring框架中使用了哪些设计模式?工厂设计模式:Spring使用工厂模式通过BeanFactory和ApplicationContext创建bean对象。 代理设计模式:Spring AOP功能的实现 Singleton设计模式:默认情况下,Spring中的Bean是singleton的。 模板模式:jdbcTemplate,hibernateTemplate等Spring中以Template结尾,对数据库进行操作的类都使用模板模式。 包装器设计模式:我们的项目需要连接多个数据库,不同的用户在每次访问时会根据自己的需求访问不同的数据库。 这种模式允许我们根据用户的需求动态切换不同的数据源。 观察者模式:Spring事件驱动模型是观察者模式的经典应用。 适配器模式:适配器模式用在Spring AOP的加强或建议中,适配器模式也用在spring MVC中来适配控制器。 欢迎补充!!!参考:《Java高级核心知识综合解析》如何获取:私信【资料】免费获取。还有更多Java PDF学习资料等你来拿!!!


  • 全部评论(0)
资讯详情页最新发布上方横幅
最新发布的资讯信息
【域名/主机/服务器|】qq邮箱提醒在哪里打开(2024-06-04 18:58)
【技术支持|常见问题】1556原创ng8文章搜索页面不齐(2024-05-01 14:43)
【技术支持|常见问题】1502企业站群-多域名跳转-多模板切换(2024-04-09 12:19)
【技术支持|常见问题】1126完美滑屏版视频只能显示10个(2024-03-29 13:37)
【技术支持|常见问题】响应式自适应代码(2024-03-24 14:23)
【技术支持|常见问题】1126完美滑屏版百度未授权使用地图api怎么办(2024-03-15 07:21)
【技术支持|常见问题】如何集成阿里通信短信接口(2024-02-19 21:48)
【技术支持|常见问题】算命网微信支付宝产品名称年份在哪修改?风水姻缘合婚配对_公司起名占卜八字算命算财运查吉凶源码(2024-01-07 12:27)
【域名/主机/服务器|】帝国CMS安装(2023-08-20 11:31)
【技术支持|常见问题】通过HTTPs测试Mozilla DNS {免费源码}(2022-11-04 10:37)

联系我们
Q Q:375457086
Q Q:526665408
电话:0755-84666665
微信:15999668636
联系客服
企业客服1 企业客服2 联系客服
86-755-84666665
手机版
手机版
扫一扫进手机版
返回顶部