spring cloud每次修改必须重新打包_Java面试系列spring相关

Spring中的Bean是线程安全的吗?

Spring 中的 bean 默认都是单例的,所有线程都共享一个单例实例Bean,因此是存在资源的竞争,是线程不安全的

但是spring中大部分bean都是在方法内部操作,例如:Controller、Service、Dao等,不会对bean的成员变量做查询以外的操作,这种bean是线程安全的。如果非要在这些bean中定义成员变量并修改它,可以声明@Scope("prototype")保证线程安全。

在spring内部有一些bean会对成员变量操作,例如:RequestContextHolder等,这种bean一般通过ThreadLocal来解决线程安全的问题。

@Component 和 @Bean 的区别是什么?

  • @Component注解作用于;而@Bean作用于方法
  • @Component一般是用过类路径来自动装配到spring中;@Bean一般是在方法中产生一个bean,然后将这个bean交给spring管理。
  • @Bean注解比@Component注解的自定义性更强,很多时候我们需要将第三方类库中的bean装配到spring中时,只能通过@Bean来实现。

SpringMVC 工作原理

  • 客户端发送请求,到达DispatcherServlet
  • DispatcherServlet根据请求信息调用HandlerMapping
  • HandlerMapping解析请求到对应的Handler(Controller)后,开始由HandlerAdapter来处理。
  • HandlerAdapter根据Handler调用真正的处理器来处理请求。
  • 处理器处理完以后,返回一个ModelAndView对象。
  • ViewResolver根据ModelAndView中的View查找实际的View。
  • DispaterServlet将ModelAndView中的Model传给View。
  • 最后把实际的View返回给请求者。

在Spring容器初始化的过程中,所有定义的bean都会被初始化吗?

不是,默认只初始化所有未初始化的非懒加载的单例Bean,scope为其它值的bean会在使用到的时候进行初始化,如prototype。

Spring如何解决循环依赖?

spring注入属性方式有多种,但是只有一种循环依赖被解决:setter依赖注入。其他的注入方式,Spring也没有办法解决,只是抛出BeanCurrentlyInCreationException异常。

spring解决循环依赖的方式是采用三级缓存,未等bean创建完成之前就先将实例曝光出去,方便其他bean引用。

核心代码

//singletonObjects指单例对象的cache (一级缓存)
private final Map singletonObjects = new ConcurrentHashMap(256);//singletonFactories指单例对象工厂的cache(三级缓存)private final Map> singletonFactories = new HashMap>(16);//earlySingletonObjects指提前曝光的单例对象的cache(二级缓存)private final Map earlySingletonObjects = new HashMap(16);
protected Object getSingleton(String beanName, boolean allowEarlyReference) {
   //从一级缓存获取
   Object singletonObject = this.singletonObjects.get(beanName);
   //isSingletonCurrentlyInCreation():判断当前单例bean是否正在创建中
   if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
      synchronized (this.singletonObjects) {
         //从二级缓存获取
         singletonObject = this.earlySingletonObjects.get(beanName);
         //allowEarlyReference:是否允许从singletonFactories中通过getObject拿到对象
         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 != NULL_OBJECT ? singletonObject : null);
}

图解

b4c6b6f98ae71ac5a8899edfeda58c63.png

A首先完成了初始化的第一步,并且将自己提前曝光到singletonFactories中

此时进行初始化的第二步,发现自己依赖对象B,此时就尝试去get(B),发现B还没有被create,所以走create流程,

B在初始化第一步的时候发现自己依赖了对象A,于是尝试get(A),尝试一级缓存singletonObjects(没有,因为A还没初始化完全),尝试二级缓存earlySingletonObjects(也没有),尝试三级缓存singletonFactories,由于A通过ObjectFactory将自己提前曝光了,所以B能够通过ObjectFactory.getObject拿到A对象(此时A还没有初始化完全),

B拿到A对象后顺利完成了初始化阶段1、2、3,完全初始化之后将自己放入到一级缓存singletonObjects中

此时返回A中,A此时能拿到B的对象顺利完成自己的初始化阶段2、3,最终A也完成了初始化,进去了一级缓存singletonObjects中,而此时,由于B拿到了A的对象引用,所以B现在引用的A对象完成了初始化

springboot原理,如何实现的自动装配?

首先看启动类上的@SpringBootApplication注解

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {

再看里面的@EnableAutoConfiguration注解

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {

然后通过@Import注入AutoConfigurationImportSelector类,这个类通过实现DeferredImportSelector来重写selectImports方法去加载META-INF/spring.factories这个外部文件,这个外部文件里面,默认有很多自动配置的类,这些类的定义信息将会被SpringBoot批量的注入到spring容器中,从而实现了自动装配。

相关的starter和自定义starter都是根据这个实现的。

spring事务以及传播机制

spring事务是封装在数据库事务之上的一种事务处理机制,它有两种管理方式:编程式事务和声明式事务

spring事务的传播机制有七种:REQUIRED、REQUIRES_NEW、NESTED、SUPPORTS、NOT_SUPPORTED、MANDATORY和NEVER

详细介绍参考以前的文章:传送门

springboot打包成jar之后,怎么做到不重新打包修改他的properties配置文件?

Spring程序会按优先级从下面这些路径来加载application.properties配置文件

  • 当前目录下的/config目录
  • 当前目录
  • classpath里的/config目录
  • classpath 跟目录

因此,要外置配置文件就很简单了,在jar所在目录新建config文件夹,然后放入配置文件,或者直接放在jar同级目录

bootstrap.properties 和 application.properties 有何区别 ?

单纯做 Spring Boot 开发,可能不太容易遇到 bootstrap.properties 配置文件,但是在结合 Spring Cloud 时,这个配置就会经常遇到了。

  • bootstrap (. yml 或者 . properties):boostrap 由父 ApplicationContext 加载的,比 applicaton 优先加载,配置在应用程序上下文的引导阶段生效。一般来说我们在 Spring Cloud 配置就会使用这个文件。且 boostrap 里面的属性不能被覆盖;
  • application (. yml 或者 . properties):由ApplicatonContext 加载,用于 spring boot 项目的自动化配置。

Spring Boot 打成的 jar 和普通的 jar 有什么区别 ?

  • Spring Boot 项目最终打包成的 jar 是可执行 jar ,这种 jar 可以直接通过 java -jar xxx.jar 命令来运行。
  • Spring Boot 的 jar 无法被其他项目依赖,主要还是他和普通 jar 的结构不同。普通的 jar 包,解压后直接就是包名,包里就是我们的代码,而 Spring Boot 打包成的可执行 jar 解压后,在 \BOOT-INF\classes 目录下才是我们的代码,因此无法被直接引用。

扫一扫,关注我
6e416af29f8e5e37ef56804285e536f3.png

Java面试系列-redis相关

2020-09-29

f43c5d1bb0278e8410bf8d22a929ff58.png

Java面试系列-线程相关(一)

2020-09-03

7b59e32f88b32f194009049bbdc21b53.png

Java到底是引用传递还是值传递

2020-08-07

e1b7f9d121f6bf06fe97fc4342d1d8c6.png

redis分布式锁

2020-06-05

dc45d2cec8e619f9d5c6ae58d4d9cbc8.png

手摸手教你搭建免费图床

2020-05-28

7b2e73b020031fe3e20ee6125d6733c5.png

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

day20 派生属性和方法,钻石继承

class Animal:人和狗都是动物,所以创造一个Animal基类def __init__(self, name, aggressivity, life_value):self.name name # 人和狗都有自己的昵称;self.aggressivity aggressivity # 人和狗都有自己的攻击力;self.life_value life_value # 人和狗都有自己的…

谈谈实现小样本学习的两条路径

来源:混沌巡洋舰小样本学习是当下机器学习界的一个核心课题。大数据是当下深度学习的咽喉,面临收集成本昂贵,甚至根本无法采集的弊端, 小样本学习的实践价值不言而喻。对于众多产业来说, 真正能够收集到大量样本的是极…

python怎么处理文字_python 处理给规范的文字

你要处理的大多数文字都是比较干净、格式规范的。格式规范的文字通常可以满足一些需求,不过究竟什么是“格式混乱”,什么算“格式规范”,确实因人而异。 通常,格式规范的文字具有以下特点:使用一个标准字体(不包含手写体、草书,或者十分“花哨的”字体) • 虽然被复印或拍照,字…

php自定义商品属性,php – 可变产品属性:自定义每个显示的单选按钮文本值

以下是您重新访问的代码,该代码仅显示“Tab”属性单选按钮自定义显示的文本a< span>基于属性slug和$term_slug的组合,使用不同的类值标记.因此,您可以将一些CSS样式颜色应用于每个单选按钮显示的’pa_tab’属性的自定义文本,将这些CSS规则添加到您的活动主题style.css ……

腾讯 深圳 25928-PHP开发工程师(深圳)

工作地点&#xff1a;深圳职位类别&#xff1a;技术类招聘人数&#xff1a;1人 工作职责&#xff1a;负责游戏研运体系流程工具及相关产品的开发、维护&#xff1b;参与支撑系统的需求分析、设计、编码&#xff1b;承担外包开发成员技术导师&#xff0c;解决技术难点&#xff0…

什么是物联网?常见IoT协议最全讲解

作者&#xff1a;付强来源&#xff1a;IoT物联网技术&#xff08;ID&#xff1a;IoT-Tech-Expo&#xff09;01 什么是物联网?物联网&#xff08;Internet of Things&#xff09;这个概念读者应该不会陌生。物联网的概念最早于1999年被提出来&#xff0c;曾被称为继计算机、互联…

is在python中是什么意思_Python 中 is 与 == 有啥区别?

在 Python 中&#xff0c;比较两个对象(变量)是否相等&#xff0c;可以用 “is” 和 “” 操作&#xff0c;但它俩有什么区别&#xff1f;什么时候用 “is”&#xff0c;什么时候用 “” &#xff1f;在面试时&#xff0c;发现不少候选人很难把这两者完全说清楚&#xff0c;因此…

java下发命令nbiot,NB物联网之天翼物联(3)——编解码插件上传规则细解(java开发物联网)...

前言电信的编解码插件本意上是可以让我们的开发更加灵活&#xff0c;但是你好歹把文档写明白啊。。。同时在正常的生产中我们的产品不可能只使用电信的模块&#xff0c;有时甚至是客户要求使用移动还是电信的模块&#xff0c;所以兼容性给我们的体验非常直观&#xff01;我们先…

netcat使用

前言 最近在做渗透测试的时候遇到了端口监听和shell的反弹问题&#xff0c;在这个过程中自己对Netcat这一款神器有了新的认识&#xff0c;现将一些Netcat的用法做一个小总结&#xff0c;希望对各位有帮助&#xff01; Netcat简介 Netcat是一款非常出名的网络工具&#xff0c;简…

重磅:国家正式出台学术不端行为界定

来源&#xff1a;科研大匠大家都在反对学术不端&#xff0c;何为学术不端&#xff1f;如何界定学术不端行为&#xff1f;其实&#xff0c;此前并没有一个明确的标准。2019年5月29日&#xff0c;国家新闻出版署才正式发布我国首个针对学术不端行为的行业标准——《学术出版规范—…

数据结构化与保存

1. 将新闻的正文内容保存到文本文件。 f open(gzccnews.txt,a,encodingutf-8)f.write(content)f.close()2. 将新闻数据结构化为字典的列表: 单条新闻的详情-->字典news一个列表页所有单条新闻汇总-->列表newsls.append(news)所有列表页的所有新闻汇总列表newstotal.exte…

Gartner:解开关于人工智能的六个迷思

来源&#xff1a;Gartner“人工智能将自动执行所有工作并让人类失业。”“人工智能只是一种虚构的技术。”“机器人将占领整个世界。”围绕人工智能的炒作给主流媒体、董事会议和各企业机构留下了许多迷思。有人担心“万能”的人工智能将占领全世界&#xff0c;有人则认为人工智…

python计算三角函数的计算器_一个工具箱 之 三角函数计算器

三角函数是基本初等函数之一&#xff0c;是以角度(数学上最常用弧度制&#xff0c;下同)为自变量&#xff0c;角度对应任意角终边与单位圆交点坐标或其比值为因变量的函数。也可以等价地用与单位圆有关的各种线段的长度来定义。三角函数在研究三角形和圆等几何形状的性质时有重…

java搭建线程池框架,JAVA线程池管理及分布式HADOOP调度框架搭建

大家看到了线程的好处了吧&#xff01;单线程需要10S&#xff0c;10个线程只需要1S。充分利用了系统资源实现并行计算。也许这里会产生一个误解&#xff0c;是不是增加的线程个数越多效率越高。线程越多处理性能越高这个是错误的&#xff0c;范式都要合适&#xff0c;过了就不好…

H5项目常见问题汇总及解决方案

H5项目常见问题及注意事项 补充&#xff1a; https://github.com/aligay/fastclick/blob/master/lib/fastclick.js Meta基础知识&#xff1a; H5页面窗口自动调整到设备宽度&#xff0c;并禁止用户缩放页面//一、HTML页面结构 <meta name"viewport" content"…

IBM将收购Instana公司,持续推进其混合云和人工智能战略

来源&#xff1a;IBM中国收购 Instana 后&#xff0c;IBM 将帮助企业在多团队和多云&#xff08;平均 2到 15个&#xff09;环境下更好地管理他们的应用性能。[1]这也是 IBM 持续完善其由人工智能所驱动的自动化能力的又一例证&#xff0c;IBM 的其他相关举措还包括&#xff1a…

python调用大漠找图_[教程贴]按键精灵调用大漠插件后台找图示例

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼//------大漠注册-------------------------------------------------------------DMPath "c:\test_game\"注册大漠的文件夹DMVer "3.1233"当前使用的大漠版本号////Call 大漠注册标准版(DMPath, DMVer)//--…

1.php查询数据,查询数据 - ThinkPHP 5.1 完全开发手册

基本查询查询单个数据使用find方法&#xff1a;// table方法必须指定完整的数据表名Db::table(think_user)->where(id,1)->find();最终生成的SQL语句可能是&#xff1a;SELECT * FROM think_user WHERE id 1 LIMIT 1find 方法查询结果不存在&#xff0c;返回 null&#…

[原创]关于在VS解决方案下使用文件夹管理多个项目层次关系的说明

由于所创建的应用项目或类库项目较多&#xff0c;于是将这些类库放到一个文件夹下。在VS解决方案下确实能看到一个文件夹下多个类库项目这种层次关系。如下图所示&#xff1a; 但打开“我的电脑”&#xff0c;看到的只有类库&#xff0c;并未看到维护层次关系的文件夹。如下图所…

java进阶(二)-java小干货

java一些精干知识点分享 2. java小干货2.1循环遍历2.2可变参数2.3 list和数组转化2.3.1 数组转list2.3.2 list转数组 2.4 值传递和地址传递2.4.1值传递2.4.2 地址传递2.4.3易错点总结 2.5 数组数组帮助类Arrays 2.5 基本数据类型和包装类2.5集合2.6文件流2.7java代码块、内部类…