首页 文章 精选 留言 我的

精选列表

搜索[禅道],共6181篇文章
优秀的个人博客,低调大师

深入 FSoE 安全协议(二):工业通信中的八种错误与四道安全防线

这是 "深入 FSoE" 系列文章的第二篇。在上一篇文章中,我们介绍了 FSoE 的基本概念、核心角色和工作方式,并提到 FSoE 基于"黑色通道"原理——底层通信被视为不可信,安全完整性完全由端到端的安全协议来保证。那么,底层通信到底会发生哪些错误?FSoE 又是如何一一应对的?这正是本文要回答的问题。

优秀的个人博客,低调大师

公安部道研中心:虚假宣传自动驾驶可面临 2 年以下刑期

近日,公安部道路交通安全研究中心官方公众号“交通言究社”发表《智慧领航,安全护航——智能网联汽车辅助驾驶功能使用须谨慎》一文,提到近期因驾驶人错误使用辅助驾驶导致的交通事故,并揭示其原因——部分驾驶人对辅助驾驶的认知不到位,误以为“辅助驾驶=自动驾驶”。 文章指出,部分驾驶人开启辅助驾驶功能后做出玩手机、睡觉、聊天、吃东西等危险行为,不仅违反了道路交通安全法律法规,也对其他道路使用者的安全构成严重威胁。 2021年8月,中国国家市场监督管理总局、国家标准化管理委员会批准发布《汽车驾驶自动化分级》(GB/T 40429-2021)标准,将驾驶自动化分为0至5级。 (一)关于车企误导宣传的相关法律责任 根据《中华人民共和国广告法》第二十八条,若车企通过广告或宣传材料虚构、夸大辅助驾驶功能(如将2级辅助驾驶描述为 “自动驾驶”),误导消费者购买,市场监管部门可依据《中华人民共和国广告法》对虚假宣传行为处以广告费用5-10倍罚款,情节严重的吊销营业执照。若虚假宣传造成严重后果(如引发交通事故致人伤亡),可能触犯《中华人民共和国刑法》第二百二十二条,可对责任人处2年以下有期徒刑或拘役,并处或单处罚金。 (二)关于驾驶人滥用辅助驾驶的相关法律责任 根据《中华人民共和国道路交通安全法》及其实施条例,机动车驾驶人始终对车辆运行安全负主体责任。当前我国道路通行环境下,市面量产汽车仍处于2级辅助驾驶阶段,系统仅提供有限的辅助驾驶功能,因此,驾驶人在使用辅助驾驶功能时,必须持续履行观察路况、预判风险和及时接管的义务。若驾驶人在辅助驾驶功能激活期间未尽上述义务,存在“脱手脱眼”行为,公安机关交通管理部门将依据《中华人民共和国道路交通安全法》第九十条,认定其存在妨碍安全驾驶的违法行为,依法处以罚款并记分。一旦因此类行为引发交通事故,驾驶人将承担主要责任,需依法承担民事赔偿;若事故导致人员伤亡或重大财产损失,还可能构成交通肇事罪,被追究刑事责任。 (三)关于生产销售“智驾神器”的相关法律责任 对生产、销售者而言。根据《中华人民共和国刑法》第一百四十六条规定,“智驾神器”不符合保障人身、财产安全的国家标准或行业标准(如干扰车辆安全监测系统),若造成严重后果(如交通事故致人伤亡),生产者和销售者可能被判处5年以下有期徒刑或拘役,并处销售金额50%至2倍罚金;后果特别严重的(如多人伤亡),刑期可至5年以上有期徒刑,罚金同上。若设备设计或宣传直接诱导驾驶人脱离监管(如 “解放双手”“免接管”),导致重大交通事故,可能被认定为危害公共安全,最高可判处死刑。 对使用者而言。根据《中华人民共和国道路交通安全法》及其实施条例,使用“智驾神器”导致双手脱离方向盘、视线偏离道路,仍属于“妨碍安全驾驶行为”,依法处以罚款并记分。一旦引发交通事故,驾驶人将承担主要责任,需依法承担民事赔偿;若事故导致人员伤亡或重大财产损失,还可能构成交通肇事罪,被追究刑事责任。 对销售平台而言。根据《中华人民共和国电子商务法》第三十八条规定,电子商务平台经营者知道或者应当知道平台内经营者销售的商品或者提供的服务不符合保障人身、财产安全的要求,或者有其他侵害消费者合法权益行为,未采取必要措施的,依法与该平台内经营者承担连带责任。对关系消费者生命健康的商品或者服务,电子商务平台经营者对平台内经营者的资质资格未尽到审核义务,或者对消费者未尽到安全保障义务,造成消费者损害的,依法承担相应的责任。 (四)关于驾驶人酒后使用辅助驾驶的相关法律责任 对于驾驶人本人启用辅助驾驶功能上路通行。即便本人通过使用“智驾神器”等方式实现脱手驾驶,未实际操纵方向盘驾驶车辆,仍然属于道路交通安全违法行为,属于醉酒驾驶的,还有可能构成危险驾驶罪。原因在于,驾驶人在使用辅助驾驶相关功能时,需要通过账号登录,验证识别等方式进行授权和许可,表明驾驶人对车辆启动具有明知且认可的主观心态,驾驶人驾驶辅助驾驶汽车上道路通行期间,具有掌握车辆控制权、监控道路交通环境、保持专注并随时准备接管车辆的义务,此种义务不能由未实际操作方向盘,或者车辆具有辅助驾驶功能等理由予以免除。驾驶人在明知自身因醉驾等原因导致风险控制能力下降,且车辆的情况,仍然放弃驾驶责任,放任不具有自动驾驶能力的车辆自主行驶,具有充分的社会危害性,既属于《中华人民共和国道路交通安全法实施条例》第六十二条第3款规定的分心驾驶行为,亦属于酒后驾驶行为。情节严重,构成犯罪的,还应当以危险驾驶罪追究其刑事责任。 对于帮助处于醉酒状态的驾驶人设定终点、启动车辆、规避驾驶员监控系统(DMS),再由辅助驾驶汽车根据预先设定好的线路行驶的行为,《中华人民共和国道路交通安全法》第二十二条第3款规定,任何人不得强迫、指使、纵容驾驶人违反道路交通安全法律法规和机动车安全驾驶要求驾驶机动车。在明知驾驶人处于醉酒状态,且不会对车辆进行驾驶的情况下,仍然为其设定路线、启动车辆,实质上纵容并帮助了车主实施分心驾驶、醉酒驾驶等道路交通安全违法行为,应追究其相应的法律责任。 总之,当前国内量产车型所搭载自动驾驶系统尚处于2级辅助驾驶阶段,系统属于“执行者”角色,驾驶人才是最终责任主体,违反法律或不安全使用行为不仅面临行政处罚,还可能承担事故赔偿甚至刑事责任。因此,驾驶人应做自己生命的“第一责任人”,严格遵守《中华人民共和国道路交通安全法》,在使用辅助驾驶系统时保持专注,确保随时可控。(中国青年报)

优秀的个人博客,低调大师

快看看这22道面试题!(附答案解析)

一. Java 类加载过程? Java 类加载需要经历一下 7 个过程:1. 加载加载是类加载的第一个过程,在这个阶段,将完成一下三件事情:• 通过一个类的全限定名获取该类的二进制流。• 将该二进制流中的静态存储结构转化为方法去运行时数据结构。• 在内存中生成该类的 Class 对象,作为该类的数据访问入口。2. 验证验证的目的是为了确保 Class 文件的字节流中的信息不回危害到虚拟机.在该阶段主要完成以下四钟验证:• 文件格式验证:验证字节流是否符合 Class 文件的规范,如主次版本号是否在当前虚拟机范围内,常量池中的常量是否有不被支持的类型.• 元数据验证:对字节码描述的信息进行语义分析,如这个类是否有父类,是否集成了不被继承的类等。• 字节码验证:是整个验证过程中最复杂的一个阶段,通过验证数据流和控制流的分析,确定程序语义是否正确,主要针对方法体的验证。如:方法中的类型转换是否正确,跳转指令是否正确等。• 符号引用验证:这个动作在后面的解析过程中发生,主要是为了确保解析动作能正确执行。3. 准备准备阶段是为类的静态变量分配内存并将其初始化为默认值,这些内存都将在方法区中进行分配。准备阶段不分配类中的实例变量的内存,实例变量将会在对象实例化时随着对象一起分配在 Java 堆中。public static int value=123;//在准备阶段 value 初始值为 0 。在初始化阶段才会变为 123 。4. 解析该阶段主要完成符号引用到直接引用的转换动作。解析动作并不一定在初始化动作完成之前,也有可能在初始化之后。5. 初始化初始化时类加载的最后一步,前面的类加载过程,除了在加载阶段用户应用程序可以通过自定义类加载器参与之外,其余动作完全由虚拟机主导和控制。到了初始化阶段,才真正开始执行类中定义的Java 程序代码。6. 使用7. 卸载 二.描述一下 JVM 加载 Class 文件的原理机制? Java 语言是一种具有动态性的解释型语言,类(Class)只有被加载到 JVM 后才能运行。当运行指定程序时,JVM 会将编译生成的 .class 文件按照需求和一定的规则加载到内存中,并组织成为一个完整的 Java 应用程序。这个加载过程是由类加载器完成,具体来说,就是由 ClassLoader 和它的子类来实现的。类加载器本身也是一个类,其实质是把类文件从硬盘读取到内存中。类的加载方式分为隐式加载和显示加载。隐式加载指的是程序在使用 new 等方式创建对象时,会隐式地调用类的加载器把对应的类加载到 JVM 中。显示加载指的是通过直接调用 class.forName()方法来把所需的类加载到 JVM 中。任何一个工程项目都是由许多类组成的,当程序启动时,只把需要的类加载到 JVM 中,其他类只有被使用到的时候才会被加载,采用这种方法一方面可以加快加载速度,另一方面可以节约程序运行时对内存的开销。此外,在 Java 语言中,每个类或接口都对应一个 .class 文件,这些文件可以被看成是一个个可以被动态加载的单元,因此当只有部分类被修改时,只需要重新编译变化的类即可,而不需要重新编译所有文件,因此加快了编译速度。在 Java 语言中,类的加载是动态的,它并不会一次性将所有类全部加载后再运行,而是保证程序运行的基础类(例如基类)完全加载到 JVM 中,至于其他类,则在需要的时候才加载。类加载的主要步骤:• 装载,根据查找路径找到相应的 class 文件,然后导入。• 链接,链接又可分为 3 个小步:• 检查,检查待加载的 class 文件的正确性。• 准备,给类中的静态变量分配存储空间。• 解析,将符号引用转换为直接引用(这一步可选)• 初始化。对静态变量和静态代码块执行初始化工作。 三 Java 内存分配。 • 寄存器:我们无法控制。• 静态域:static 定义的静态成员。• 常量池:编译时被确定并保存在 .class 文件中的(final)常量值和一些文本修饰的符号引用(类和接口的全限定名,字段的名称和描述符,方法和名称和描述符)。• 非 RAM 存储:硬盘等永久存储空间。• 堆内存:new 创建的对象和数组,由 Java 虚拟机自动垃圾回收器管理,存取速度慢。• 栈内存:基本类型的变量和对象的引用变量(堆内存空间的访问地址),速度快,可以共享,但是大小与生存期必须确定,缺乏灵活性。Java 堆的结构是什么样子的?什么是堆中的永久代(Perm Genspace)?JVM 的堆是运行时数据区,所有类的实例和数组都是在堆上分配内存。它在 JVM 启动的时候被创建。对象所占的堆内存是由自动内存管理系统也就是垃圾收集器回收。堆内存是由存活和死亡的对象组成的。存活的对象是应用可以访问的,不会被垃圾回收。死亡的对象是应用不可访问尚且还没有被垃圾收集器回收掉的对象。一直到垃圾收集器把这些 对象回收掉之前,他们会一直占据堆内存空间。 四.GC 是什么? 为什么要有 GC? GC 是垃圾收集的意思(GabageCollection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java 提供的 GC 功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java 语言没有提供释放已分配内存的显示操作方法。 五. 简述 Java 垃圾回收机制。 在 Java 中,程序员是不需要显示的去释放一个对象的内存的,而是由虚拟机自行执行。在 JVM 中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的,只有在虚拟机空闲或者当前堆内存不足时,才会触发执行,扫面那些没有被任何引用的对象,并将它们添加到要回收的集合中,进行回收。 六. 如何判断一个对象是否存活?(或者 GC 对象的判定方法) 判断一个对象是否存活有两种方法:1. 引用计数法所谓引用计数法就是给每一个对象设置一个引用计数器,每当有一个地方引用这个对象时,就将计数器加一,引用失效时,计数器就减一。当一个对象的引用计数器为零时,说明此对象没有被引用,也就是“死对象”,将会被垃圾回收。引用计数法有一个缺陷就是无法解决循环引用问题,也就是说当对象 A 引用对象 B,对象 B 又引用者对象 A,那么此时 A、B 对象的引用计数器都不为零,也就造成无法完成垃圾回收,所以主流的虚拟机都没有采用这种算法。2. 可达性算法(引用链法)该算法的思想是:从一个被称为 GC Roots 的对象开始向下搜索,如果一个对象到 GC Roots 没有任何引用链相连时,则说明此对象不可用。在 Java 中可以作为 GC Roots 的对象有以下几种:• 虚拟机栈中引用的对象• 方法区类静态属性引用的对象• 方法区常量池引用的对象• 本地方法栈 JNI 引用的对象虽然这些算法可以判定一个对象是否能被回收,但是当满足上述条件时,一个对象比不一定会被回收。当一个对象不可达 GC Root时,这个对象并不会立马被回收,而是出于一个死缓的阶段,若要被真正的回收需要经历两次标记。如果对象在可达性分析中没有与 GC Root 的引用链,那么此时就会被第一次标记并且进行一次筛选,筛选的条件是是否有必要执行finalize() 方法。当对象没有覆盖 finalize() 方法或者已被虚拟机调用过,那么就认为是没必要的。 如果该对象有必要执行finalize() 方法,那么这个对象将会放在一个称为 F-Queue 的对队列中,虚拟机会触发一个 Finalize() 线程去执行,此线程是低优先级的,并且虚拟机不会承诺一直等待它运行完,这是因为如果finalize() 执行缓慢或者发生了死锁,那么就会造成 F-Queue 对列一直等待,造成了内存回收系统的崩溃。GC 对处于 F-Queue中的对象进行第二次被标记,这时,该对象将被移除” 即将回收”集合,等待回收。 七. 垃圾回收的优点和原理。并考虑 2 种回收机制。 Java 语言中一个显著的特点就是引入了垃圾回收机制,使 C++程序员最头疼的内存管理的问题迎刃而解,它使得 Java 程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java 中的对象不再有“作用域”的概念,只有对象的引用才有"作用域"。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。 八. 垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收? 对于 GC 来说,当程序员创建对象时,GC 就开始监控这个对象的地址、大小以及使用情况。通常,GC 采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是”可达的”,哪些对象是”不可达的”。当 GC 确定一些对象为“不可达”时,GC 就有责任回收这些内存空间。可以。程序员可以手动执行 System.gc(),通知 GC 运行,但是 Java 语言规范并不保证 GC 一定会执行。 九. Java 中会存在内存泄漏吗,请简单描述。 所谓内存泄露就是指一个不再被程序使用的对象或变量一直被占据在内存中。Java 中有垃圾回收机制,它可以保证一对象不再被引用的时候,即对象变成了孤儿的时候,对象将自动被垃圾回收器从内存中清除掉。由于 Java 使用有向图的方式进行垃圾回收管理,可以消除引用循环的问题,例如有两个对象,相互引用,只要它们和根进程不可达的,那么 GC 也是可以回收它们的。Java 中的内存泄露的情况:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,这就是 Java 中内存泄露的发生场景,通俗地说,就是程序员可能创建了一个对象,以后一直不再使用这个对象,这个对象却一直被引用,即这个对象无用但是却无法被垃圾回收器回收的,这就是 java中可能出现内存泄露的情况,例如,缓存系统,我们加载了一个对象放在缓存中 (例如放在一个全局 map 对象中),然后一直不再使用它,这个对象一直被缓存引用,但却不再被使用。检查 Java 中的内存泄露,一定要让程序将各种分支情况都完整执行到程序结束,然后看某个对象是否被使用过,如果没有,则才能判定这个对象属于内存泄露。如果一个外部类的实例对象的方法返回了一个内部类的实例对象,这个内部类对象被长期引用了,即使那个外部类实例对象不再被使用,但由于内部类持久外部类的实例对象,这个外部类对象将不会被垃圾回收,这也会造成内存泄露。内存泄露的另外一种情况:当一个对象被存储进 HashSet 集合中以后,就不能修改这个对象中的那些参与计算哈希值的字段了,否则,对象修改后的哈希值与最初存储进 HashSet 集合中时的哈希值就不同了,在这种情况下,即使在 contains 方法使用该对象的当前引用作为的参数去 HashSet 集合中检索对象,也将返回找不到对象的结果,这也会导致无法从 HashSet 集合中单独删除当前对象,造成内存泄露。 十. 深拷贝和浅拷贝。 简单来讲就是复制、克隆。Person p=new Person(“张三”);浅拷贝就是对对象中的数据成员进行简单赋值,如果存在动态成员或者指针就会报错。深拷贝就是对对象中存在的动态成员或指针重新开辟内存空间。 十一. System.gc() 和 Runtime.gc() 会做什么事情? 这两个方法用来提示 JVM 要进行垃圾回收。但是,立即开始还是延迟进行垃圾回收是取决于 JVM 的。 十二. finalize() 方法什么时候被调用?析构函数 (finalization) 的目的是什么? 垃圾回收器(garbage colector)决定回收某对象时,就会运行该对象的 finalize() 方法 但是在 Java 中很不幸,如果内存总是充足的,那么垃圾回收可能永远不会进行,也就是说 filalize() 可能永远不被执行,显然指望它做收尾工作是靠不住的。 那么finalize() 究竟是做什么的呢? 它最主要的用途是回收特殊渠道申请的内存。Java 程序有垃圾回收器,所以一般情况下内存问题不用程序员操心。但有一种 JNI(Java Native Interface)调用non-Java 程序(C 或 C++), finalize() 的工作就是回收这部分的内存。 十三. 如果对象的引用被置为 null,垃圾收集器是否会立即释放对象占用的内存? 不会,在下一个垃圾回收周期中,这个对象将是可被回收的。 十四. 什么是分布式垃圾回收(DGC)?它是如何工作的? DGC 叫做分布式垃圾回收。RMI 使用 DGC 来做自动垃圾回收。因为 RMI 包含了跨虚拟机的远程对象的引用,垃圾回收是很困难的。DGC 使用引用计数算法来给远程对象提供自动内存管理。 十五. 串行(serial)收集器和吞吐量(throughput)收集器的区别是什么? 吞吐量收集器使用并行版本的新生代垃圾收集器,它用于中等规模和大规模数据的应用程序。 而串行收集器对大多数的小应用(在现代处理器上需要大概 100M 左右的内存)就足够了。 十六. 在 Java 中,对象什么时候可以被垃圾回收? 当对象对当前使用这个对象的应用程序变得不可触及的时候,这个对象就可以被回收了。 十七. 简述 Java 内存分配与回收策率以及 Minor GC 和 MajorGC。 • 对象优先在堆的 Eden 区分配• 大对象直接进入老年代• 长期存活的对象将直接进入老年代当 Eden 区没有足够的空间进行分配时,虚拟机会执行一次Minor GC。Minor GC 通常发生在新生代的 Eden 区,在这个区的对象生存期短,往往发生 Gc 的频率较高,回收速度比较快;Full GC/Major GC 发生在老年代,一般情况下,触发老年代 GC的时候不会触发 Minor GC,但是通过配置,可以在 Full GC 之前进行一次 Minor GC 这样可以加快老年代的回收速度。 十八. JVM 的永久代中会发生垃圾回收么? 垃圾回收不会发生在永久代,如果永久代满了或者是超过了临界值,会触发完全垃圾回收(Full GC)。注:Java 8 中已经移除了永久代,新加了一个叫做元数据区的native 内存区。 十九. Java 中垃圾收集的方法有哪些? 标记 - 清除:这是垃圾收集算法中最基础的,根据名字就可以知道,它的思想就是标记哪些要被回收的对象,然后统一回收。这种方法很简单,但是会有两个主要问题: 效率不高,标记和清除的效率都很低; 会产生大量不连续的内存碎片,导致以后程序在分配较大的对象时,由于没有充足的连续内存而提前触发一次 GC 动作。复制算法:为了解决效率问题,复制算法将可用内存按容量划分为相等的两部分,然后每次只使用其中的一块,当一块内存用完时,就将还存活的对象复制到第二块内存上,然后一次性清楚完第一块内存,再将第二块上的对象复制到第一块。但是这种方式,内存的代价太高,每次基本上都要浪费一般的内存。 于是将该算法进行了改进,内存区域不再是按照 1:1 去划分,而是将内存划分为 8:1:1 三部分,较大那份内存交 Eden 区,其余是两块较小的内存区叫 Survior 区。每次都会优先使用 Eden 区,若 Eden 区满,就将对象复制到第二块内存区上,然后清除 Eden区,如果此时存活的对象太多,以至于 Survivor 不够时,会将这些对象通过分配担保机制复制到老年代中。(java 堆又分为新生代和老年代)标记 - 整理:该算法主要是为了解决标记 - 清除,产生大量内存碎片的问题;当对象存活率较高时,也解决了复制算法的效率问题。它的不同之处就是在清除对象的时候现将可回收对象移动到一端,然后清除掉端边界以外的对象,这样就不会产生内存碎片了。分代收集:现在的虚拟机垃圾收集大多采用这种方式,它根据对象的生存周期,将堆分为新生代和老年代。在新生代中,由于对象生存期短,每次回收都会有大量对象死去,那么这时就采用复制算法。老年代里的对象存活率较高,没有额外的空间进行分配担保。 二十. 什么是类加载器,类加载器有哪些? 实现通过类的权限定名获取该类的二进制字节流的代码块叫做类加载器。主要有一下四种类加载器:• 启动类加载器(Bootstrap ClassLoader)用来加载 Java 核心类库,无法被 Java 程序直接引用。• 扩展类加载器(extensions class loader):它用来加载 Java的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。• 系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java应用的类都是由它来完成加载的。可以通过ClassLoader.getSystemClassLoader() 来获取它。• 用户自定义类加载器,通过继承 java.lang.ClassLoader 类的方式实现。 二十一. 类加载器双亲委派模型机制? 当一个类收到了类加载请求时,不会自己先去加载这个类,而是将其委派给父类,由父类去加载,如果此时父类不能加载,反馈给子类,由子类去完成类的加载。 总结所有的面试题目都不是一成不变的,特别是像一线大厂,上面的面试真题只是给大家一个借鉴作用,最主要的是给自己增加知识的储备,有备无患。给大家分享整理的2019年大厂JVM面试题资料pdf文档以及学习笔记和各知识点学习路线思维脑图还有JVM讲解视频。欢迎大家关注我的公种浩【程序员追风】,文章都会在里面更新,整理的资料也会放在里面。 最后 欢迎大家一起交流,喜欢文章记得关注我点个赞哟,感谢支持!

优秀的个人博客,低调大师

9月腾讯、百度、阿里高频的29道SSM框架面试题解析

一、Spring面试题 1、Spring 在ssm中起什么作用?Spring:轻量级框架作用:Bean工厂,用来管理Bean的生命周期和框架集成。两大核心:1、IOC/DI(控制反转/依赖注入) :把dao依赖注入到service层,service层反转给action层,Spring顶层容器为BeanFactory。2、AOP:面向切面编程2、Spring的事务?编程式事务管理:编程方式管理事务,极大灵活性,难维护。声明式事务管理:可以将业务代码和事务管理分离,用注解和xml配置来管理事务。3、IOC 在项目中的作用?作用:Ioc解决对象之间的依赖问题,把所有Bean的依赖关系通过配置文件或注解关联起来,降低了耦合度。4、Spring的配置文件中的内容?开启事务注解驱动事务管理器开启注解功能,并配置扫描包配置数据库配置SQL会话工厂,别名,映射文件不用编写Dao层的实现类5、Spring下的注解?注册:@Controller @Service @Component注入:@Autowired @Resource请求地址:@RequestMapping返回具体数据类型而非跳转:@ResponseBody6、Spring DI 的三种方式?构造器注入:通过构造方法初始化 <constructor-arg index = "0" type = "java.lang.String" value = "宝马" ></constructor-arg> setter方法注入:通过setter方法初始化 <property name = "id" value = "1111" ></property> 接口注入7、Spring主要使用了什么模式?工厂模式:每个Bean的创建通过方法单例模式:默认的每个Bean的作用域都是单例代理模式:关于Aop的实现通过代理模式8、IOC,AOP的实现原理?IOC:通过反射机制生成对象注入AOP:动态代理 二、SpringMvc面试题 1、SpringMvc 的控制器是不是单例模式,如果是,有什么问题,怎么解决?问题:单例模式,在多线程访问时有线程安全问题解决方法:不要用同步,在控制器里面不能写字段2、SpringMvc 中控制器的注解?@Controller:该注解表明该类扮演控制器的角色3、@RequestMapping 注解用在类上的作用?作用:用来映射一个URL到一个类或者一个特定的处理方法上4、前台多个参数,这些参数都是一个对象,快速得到对象?方法:直接在方法中声明这个对象,SpringMvc就自动把属性赋值到这个对象里面5、SpringMvc中函数的返回值?String,ModelAndView,List,Set 等一般String,Ajax请求,返回一个List集合6、SpringMvc中的转发和重定向?转发:return:“hello”重定向 :return:“redirect:hello.jsp”7、SpringMvc和Ajax之间的相互调用?通过JackSon框架把java里面对象直接转换成js可识别的json对象,具体步骤如下:加入JackSon.jar在配置文件中配置json的映射在接受Ajax方法里面直接返回Object,list等,方法前面需要加上注解@ResponseBody8、SpringMvc的工作流程图? 9、Struts2 和 SpringMvc的区别?入口不同:Struts2:filter过滤器SpringMvc:一个Servlet即前端控制器开发方式不同:Struts2:基于类开发,传递参数通过类的属性,只能设置为多例SpringMvc:基于方法开发(一个url对应一个方法),请求参数传递到方法形参,可以为单例也可以为多例(建议单例)请求方式不同:Struts2:值栈村塾请求和响应的数据,通过OGNL存取数据SpringMvc:通过参数解析器将request请求内容解析,给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过request域传输到页面,jsp视图解析器默认使用的是jstl。 三、Mybatis面试题 1、Ibatis和Mybatis?Ibatis:2010年,apache的Ibatis框架停止更新,并移交给了google团队,同时更名为MyBatis。从2010年后Ibatis在没更新过,彻底变成了一个孤儿框架。一个没人维护的框架注定被mybatis拍在沙滩上。Mybatis:Ibatis的升级版本。2、什么是Mybatis的接口绑定,有什么好处?Mybatis实现了DAO接口与xml映射文件的绑定,自动为我们生成接口的具体实现,使用起来变得更加省事和方便。3、什么情况用注解,什么情况用xml绑定?注解使用情况:Sql语句简单时xml绑定使用情况:xml绑定 (@RequestMap用来绑定xml文件)4、Mybatis在核心处理类叫什么?SqlSession5、查询表名和返回实体Bean对象不一致,如何处理?映射键值对即可 <result column = "title" property = "title" javaType = "java.lang.String" /> column:数据库中表的列名property:实体Bean中的属性名6、Mybatis的好处?把Sql语句从Java中独立出来。封装了底层的JDBC,API的调用,并且能够将结果集自动转换成JavaBean对象,简化了Java数据库编程的重复工作。自己编写Sql语句,更加的灵活。入参无需用对象封装(或者map封装),使用@Param注解7、Mybatis配置一对多? <collection property = "topicComment" column = "id" ofType = "com.tmf.bbs.pojo.Comment" select = "selectComment" /> property:属性名column:共同列ofType:集合中元素的类型select:要连接的查询8、Mybatis配置一对一? <association property = "topicType" select = "selectType" column = "topics_type_id" javaType = "com.tmf.bbs.pojo.Type" /> property:属性名select:要连接的查询column:共同列javaType:集合中元素的类型9 、${} 和 #{}的区别?${}:简单字符串替换,把${}直接替换成变量的值,不做任何转换,这种是取值以后再去编译SQL语句。 {}:预编译处理,sql中的#{}替换成?,补全预编译语句,有效的防止Sql语句注入,这种取值是编译好SQL语句再取值。 总结:一般用#{}来进行列的代替欢迎大家关注我的公种浩【程序员追风】,文章都会在里面更新,整理的资料也会放在里面。10、获取上一次自动生成的主键值? select last _insert_id() 11、Mybatis如何分页,分页原理?RowBounds对象分页在Sql内直接书写,带有物理分页12、Mybatis工作原理? 原理:通过SqlSessionFactoryBuilder从mybatis-config.xml配置文件中构建出SqlSessionFactory。SqlSessionFactory开启一个SqlSession,通过SqlSession实例获得Mapper对象并且运行Mapper映射的Sql语句。完成数据库的CRUD操作和事务提交,关闭SqlSession。 最后欢迎大家一起交流,喜欢文章记得点个赞哟,感谢支持!

优秀的个人博客,低调大师

Java程序员面试中最容易答错的8道面试题,你中坑了吗?

1. static 和 final 的用法 static 的作用从三个方面来谈,分别是静态变量、静态方法、静态类。 静态变量:声明为 static 的静态变量实质上就是全局变量,当声明一个对象时,并不产生static 变量的拷贝,而是该类所有实例变量共用同一个 static 变量。也就是说这个静态变量只加载一次,只分配一块储存空间。 静态方法: 声明为static的静态方法有以下几个特点: (1)静态方法只能调用静态方法; (2)静态方法只能访问静态数据; (3)静态方法不能以任何方式引用this或super; 静态类:通常一个普通类不允许声明为静态,只有一个内部类才可以(main方法就是一个典型),这时这个声明的静态类可以直接作为一个普通类来使用,而不需要实例一个外部类。 final 的作用从变量、方法、类三个方面来理解: final修饰的变量的值不能被修改,是一个常量; final修饰的方法不能被重写; final修饰的类不能被继承; 2. 抽象类和接口的区别,类可以继承多个类吗,接口可以继承多个接口吗,类可以实现多个接口吗? 抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。 抽象类要被子类继承,接口要被类实现。 接口只能做方法声明,抽象类中可以做方法声明,也可以做方法实现 接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。 抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。 抽象方法只能申明,不能实现。abstract void abc();不能写成abstract void abc(){}。 抽象类里可以没有抽象方法 。 如果一个类里有抽象方法,那么这个类只能是抽象类 。 抽象方法要被实现,所以不能是静态的,也不能是私有的。 接口可继承接口,并可多继承接口,但类只能单根继承。 3. this和super的功能和用法 this : (1) 能访问除构造方法以外所有的属性、方法,通过this.来调用方法和属性 (2) 不可以在静态方法中使用 (3) 在构造方法中使用this(参数列表) 调用本类的其它构造方法,必须放在构造方法的第一句。 super :访问父类的方法和属性 (1) 访问父类的方法和属性; (2) 在构造方法中通过 super(参数列表) 来调用父类的构造方法,必须放在子类构造方法里的第一行。 4. final, finally, finalize 的区别? final:修饰符(关键字)有三种用法:如果一个类被声明为final,意味着它不能再派生出新的子类,即不能被继承。将变量声明为final,可以保证它们在使用中不被改变,被声明为final 的变量在初始化以后的引用中只能读取不可修改。被声明为 final 的方法也同样只能使用,不能在子类中被重写。 finally:通常放在try…catch的后面构造总是执行代码块,这就意味着程序无论正常执行还是发生异常,这里的代码只要JVM不关闭都能执行,可以将释放外部资源的代码写在finally块中。 finalize:Object类中定义的方法,Java中允许使用finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在销毁对象时调用的,通过重写finalize() 方法可以整理系统资源或者执行其他清理工作。 5. Error 和 Exception 有什么区别? Error 表示系统级的错误和程序不必处理的异常,是恢复不是不可能但很困难的情况下的一种严重问题;比如内存溢出,不可能指望程序能处理这样的情况; Exception 表示需要捕捉或者需要程序进行处理的异常,是一种设计或实现问题;也就是说,它表示如果程序运行正常,从不会发生的情况。 6. 说出Servlet的生命周期,并说出Servlet和CGI的区别。 Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy()方法。 与CGI的区别在于Servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于Servlet。 7. 如何防止缓存雪崩? 原因: 缓存雪崩可能是因为数据未加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕机。 对应解决: 采用加锁计数,或者使用合理的队列数量来避免缓存失效时对数据库造成太大的压力。这种办法虽然能缓解数据库的压力,但是同时又降低了系统的吞吐量。 分析用户行为,尽量让失效时间点均匀分布。避免缓存雪崩的出现。 如果是因为某台缓存服务器宕机,可以考虑做主备,比如:redis主备,但是双缓存涉及到更新事务的问题,update可能读到脏数据,需要好好解决。 8. 谈谈你对MVC的理解 MVC是Model—View—Controler的简称。即模型—视图—控制器。MVC是一种设计模式,它强制性的把应用程序的输入、处理和输出分开。 MVC中的模型、视图、控制器它们分别担负着不同的任务。 视图: 视图是用户看到并与之交互的界面。视图向用户显示相关的数据,并接受用户的输入。视图不进行任何业务逻辑处理。 模型: 模型表示业务数据和业务处理,相当于JavaBean。一个模型能为多个视图提供数据。这提高了应用程序的重用性。 控制器: 当用户单击Web页面中的提交按钮时,控制器接受请求并调用相应的模型去处理请求,然后根据处理的结果调用相应的视图来显示处理的结果。 MVC的处理过程:首先控制器接受用户的请求,调用相应的模型来进行业务处理,并返回数据给控制器。控制器调用相应的视图来显示处理的结果。并通过视图呈现给用户。 最后 又是一年求职季,在这里,我为各位准备了一套Java程序员精选高频面试笔试真题,来帮助大家攻下BAT的offer,题目范围从初级的Java基础到高级的分布式架构等等一系列的面试题和答案,用于给大家作为参考,需要的可以加入爬坑之路:【860113481】免费获取

优秀的个人博客,低调大师

10道面试官喜欢问的微服务面试题Spring Cloud+Spring Boot

前言为什么要使用微服务?随着互联网的快速发展,各行各业都在用互联网。互联网已经离不开人们的形形色色。随着越来越多的用户,业务场景也愈来愈复杂。传统的单体架构已经很难满足互联网技术发展的要求,代码可维护性扩展性和可读性降低,维护成本的提高都是驱动微服务的发展趋势。 微服务哪些框架 Dubbo,是阿里巴巴服务化治理的核心框架,并被广泛应用于阿里巴巴集团的各成员站点。阿里巴巴近几年对开源社区的贡献不论在国内还是国外都是引人注目的,比如:JStorm 捐赠给 Apache 并加入 Apache 基金会等,为中国互联网人争足了面子,使得阿里巴巴在国人眼里已经从电商升级为一家科技公司了。Spring Cloud,从命名我们就可以知道,它是 Spring Source 的产物,Spring 社区的强大背书可以说是 Java 企业界最有影响力的组织了,除了 Spring Source 之外,还有Pivotal 和 Netfix 是其强大的后盾与技术输出。其中 Netflix 开源的整套微服务架构套件是Spring Cloud 的核心。 说说 RPC 的实现原理 首先需要有处理网络连接通讯的模块,负责连接建立、管理和消息的传输。其次需要有编解码的模块,因为网络通讯都是传输的字节码,需要将我们使用的对象序列化和反序列化。剩下的就是客户端和服务器端的部分,服务器端暴露要开放的服务接口,客户调用服务接口的一个代理实现,这个代理实现负责收集数据、编码并传输给服务器然后等待结果返回。 说说 Dubbo 的实现原理 dubbo 作为 rpc 框架,实现的效果就是调用远程的方法就像在本地调用一样。如何做到呢?就是本地有对远程方法的描述,包括方法名、参数、返回值,在 dubbo 中是远程和本地使用同样的接口;然后呢,要有对网络通信的封装,要对调用方来说通信细节是完全不可见的,网络通信要做的就是将调用方法的属性通过一定的协议(简单来说就是消息格式)传递到服务端;服务端按照协议解析出调用的信息;执行相应的方法;在将方法的返回值通过协议传递给客户端;客户端再解析;在调用方式上又可以分为同步调用和异步调用;简单来说基本就这个过程 Spring Boot 有哪些优点? Spring Boot 的优点有:减少开发,测试时间和努力。使用 JavaConfig 有助于避免使用 XML。避免大量的 Maven 导入和各种版本冲突。提供意见发展方法。通过提供默认值快速开始开发。没有单独的 Web 服务器需要。这意味着你不再需要启动 Tomcat,Glassfish 或其他任何东西。需要更少的配置 因为没有 web.xml 文件。只需添加用@ Configuration 注释的类,然后添加用@Bean 注释的方法,Spring 将自动加载对象并像以前一样对其进行管理。您甚至可以将@Autowired 添加到 bean 方法中,以使 Spring 自动装入需要的依赖关系中。基于环境的配置 使用这些属性,您可以将您正在使用的环境传递到应用程序:-Dspring.profiles.active = {enviornment}。在加载主应用程序属性文件后,Spring 将在(application{environment} .properties)中加载后续的应用程序属性文件。如何实现 Spring Boot 应用程序的安全性?为了实现 Spring Boot 的安全性,我们使用 spring-boot-starter-security 依赖项,并且必须添加安全配置。它只需要很少的代码。配置类将必须扩展 WebSecurityConfigurerAdapter 并覆盖其方法。 如何集成 Spring Boot 和 ActiveMQ? 对于集成 Spring Boot 和 ActiveMQ,我们使用spring-boot-starter-activemq依赖关系。 它只需要很少的配置,并且不需要样板代码。 什么是 Swagger?你用 Spring Boot 实现了它吗? Swagger 广泛用于可视化 API,使用 Swagger UI 为前端开发人员提供在线沙箱。Swagger 是用于生成 RESTful Web 服务的可视化表示的工具,规范和完整框架实现。它使文档能够以与服务器相同的速度更新。当通过 Swagger 正确定义时,消费者可以使用最少量的实现逻辑来理解远程服务并与其进行交互。因此,Swagger 消除了调用服务时的猜测。 使用 Spring Cloud 有什么优势? 使用 Spring Boot 开发分布式微服务时,我们面临以下问题与分布式系统相关的复杂性-这种开销包括网络问题,延迟开销,带宽问题,安全问题。服务发现-服务发现工具管理群集中的流程和服务如何查找和互相交谈。它涉及一个服务目录,在该目录中注册服务,然后能够查找并连接到该目录中的服务。冗余-分布式系统中的冗余问题。负载平衡 --负载平衡改善跨多个计算资源的工作负荷,诸如计算机,计算机集群,网络链路,中央处理单元,或磁盘驱动器的分布。性能-问题 由于各种运营开销导致的性能问题。部署复杂性-Devops 技能的要求。 负载平衡的意义什么? 在计算中,负载平衡可以改善跨计算机,计算机集群,网络链接,中央处理单元或磁盘驱动器等多种计算资源的工作负载分布。负载平衡旨在优化资源使用,最大化吞吐量,最小化响应时间并避免任何单一资源的过载。使用多个组件进行负载平衡而不是单个组件可能会通过冗余来提高可靠性和可用性。负载平衡通常涉及专用软件或硬件,例如多层交换机或域名系统服务器进程。 什么是 Netflix Feign?它的优点是什么? Feign 是受到 Retrofit,JAXRS-2.0 和 WebSocket 启发的 java 客户端联编程序。Feign 的第一个目标是将约束分母的复杂性统一到 http apis,而不考虑其稳定性。在 employee-consumer 的例子中,我们使用了 employee-producer 使用 REST 模板公开的 REST 服务。但是我们必须编写大量代码才能执行以下步骤使用功能区进行负载平衡。获取服务实例,然后获取基本 URL。利用 REST 模板来使用服务。 前面的代码如下 @Controller public class ConsumerControllerClient { @Autowired private LoadBalancerClient loadBalancer; public void getEmployee() throws RestClientException, IOException { ServiceInstance serviceInstance=loadBalancer.choose("employee-producer"); System.out.println(serviceInstance.getUri()); String baseUrl=serviceInstance.getUri().toString(); baseUrl=baseUrl+"/employee"; RestTemplate restTemplate = new RestTemplate(); ResponseEntity<String> response=null; try{ response=restTemplate.exchange(baseUrl, HttpMethod.GET, getHeaders(),String.class); }catch (Exception ex) { System.out.println(ex); } System.out.println(response.getBody()); } 之前的代码,有像 NullPointer 这样的例外的机会,并不是最优的。我们将看到如何使用 Netflix Feign使呼叫变得更加轻松和清洁。如果 Netflix Ribbon 依赖关系也在类路径中,那么 Feign 默认也会负责负载平衡。 喜欢文章记得点个赞,感谢支持!

优秀的个人博客,低调大师

【数道云】教育行业需要了解的大数据,武汉Hadoop大数据平台如何搭建?

从教育行业的需求出发,去分析互联网时代教育行业需要了解的大数据,以及大数据平台的搭建应该注意什么? 中国—教育规模较大的国家之一,随着互联网的发展,海量的教育大数据将不断产生,如何有效科学的利用数据资源成为互联网教育行业发展的关键。 近年来,教育行业的大数据不断发展,市场上出现了诸多大数据产品,去帮助教育行业对各类数据进行采集、分类、数据信息分析等等多种管理。那么,教育行业面对这样的现状,应该如何去正确应用大数据?构建一个有效便捷的教育行业大数据应用平台,需要着重考虑大数据平台体系架构、大数据建模与存储管理、大数据分析处理以及大数据应用等等。教育行业大数据的使用范畴 : 1.对数据的采集分析对学生画像、学生行为预警、学生家庭经济状况分析、学生综合数据检索、学生群体分析等功能应用,更好分辨学生在专业学习或就业方向上的潜能,为学生提供个性化的管理与培养方案。(数据采集分析,波若数据采集) 2.舆情分析实时爬取、分析校园各类数据,监测校园舆情,优化校园资源配置,为校方提供建设管理决策,舆情分析从二个方面去解析:教育行业品牌舆情采集互联网关于某教育行业的数据信息,并对其进行分析,是否存在不利于该教育行业发展不利的或者对其教育机构信誉不好的,及时进行调整,帮助教育行业建立良好的品牌形象。竞争对手分析对互联网关于教育行业的数据进行采集,然后分析各个教育机构做的优势,然后进行借鉴,去增强自己的品牌。(舆情监控、舆情分析,波若舆情) 3.教育机构精准定位教育机构根据每年各专业招生计划、今年开课计划、往年教学安排等多种条件,基于教学资源开展数据分析,对教学活动中各项资源给出预测及预警。也有高校正在探讨通过导入和聚合各类的科研原始数据,建立多维度的高校科研指标数据分析服务,并精准地找到与学校需求更加契合的外部人才。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册