您好!欢迎来到爱源码

爱源码

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

春季九大经典设计图案一定要记住。 {互站网}

  • 时间:2022-07-09 00:15 编辑: 来源: 阅读:268
  • 扫一扫,手机访问
摘要:春季九大经典设计图案一定要记住。 {互站网}
Spring 1中涉及的设计模式总结。简单工厂(不是23种设计模式之一)实现:BeanFactory Spring中的BeanFactory是工厂方法模式的表现。Bean对象是根据传入的唯一标识符获得的,但是否可以在传入参数之后或之前创建取决于具体情况。 本质:工厂类根据传入的参数动态决定应该创建哪个产品类。 实现原理:bean容器启动阶段:读取bean的xml配置文件,将bean元素转换成BeanDefinition对象。 然后,这些bean通过BeanDefinitionRegistry注册到beanFactory中,并存储在它一个ConcurrentHashMap中。 在向beanFactory注册了BeanDefinition之后,这里Spring为我们提供了一个扩展的切口,允许我们通过实现接口BeanFactoryPostProcessor在这里插入我们定义的代码。 一个典型的例子就是:PropertyPlaceholderConfigurer,这是我们通常在配置数据库的数据源时使用的占位符的值,它被注入其中。 容器bean的实例化阶段:实例化阶段主要是通过反射或者CGLIB实例化bean。在这个阶段,Spring为我们暴露了很多扩展点:各种Aware接口,比如BeanFactoryAware。对于实现了这些Aware接口的bean,Spring将帮助我们在实例化bean时注入相应的BeanFactory实例。 BeanPostProcessor接口,它实现了BeanPostProcessor接口的bean。在实例化bean时,Spring会为我们调用接口中的方法。 InitializingBean接口,实现InitializingBean接口的Bean。当实例化bean时,Spring将帮助我们调用接口中的方法。 DisposableBean接口,一个实现BeanPostProcessor接口的Bean。当bean死亡时,Spring将为我们调用接口中的方法。 设计意义:松耦合 我们可以将原来硬编码的依赖项注入到Spring beanFactory的工厂中,也就是说,只有依赖方和被依赖方。现在,我们引入了第三方Spring beansFactory,可以处理bean之间的依赖关系,从而达到松耦合的效果。豆子的附加溶液 通过spring接口的暴露,我们可以在实例化bean的阶段做一些额外的解决方案。这些额外的解决方案只需要让bean实现相应的接口,然后Spring会调用我们实现的接口在bean的生命周期内解决bean。 【非常重要】2。工厂方法的实现:FactoryBean接口 实现原理:实现FactoryBean接口的Bean是一种叫做factory的bean。 其特点是spring在调用getBean()获取Bean时会自动调用bean的getObject()方法,所以返回的不是工厂的bean,而是bean.getOjbect()方法的返回值。 例子:典型的例子是spring和mybatis的组合。 代码示例:描述:我们来看看上面的bean。因为实现了FactoryBean接口,所以返回的不是SqlSessionFactoryBean的实例,而是其SqlSessionFactoryBean . getobject()的返回值 3.默认情况下,单例模式Spring依赖注入Bean实例是单例的。 Spring的依赖注入(包括lazy-init模式)发生在AbstractBeanFactory的getBean中。 GetBean的doGetBean方法调用getSingleton来创建Bean。 Parse getSingleton()方法公共对象get singleton(string bean name){//Parameter true设置标志允许早期依赖返回getsingleton (beanname,true);}保护对象Get Singleton (String Beanname,Boolean allowarelyreference){//检查缓存中是否有实例对象Singleton objects = this . Singleton objects . Get(bean name);if(singleton object = = null & amp;& ampISSLETONCURENT Lin creation(bean name)){//如果为空,则锁定全局变量并求解。 synchronized(this . single objects){//如果正在加载此bean,则不会解析singletobjects = this . earlysingletobjects . get(bean name);if(singleton object = = null & amp;& ampallowarelyreference){//当某些方法需要提前初始化时,会调用addSingleFactory方法在singleton factors objectfactory <?& gtsingleton factory = this . singleton factories . get(bean name);if (singletonFactory!= null) {//调用预置的getObject方法singleton object = singleton factory . getObject();//记录在缓存中,earlysingletonObjects和singletonFactories互斥this . earlysingletobjects . put(bean name,singleton object);this . singleton factories . remove(bean name);} } } } return (singletonObject!= NULL_OBJECT?singleton object:null);}getSingleton()流程图PS: Spring依赖注入,双判带锁的Singleton模式用来总结singleton模式的定义:保证一个类只有一个实例,并提供一个全局访问点来访问它。 spring singleton的实现:spring中的singleton模式完成了后半句,它提供了全局访问点BeanFactory。 然而,singleton不是从构造函数级别控制的,因为spring管理任意的java对象。 4.SpringMVC中适配器模式的实现:adapter HandlerAdatper 实现原理:HandlerAdatper根据处理程序规则执行不同的处理程序。 实现过程:DispatcherServlet根据HandlerMapping返回的处理程序向HandlerAdatper发送请求,求解处理程序。 HandlerAdapter根据规则找到相应的处理程序,并让它执行。执行后,handler会向HandlerAdapter返回一个ModelAndView,最后HandlerAdapter会向DispatchServelet返回一个ModelAndView。 实现意义:HandlerAdapter使Handler的扩展变得很容易,只需添加一个新的Handler和一个对应的HandlerAdapter即可。 所以Spring定义了一个适配器接口,让每个控制器都有一个对应的适配器实现类,适配器可以代替控制器执行对应的方法。 这样,在扩展控制器时,只需添加一个适配器类,就完成了SpringMVC的扩展。 5.如何实现装饰器模式:Spring中使用的包装器模式在类名中有两种表现形式:一是类名中的包装器,二是类名中的装饰器。 本质:动态地给一个对象增加少量额外的职责。 就添加函数而言,装饰器模式比生成子类更灵活。 6.代理模式的实现:AOP的底层是动态代理模式的实现。 动态代理:内置在内存中,不需要手动编写代理类。静态代理:需要手工编写代理类,代理类指的是代理对象。 实现原理:切面是在应用程序运行的瞬间织成的。 一般来说,当织入切面时,AOP容器会为目标对象创建一个动态代理对象。 这样,SpringAOP就织进了平面。 编织:将切割曲面应用到目标对象并创建新代理对象的过程。 7.观察者模式的实现:spring的事件驱动模型使用了观察者模式,观察者模式在Spring中常见的地方就是listener的实现。 实现:事件机制的实现需要三个部分:事件源、事件和事件监听器。通用类[event]继承自jdk的EventObject,所有事件都需要继承自ApplicationEvent。事件源通过构造函数参数源获得。此类的实现类ApplicationContextEvent表示ApplicaitonContext的容器事件。代码:公共抽象类应用事件扩展event object { private static final long serialVersionUID = 7099057708183571937 l;私有最终长时间戳;public ApplicationEvent(对象源){ super(源);this . timestamp = system . current time millis();} public final long getTimestamp(){ return this . timestamp;}}ApplicationListener接口[EventListener]继承自jdk的EventListener,所有的监听器都必须实现这个接口。 该接口只有一个onApplicationEvent()方法,该方法接受ApplicationEvent或其子类对象作为参数。在方法体中,可以通过对事件类的不同判断做出相应的解决方案。 当事件被触发时,所有侦听器都会收到一条消息。 代码:公共接口应用程序侦听器;扩展event listener { void on application event(E event);} ApplicationContext接口【事件源】ApplicationContext是spring中的一个全局容器,翻译过来就是“应用上下文” 实现了ApplicationEventPublisher接口。 职责:负责读取bean的配置文档,管理bean的加载,维护bean之间的依赖关系。可以说是负责了beans的整个生命周期,简单的叫IOC容器。 代码:公共接口applicationeventpublisher { void publish event(应用事件事件);} public void publish Event(application Event事件){ Assert.notNull(event,“事件不得为空”);if(logger . istrace enabled()){ logger . trace("发布事件in " + getDisplayName() + ": " +事件);} getApplicationEventMulticaster()。multicastEvent(事件);如果(this.parent!= null){ this . parent . publish event(事件);} } } } ApplicationEventMulticaster泛型类【事件源中的publishEvent方法需要调用其方法GetApplicationEventUltimate】属于事件广播器,其作用是将Applicationcontext发布的事件广播给所有监听器。代码:公共抽象类抽象应用程序上下文扩展默认ResourceLoader实现可配置的A Application Context,disposable bean { private ApplicationEventMulticaster ApplicationEventMulticaster;protected void Register listeners(){//首先注册静态指定的侦听器。for(application listener & lt;?& gtlistener:getApplicationListeners()){ getApplicationEventMulticaster()。addApplicationListener(监听器);} //这里不要初始化FactoryBeans:我们需要让所有常规bean//不初始化,以便让后处理器应用于它们!string[]listener bean names = getBeanNamesForType(application listener . class,true,false);for(String lisName:listener bean names){ getApplicationEventMulticaster()。addApplicationListenerBean(lis name);}} }8.策略模式的实现:Spring框架的资源访问资源接口。 这个接口提供了更强的访问资源的能力,Spring框架本身也大量利用了资源接口来访问底层资源。 接口细节源接口是特定资源访问策略的概括,也是所有资源访问类实现的接口。 资源接口主要提供以下方法:getInputStream():定位并打开资源,返回资源对应的输入流。 每个调用返回一个新的输入流。 调用者必须负责关闭输入流。 Exists():返回资源所指向的资源是否可以存在。 Is():返回资源文件是否可以打开。如果不能重复读取资源文件,则应该在每次读取结束时显式关闭它,以防止资源泄漏。 GetDescription():返回资源的描述信息,通常用于在资源解决错误时输出此信息,通常是完全限定的文件名或实际的URL。 GetFile:返回资源对应的文件对象。 GetURL:返回资源对应的URL对象。 后两种方法通常不需要使用。只有在无法实现简单访问时,Resource才提供传统的资源访问功能。 资源接口本身不提供访问任何底层资源的实现逻辑。对于不同的底层资源,Spring会提供不同的资源实现类,不同的实现类负责不同的资源访问逻辑。 为Spring资源接口提供了以下实现类:UrlResource:用于访问网络资源的实现类。 ClassPathResource:访问类加载路径中资源的实现类。 FileSystemResource:访问文件系统中资源的实现类。 ServletContextResource:访问ServletContext路径中的资源的实现类。InputStreamResource:访问输入流资源的实现类 ByteResource:访问ByteArrayResource的实现类。 这些资源实现类,针对不同的底层资源,提供相应的资源访问逻辑,并提供方便的封装,方便客户端程序的资源访问。 9.模板方法模式经典模板方法定义:父类定义骨架(调用哪些方法以及顺序),一些具体方法由子类实现。 最大的好处:代码复用,减少重复代码。 除了具体的方法要由子类实现,其余的方法及其调用顺序都是事先写在父类中的。 所以父类模板方法有两种:通用方法:所有子类使用的代码不同的方法:子类要覆盖的方法,分为两种:通用方法:父类中的通用方法,子类必须覆盖的钩子方法:父类中的空方法,子类继承默认的空方法。注:为什么叫钩子?子类可以通过这个钩子(方法)控制父类,因为这个钩子实际上是父类的方法。Spring模板方法模式的本质:是模板方法模式和回调模式的结合,是模板方法的另一种不需要继承的实现方法。 几乎所有Spring的外部扩展都采用这种模式。 实现:JDBC的通用性和Hibernate的集成都采用了一个概念或解决方案,即模板方法模式与相应的回调接口相结合。 采用模板方法模式,统一集中解决资源获取和发布问题。以JdbcTempalte为例:公共抽象类JDBC模板{公共最终对象execute(string SQL){ connection con = null;语句stmt = null请尝试{ con = getConnection();stmt = con . create statement();object ret value = executeWithStatement(stmt,SQL);返回retValue}catch(SQLException e){...} finally { close statement(stmt);release connection(con);} }受保护抽象对象executeWithStatement(语句stmt,字符串SQL);}引入回调的原因:JdbcTemplate是一个通用类,不能独立使用。每次访问数据都要给出对应的子类实现,不方便,所以引入了回调。 代码公共接口语句回调{ object do with statement(statement stmt);}覆盖JdbcTemplate方法公共类JDBC模板{public final object execute(语句回调回调){ connectioncon = null语句stmt = null请尝试{ con = getConnection();stmt = con . create statement();object ret value = callback . dowith statement(stmt);返回retValue}catch(SQLException e){...} finally { close statement(stmt);release connection(con);}} ...//其他方法定义} Jdbc的用法如下:JdbcTemplate jdbcTemplate=...;最终字符串sql=...;Statement callback callback = new Statement callback(){ public Object = dowith Statement(语句stmt){ return...;} } jdbcTemplate.execute(回调);JdbcTemplate为什么不使用继承?这个类的方法太多了,但是我们还是想使用JdbcTemplate现有的稳定的公共数据库连接。那么我们该怎么办呢?我们可以把改变的东西提取出来作为参数,传递给JdbcTemplate的方法。 但是改变的是一段代码,这段代码会用到JdbcTemplate中的变量。 我该怎么办?让我们使用回调对象。 在这个回调对象中,定义一个方法来操作JdbcTemplate中的变量。当我们实现这个方法时,我们将把改变的东西集中在这里。 然后我们将这个回调对象传递给JdbcTemplate,这样就完成了调用。


  • 全部评论(0)
资讯详情页最新发布上方横幅
最新发布的资讯信息
【技术支持|常见问题】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)
【技术支持|常见问题】别告诉我你没看过邰方这两则有思想的创意广告! (2022-11-04 10:37)

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