Java面试题总结 | Java面试题总结10- Feign和设计模式模块(持续更新)

文章目录

  • Feign
    • 项目中如何进行通信
      • Feign原理简述
  • 设计模式
    • spring用到的设计模式
    • 项目的场景中运用了哪些设计模式
    • 写单例的时候需要注意什么
    • 工厂模式的理解
    • 设计模式了解么
      • 工厂设计模式
      • 单例设计模式
      • 代理设计模式
      • 策略模式
      • **模板方法模式**
      • 观察者模式
      • **适配器模式**
      • 观察者模式
      • **适配器模式**

Feign

项目中如何进行通信

在调用模块的启动类上添加 @EnableFeignCleints 注解,以及@EnableDiscoveryClient

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jYU2Tmn4-1683165926603)(D:/学习/JAVA/面经/面试题整理版本.assets/image-20220909084447460.png)]

然后再配置文件中,将他的服务注册到nacos中;

把所有被调用的类集成下一个模块中,接下来创建一个被调用的类,在这个类上添加注解@FeignClient(value = “service-cmn”),在value中写入被调用的服务名称,将调用的方法复制过来,写成接口的形式,然后在Maping注解中,将完整的接口地址写入;接下来在调用的模块将被调用的模块注入进入;

继续深入看一下注解内部都做了什么。注解内部的方法就不说明了,不加会有默认的配置

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(FeignClientsRegistrar.class)
public @interface EnableFeignClients {...}

前三个注解看着平平无奇,重点在第四个 @Import 上,一般使用此注解都是想要动态注册 Spring Bean 的

花一个周末,掌握 SpringCloud OpenFeign 核心原理 - 知乎 (zhihu.com)

Feign原理简述

  • 通过 @EnableFeignCleints 注解启动 Feign Starter 组件
  • Feign Starter 在项目启动过程中注册全局配置,扫描包下所有的 @FeignClient 接口类,并进行注册 IOC 容器
  • @FeignClient 接口类被注入时,通过 FactoryBean#getObject 返回动态代理类
  • 接口被调用时被动态代理类逻辑拦截,将 @FeignClient 请求信息通过编码器生成 Request
  • 交由 Ribbon 进行负载均衡,挑选出一个健康的 Server 实例
  • 继而通过 Client 携带 Request 调用远端服务返回请求响应
  • 通过解码器生成 Response 返回客户端,将信息流解析成为接口返回数据

主程序入口添加了@EnableFeignClients注解开启对FeignClient扫描加载处理。根据Feign Client的开发规范,定义接口并加@FeignClientd注解。

当程序启动时,会进行包扫描,扫描所有@FeignClients的注解的类,并且将这些信息注入Spring IOC容器中,当定义的的Feign接口中的方法被调用时,通过JDK的代理方式,来生成具体的RequestTemplate.

当生成代理时,Feign会为每个接口方法创建一个RequestTemplate。当生成代理时,Feign会为每个接口方法创建一个RequestTemplate对象,该对象封装了HTTP请求需要的全部信息,如请求参数名,请求方法等信息都是在这个过程中确定的。

然后RequestTemplate生成Request,然后把Request交给Client去处理,这里指的是Client可以是JDK原生的URLConnection,Apache的HttpClient,也可以是OKhttp,最后Client被封装到LoadBalanceClient类,这个类结合Ribbon负载均衡发起服务之间的调用。

总结:

在调用的微服务模块上加上@EnableFeignClients,启动微服务时,通过@EnableFeignClients注解去启动Feign stater 扫描所有的@FeignClient注解类,将这些类注册到IOC容器中,通过JDK动态代理的方式,来生成具体RequestTemplate对象,该对象封装了@FeignClient请求的全部信息,RequestTemplate对象生成request交给Rabbion进行负载均衡,Rabbin挑选出一个健康的server实例,去完成请求返回响应;

设计模式

spring用到的设计模式

  • 工厂模式:BeanFactory /ApplicationContext就是简单工厂模式的体现,用来创建对象的实例;
  • 单例模式:Bean 默认为单例模式。
  • 代理模式:能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码降低模块间的耦合度,并有利于未来的可拓展性和可维护性
  • 模板方法:用来解决代码重复的问题。比如. RestTemplate,jdbcTemplate, JpaTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式

项目的场景中运用了哪些设计模式

登陆功能-用到了策略模式

策略模式(Strategy Pattern)也叫政策模式,是一种比较简单的模式。它的目的是定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换,使得算法可以在不影响到客户端的情况下发生变化。

用户下单-用到了观察者模式

观察者模式(Observer Pattern)也称发布订阅模式,它的目的是定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。

连接数据库使用的是-单例模式

权限管理-代理模式

代理模式是通过代理对象访问目标对象,这样可以在目标对象基础上增强额外的功能,如添加权限,访问控制和审计等功能。

写单例的时候需要注意什么

  1. 单例模式保证了系统内存中该例只存在一个对象,节省了系统资源,使用单例模式可以提高系统性能
  2. 当要实例化一个单例对象的时候,要使用相应的获取对象的方法而不是new
  3. 单例模式使用的场景:需要频繁的进行创建和销毁的对象、创建对象时耗时过多或耗费资源过多(即:重量级对象),但又经常用到的对象、工具类对象、频繁访问数据库或文件的对象(比如数据源、session工厂等)

工厂模式的理解

工厂模式顾名思义就是用来生产对象的,在java中,万物皆对象,有很多多想需要创建如果创建一个对象就new该对象,会对该对象耦合严重,如果需要更换该对象,就要把用到该对象的地方全都更改

如果使用工厂模式,在更换对象的时候只需要在生产对象的工厂中做更改就可以了,降低了对象耦合性。

工厂模式分为三种模式:

(1)简单工厂模式,一个工厂方法,**根据传入的参数返回要生成的对象,这种模式将创建对象从应用代码中抽离,但是不能动态的改变创建行为,**比如工厂可以生成苹果对象和橘子对象,但是后来又需要生产桃子对象,就必须修改工厂类,局限性很大。

(2)**工厂方法模式,将工厂提取为抽象类或接口,具体生产什么对象由子类决定,比如生产苹果和生产橘子的工厂类继承水果工厂抽象类,子类各自生产各自对象,需要生产什么水果就调用哪个工厂类。**这种模式与简单工厂模式一个意思,需要生产桃子对象时必须要再创建出一个桃子工厂继承水果工厂,还是局限性很大。

(3)抽象工厂模式,当需要生产的对象比较多而且有依赖关系时可以使用抽象工厂模式。比如,现在需要生产苹果汁,苹果派,香蕉汁,香蕉派4个对象,可以分为香蕉和苹果两类,先创建一个抽象类生产果汁和派,然后苹果工厂来继承这个抽象类,重写生产果汁和派的两个方法生产苹果汁和苹果派,同理香蕉工厂也继承它生产香蕉汁和香蕉派,降低了对象的耦合性

设计模式了解么

工厂设计模式

定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。(即当在客户端怎加产品时,只需增加具体产品类和具体工厂类就可以

Spring使用工厂模式可以通过 BeanFactoryApplicationContext 创建 bean 对象。

两者对比:

  • BeanFactory :延迟注入(使用到某个 bean 的时候才会注入),相比于ApplicationContext 来说会占用更少的内存,程序启动速度更快。
  • ApplicationContext :容器启动的时候,不管你用没用到,一次性创建所有 bean 。BeanFactory 仅提供了最基本的依赖注入支持, ApplicationContext 扩展了 BeanFactory ,除了有BeanFactory的功能还有额外更多功能,所以一般开发人员使用 ApplicationContext会更多。

单例设计模式

对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。

Spring 中 bean 的默认作用域就是 singleton(单例)的。

1. 构造私有:

如果要保证一个类不能多次被实例化,那么我肯定要阻止对象被new 出来,所以需要把类的所有构造方法私有化。
2.以静态方法返回实例

因为外界就不能通过new来获得对象,所以我们要通过提供类的方法来让外界获取对象实例。

3.确保对象实例只有一个

只对类进行一次实例化,以后都直接获取第一次实例化的对象。

饿汉模式

饿汉模式的意思是,我先把对象(面包)创建好,等我要用(吃)的直接直接来拿就行了。

懒汉模式

因为饿汉模式可能会造成资源浪费的问题,所以就有了懒汉模式,懒汉模式的意思是,我先不创建类的对象实例,等你需要的时候我再创建。

懒汉模式在并发情况下可能引起的问题

懒汉模式解决了饿汉模式可能引起的资源浪费问题,因为这种模式只有在用户要使用的时候才会实例化对象。但是这种模式在并发情况下会出现创建多个对象的情况。

因为可能出现外界多人同时访问SingleCase.getInstance()方法,这里可能会出现因为并发问题导致类被实例化多次,所以懒汉模式需要加上锁synchronized (Singleton.class) 来控制类只允许被实例化一次。

//懒汉模式,双重null检查
class Singleton{
    private volatile static Singleton instance = null;
    private Singleton(){}
    public static Singleton getInstance() {
        if(instance == null){
            synchronized (Singleton.class){
                if(instance == null){
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
//饿汉模式
class Singleton2{
    private static final Singleton2 instance = new Singleton2();
    private Singleton2(){}

    public static Singleton2 getInstance() {
        return instance;
    }
}
public class Singleton {  
    private static Singleton instance;  
    private Singleton (){}  
    public static synchronized Singleton getInstance() {  
        if (instance == null) {  
            instance = new Singleton();  
        }  
        return instance;  
    }  
}
//静态内部类模式
public class Singleton {  
    private static class SingletonHolder {  
    private static final Singleton INSTANCE = new Singleton();  
    }  
    private Singleton (){}  
    public static final Singleton getInstance() {  
        return SingletonHolder.INSTANCE;  
    }  
}
//枚举
public enum Singleton {  
    INSTANCE;  
    public void whateverMethod() {  
    }  
}

代理设计模式

为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象,好处就是可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。

AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码降低模块间的耦合度,并有利于未来的可拓展性和可维护性

策略模式

策略模式(Strategy Pattern)也叫政策模式,是一种比较简单的模式。它的目的是定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换,使得算法可以在不影响到客户端的情况下发生变化。

模板方法模式

模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤

Spring 中 jdbcTemplatehibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。

观察者模式

观察者模式是一种对象行为型模式。它表示的是一种对象与对象之间具有依赖关系,当一个对象发生改变的时候,这个对象所依赖的对象也会做出反应。Spring 事件驱动模型就是观察者模式很经典的一个应用。Spring 事件驱动模型非常有用,在很多场景都可以解耦我们的代码。比如我们每次添加商品的时候都需要重新更新商品索引,这个时候就可以利用观察者模式来解决这个问题。

适配器模式

观察者模式

观察者模式是一种对象行为型模式。它表示的是一种对象与对象之间具有依赖关系,当一个对象发生改变的时候,这个对象所依赖的对象也会做出反应。Spring 事件驱动模型就是观察者模式很经典的一个应用。Spring 事件驱动模型非常有用,在很多场景都可以解耦我们的代码。比如我们每次添加商品的时候都需要重新更新商品索引,这个时候就可以利用观察者模式来解决这个问题。

适配器模式

pring AOP 的增强或通知(Advice)使用到了适配器模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/17644.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HNU-操作系统OS-实验Lab2

OS_Lab2_Experimental report 湖南大学信息科学与工程学院 计科 210X wolf (学号 202108010XXX) 前言 实验一过后大家做出来了一个可以启动的系统,实验二主要涉及操作系统的物理内存管理。操作系统为了使用内存,还需高效地管理…

【算法与数据结构】顺序表

顺序表 数据结构 结构定义结构操作 顺序表:结构定义 一个数组,添加额外的几个属性:size, count等 size: 数组有多大 count: 数组中当前存储了多少元素 顺序表三部分: 一段连续的存储区:顺序表存储元素的地方整型…

利用css实现视差滚动和抖动效果

背景: 前端的设计效果,越来越炫酷,而这些炫酷的效果,利用css3的动画效果和js就可以实现,简单的代码就能实现非常炫酷的效果。 原理: 利用 js监控scrollTop的位置,通过 top定位图片的位置&#x…

HDOJ 1022 Train Problem Ⅰ 模拟栈操作

🍑 OJ专栏 🍑 HDOJ 1022 Train Problem Ⅰ 输入 3 123 321 3 123 312输出 Yes. in in in out out out FINISH No. FINISH🍑 思路 🍤 栈顶元素与目标元素不匹配就进栈,匹配就出栈 🍤 匹配完:y…

『python爬虫』10. 数据解析之xpath解析(保姆级图文)

目录 安装库xpath入门怎么快速得到xpath路径xpath节点的关系xpath方法小型实战总结 欢迎关注 『python爬虫』 专栏,持续更新中 欢迎关注 『python爬虫』 专栏,持续更新中 安装库 pip install lxmlxpath入门 怎么快速得到xpath路径 (相对路…

webpack plugin原理以及自定义plugin

通过插件我们可以拓展webpack,加入自定义的构建行为,使webpack可以执行更广泛的任务。 plugin工作原理: webpack工作就像是生产流水线,要通过一系列处理流程后才能将源文件转为输出结果,在不同阶段做不同的事&#x…

二、PEMFC基础之电化学与反应动力学

二、PEMFC基础之电化学与反应动力学 1.电流、电流密度2.反应速率常数3.交换电流密度4.电化学动力学奠基石B-V方程5.活化损失计算Tafel公式6.计算案例 1.电流、电流密度 由法拉第定律 i d Q d t n F d N d t i\frac{dQ}{dt}\frac{nFdN}{dt} idtdQ​dtnFdN​ j i A j\frac{…

【五一创作】ERP实施-委外业务-委外采购业务

委外业务主要有两种业务形态:委外采购和工序外协,委外采购主要是在MM模块中实现,工序外协主要由PP模块实现,工序外协中的采购订单创建和采购收货由MM模块实现。 委外采购概念 委外采购,有些企业也称为带料委外或者分包…

牛客刷SQL题Day5

SQL69 返回产品并且按照价格排序 select prod_name , prod_price from Products where prod_price between 3 and 6 select prod_name , prod_price from Products where 6>prod_price and prod_price >3 踩坑1: between......and.......包括边界。 踩坑2&am…

网卡丢失导致集群异常

假期晚上有个电话,说集群故障,应用无法连接,节点一可以ssh登录,节点二已无法正常登录了,在节点一上需要ssh 私网ip地址才可以登录节点二,虽不是重点客户,有问题还是需要积极处理。 首先看集群状…

Cartesi 2023 年 4 月回顾

查看你不想错过的更新 2023年5月1日,感谢Cartesi生态系统中所有了不起的构建者! 在一个激动人心的旅程之后,我们的首届全球线上黑客马拉松正式结束了!有超过200名注册建造者参加,见证了所有参与者展示的巨大才华和奉献…

有必要给孩子买台灯吗?分享四款高品质的护眼台灯

有必要使用护眼台灯,尤其是有近视现象的孩子们。 现在很多孩子小学就开始近视了,保护视力刻不容缓呀! 很多人不知道,其实劣质光线是最大的眼睛杀手 给孩子随便买便宜的台灯,看着一样能用,其实时间久了 对孩子眼睛的…

SpringCloud:ElasticSearch之RestClient查询文档

文档的查询同样适用RestHighLevelClient对象,基本步骤包括: 1)准备Request对象2)准备请求参数3)发起请求4)解析响应 1.快速入门 我们以match_all查询为例 1.1.发起查询请求 代码解读: 第一步…

【《中国工业经济》数据复现】数字化转型与企业分工:专业化还是纵向一体化

一.研究内容 本文使用机器学习方法刻画微观企业数字化水平,并在构建数理模型的基础上实证考察了企业数字化转型对企业分工的影响及其机理。结果表明,企业数字化转型显著提升了中国上市企业专业化分工水平。机制分析表明,数字化转型对企业专业…

ReentrantLock原理剖析

前言 本文主要讲解底层逻辑,基本不会贴代码,目的是让大家能够真正的知晓原理,对照着逻辑去理解代码看代码也会很快就能看懂。 在讲ReentrantLock原理之前,我们先回顾下ReentrantLock的基本用法。ReentrantLock是一个锁编程api&am…

考研机试刷题第二天:任意进制转任意进制【高进度短除法】

理一下思路&#xff1a; 看了y总的视频之后我觉得这道题其实只需要对上次写的进制转换微微做一下调整即可。 于是我写出了下面的代码 #include <iostream> #include <vector> #include <algorithm> #include <cstring>using namespace std;vector<…

Moonbeam操作指南|如何使用Gelato创建自动化任务

Gelato是一个Web3去中心化自动化网络&#xff0c;允许开发者横跨多个基于EVM兼容区块链上自动化和连接任意的智能合约执行。&#x1f4d1;阅读中文版详细操作教程 举例来说&#xff0c;我们将使用MetaMask作为钱包。同时&#xff0c;您的钱包余额中需要有一些GLMR用于支付自动…

基于海洋捕食者算法的极限学习机(ELM)回归预测-附代码

基于海洋捕食者算法的极限学习机(ELM)回归预测 文章目录 基于海洋捕食者算法的极限学习机(ELM)回归预测1.极限学习机原理概述2.ELM学习算法3.回归问题数据处理4.基于海洋捕食者算法优化的ELM5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;本文利用海洋捕食者算法对极限学习…

深度学习笔记--本地部署Mini-GPT4

目录 1--前言 2--配置环境依赖 3--下载权重 4--生成 Vicuna 权重 5--测试 6--可能出现的问题 1--前言 本机环境&#xff1a; System: Ubuntu 18.04 GPU: Tesla V100 (32G) CUDA: 10.0 项目地址&#xff1a;https://github.com/Vision-CAIR/MiniGPT-4 2--配置环境依赖 …

python面试题

文章目录 赋值、深拷贝和浅拷贝有什么区别&#xff1f;元组和列表有什么不同&#xff1f;和is有什么不同&#xff1f;集合怎么转字典&#xff1f;字典怎么遍历&#xff1f;如何在Python中实现多线程&#xff1f;如何实现tuple和list的转换&#xff1f;实现删除一个list里面的重…