让我们一起把代码变的更优雅一点。

0%

Java面向对象编程三大特性: 封装 继承 多态

封装

​ 封装把⼀个对象的属性私有化,同时提供⼀些可以被外界访问的属性的方法,如果属性不想被外界访问,我们大可不必提供方法给外界访问。但是如果⼀个类没有提供给外界访问的方法,那么这个类也没有什么意义了。

继承

​ 继承是使用已存在的类的定义作为基础建⽴新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承我们能够⾮常方便地复用以前的代码。

关于继承如下 3 点请记住:

  1. 子类拥有父类对象所有的属性和方法(包括私有属性和私有方法),但是父类中的私有属性和方法子类是⽆法访问,只是拥有。

  2. 子类可以拥有自己属性和方法,即子类可以对父类进⾏扩展。

  3. 子类可以用自己的方式实现父类的方法。(以后介绍)。

多态

​ 所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运⾏期间才确定,即⼀个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运⾏期间才能决定。

在 Java 中有两种形式可以实现多态:继承(多个子类对同⼀方法的重写)和接口(实现接口并覆盖接口中同⼀方法)。

阅读全文 »

面试题整理

拦截器跟监听器的执行顺序(两遍)
1.spring跟springboot都什么区别

​ Spring是一个开源框架,主要是为了解决企业开发的复杂性而创建的,给开发java应用程序提供了很多基础架构的支持,它包含了一些很好的功能,比如依赖注入和开箱即用的模块,比如Springmvc,Spring JDBC等,提高了我们的开发效率。

​ Spring boot的话它设计目的是用来简化Spring应用的初始搭建以及开发过程,基本上是spring框架的扩展,它不需要设置spring所需要的xml配置了,提高了我们的开发效率,还内嵌了Tomcat等一些容器,可以直接跑起来,不需要做部署了,这就是我理解的它们之间的区别。

2.什么是AOP,项目中哪些地方用到了AOP

AOP就是面向切面编程,它可以让我们在不修改之前业务逻辑的基础上可以动态的增加功能,从而使我们业务逻辑各部分耦合度降低,同时还提高了我们的开发效率,

(哪儿用到了就需要自己想项目中哪用到了,可以说用来做日志,安全或异常处理功能。)

阅读全文 »

经典面试题整理

MyBatis面试题

#{} 和 ${} 的区别是什么?
  1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。$将传入的数据直接显示生成在sql中。

  2. #方式能够很大程度防止sql注入,提高系统安全性,$方式无法防止Sql注入。

  3. mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值。

  4. Mybatis在处理 ${} 时,就是把${}替换成变量的值,直接进行sql拼接,在处理#的时候会替换为?号,调用PreparedStatement的set方法来赋值

阅读全文 »

什么是微服务

微服务:简单来说微服务就是很小的服务,小到一个服务只对应一个单一的功能,只做一件事。这个服务可以单独部署运行,服务之间可以通过RPC来相互交互,每个微服务都是由独立的小团队开发,测试,部署,上线,负责它的整个生命周期。

SpringBoot和SpringCloud的区别?

SpringBoot专注于快速方便的开发单个个体微服务。

SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务整合并管理起来,

为各个微服务之间提供,配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等集成服务

SpringBoot可以离开SpringCloud独立使用开发项目, 但是SpringCloud离不开SpringBoot ,属于依赖的关系

SpringBoot专注于快速、方便的开发单个微服务个体,SpringCloud关注全局的服务治理框架。

什么是Spring Cloud?⭐

我所理解的 Spring Cloud 就是微服务系统架构的一站式解决方案,在平时我们构建微服务的过程中需要做如 服务发现注册配置中心消息总线负载均衡断路器数据监控 等操作,而 Spring Cloud 为我们提供了一套简易的编程模型,使我们能在 Spring Boot 的基础上轻松地实现微服务项目的构建。

阅读全文 »

分布式事务

首先解释一下关于本地事务与分布式事务

1.事务

​ 事务指的就是一个操作单元,在这个操作单元中的所有操作最终要保持一致的行为,要么所有操作

都成功,要么所有的操作都被撤销。简单地说,事务提供一种“要么什么都不做,要么做全套”机制。

2.本地事物

​ 本地事物其实可以认为是数据库提供的事务机制。说到数据库事务就不得不说,数据库事务中的四

大特性:

​ A:原子性(Atomicity),一个事务中的所有操作,要么全部完成,要么全部不完成

​ C:一致性(Consistency),在一个事务执行之前和执行之后数据库都必须处于一致性状态

​ I:隔离性(Isolation),在并发环境中,当不同的事务同时操作相同的数据时,事务之间互不影响

​ D:持久性(Durability),指的是只要事务成功结束,它对数据库所做的更新就必须永久的保存下来

​ 数据库事务在实现时会将一次事务涉及的所有操作全部纳入到一个不可分割的执行单元,该执行单元中的所有操作要么都成功,要么都失败,只要其中任一操作执行失败,都将导致整个事务的回滚

分布式事务的实现主要有以下 5 种方案

XA方案(两阶段提交)

​ 第一阶段:询问,事务管理器会要求每个涉及到事务的数据库预提交(pre commit)这个操作,并反映是否可以提交,如果每个数据库都回复 ok,那么就正式提交事务,在各个数据库上执行操作;如果任何其中一个数据库回答不 ok,那么就回滚事务。

​ 第二阶段:执行

阅读全文 »

Web应用常见的攻击方式

SQL 注入

​ SQL 注入就是通过给 web 应用接口传入一些特殊字符,达到欺骗服务器执行恶意的 SQL 命令。

​ SQL 注入漏洞属于后端的范畴,但前端也可做体验上的优化。

原因

​ 当使用外部不可信任的数据作为参数进行数据库的增、删、改、查时,如果未对外部数据进行过滤,就会产生 SQL 注入漏洞。

解决方案

​ 具体的解决方案很多,但大部分都是基于一点:不信任任何外部输入。

​ 所以,对任何外部输入都进行过滤,然后再进行数据库的增、删、改、查。

​ 此外,适当的权限控制、不曝露必要的安全信息和日志也有助于预防 SQL 注入漏洞。

阅读全文 »

SpringBoot是什么?

它是一种创建独立应用程序的更简单方法,只需要很少或没有配置,从本质上来说,Spring Boot就是Spring

Spring Boot的主要优点

  1. 开发基于 Spring 的应用程序很容易。
  2. Spring Boot 项目所需的开发或工程时间明显减少,通常会提高整体生产力。
  3. Spring Boot不需要编写大量样板代码、XML配置和注释。
  4. Spring引导应用程序可以很容易地与Spring生态系统集成,如Spring JDBC、Spring ORM、Spring Data、Spring Security等。
  5. Spring Boot遵循“固执己见的默认配置”,以减少开发工作(默认配置可以修改)。
  6. Spring Boot 应用程序提供嵌入式HTTP服务器,如Tomcat和Jetty,可以轻松地开发和测试web应用程序。(这点很赞!普通运行Java程序的方式就能运行基于Spring Boot web 项目,省事很多)
  7. Spring Boot提供命令行接口(CLI)工具,用于开发和测试Spring Boot应用程序,如Java或Groovy。
  8. Spring Boot提供了多种插件,可以使用内置工具(如Maven和Gradle)开发和测试Spring Boot应用程序。

什么是 Spring Boot Starters?

​ Spring Boot Starters 是一系列依赖关系的集合,因为它的存在,项目的依赖之间的关系对我们来说变的更加简单了。

​ 举个例子:在没有 Spring Boot Starters 之前,我们开发 REST 服务或 Web 应用程序时; 我们需要使用像Spring MVC,Tomcat 和 Jackson 这样的库,这些依赖我们需要手动一个一个添加。但是,有了 Spring Boot Starters 我们只需要一个只需添加一个spring-boot-starter-web一个依赖就可以了,这个依赖包含的字依赖中包含了我们开发 REST 服务需要的所有依赖。

如何在 Spring Boot 应用程序中使用 Jetty 而不是 Tomcat?

​ Spring Boot (spring-boot-starter-web)使用 Tomcat 作为默认的嵌入式 servlet 容器, 如果你想使用 Jetty 的话只需要修改pom.xml(Maven)或者build.gradle(Gradle)就可以了。

Maven:

阅读全文 »

谈谈spring的理解?⭐

​ 我对spring的理解就是,spring是一个轻量级的框架,提⾼开发⼈员的开发效率以及系统的可维护性,它最核心的概念就是IOC跟AOP,创建Spring的目的就是用来替代更加重量级的的企业级Java技术。它包含了一些很好的功能,比如依赖注入和开箱即用的模块,比如Springmvc,Spring JDBC等,提高了我们的开发效率。

Spring跟SpringBoot都什么区别

spring boot的话它设计目的是用来简化Spring应用的初始搭建以及开发过程,基本上是spring框架的扩展,它不需要设置spring所需要的xml配置了,提高了我们的开发效率,还内嵌了tomcat等一些容器,可以直接跑起来,不需要做部署了,这就是我理解的它们之间的区别,谢谢。

什么是 AOP?⭐

​ AOP就是面向切面编程,能够将那些与业务⽆关,却为业务模块所共同调用的逻辑或责任(例如事务处理、⽇志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,提高未来的可拓展性,同时还提高了我们的开发效率。

Spring AOP就是基于动态代理的,如果要代理的对象,实现了某个接⼝,那么Spring AOP会使用 JDK Proxy,去创建代理对象,⽽对于没有实现接⼝的对象,就⽆法使用 JDK Proxy 去进⾏代理了,这时候Spring AOP会使用Cglib ,这时候Spring AOP会使用 Cglib ⽣成⼀个被代理对象的⼦类来作为代理

什么是 IOC?⭐

​ IOC控制反转,它是一种编程思想,就是 将原本在程序中⼿动创建对象的控制权,交由Spring框架来管理。对于 spring 框架来说,就是由 spring 来负责控制对象的创建,维护,销毁等生命周期和对象间的关系。

IOC 容器就像是⼀个⼯⼚⼀样,当我们需要创建⼀个对象的时候,只需要配置好配置⽂件**/**注解即可,完全不用考虑对象是如何被创建出来的,如果利用 IOC的话,你只需要配置好,然后在需要的地⽅引用就⾏了,这⼤⼤增

阅读全文 »

Redis 是什么?都有哪些使用场景?

简单来说 Redis 就是⼀个使用 C 语⾔开发的数据库,不过与传统数据库不同的是 redis 的数据是存在内存中的,所以读写速度非常快,因此 redis 被广泛应用于缓存方向,另外,Redis 除了做缓存之外,Redis 也经常用来做分布式锁,甚⾄是消息队列。

Redis 提供了多种数据类型来⽀持不同的业务场景。Redis 还⽀持事务 、持久化、Lua 脚本、多种集群⽅案

Redis 使用场景:

  • 记录帖子点赞数、点击数、评论数;
  • 缓存近期热帖;
  • 缓存文章详情信息;
  • 记录用户会话信息。

Redis 支持的数据类型有哪些?⭐

Redis 支持的数据类型:string(字符串)、list(列表)、hash(字典)、set(集合)、zset(有序集合)。

Redis 的持久化机制是什么?⭐

Redis 的持久化有两种方式,Redis的一种持久化方式叫快照 RDB,另一种方式是只追加文件 AOF

RDB:RDB是Redis默认的持久化方式。按照一定的时间将内存的数据以快照的形式保存到硬盘中

阅读全文 »

BIO,NIO和AIO有啥区别?

  • BIO (Blocking I/O): 同步阻塞 I/O 模式,数据的读取写入必须阻塞在一个线程内等待其完成。在客户端连接数量不高的情况下,是没问题的。但是,当面对十万甚至百万级连接的时候,传统的 BIO 模型是无能为力的。因此,我们需要一种更高效的 I/O 处理模型来应对更高的并发量。
  • NIO (Non-blocking/New I/O): NIO 是一种同步非阻塞的 I/O 模型,于 Java 1.4 中引入,对应 java.nio 包,提供了 Channel , Selector,Buffer 等抽象。NIO 中的 N 可以理解为 Non-blocking,不单纯是 New。它支持面向缓冲的,基于通道的 I/O 操作方法。 NIO 提供了与传统 BIO 模型中的 SocketServerSocket 相对应的 SocketChannelServerSocketChannel 两种不同的套接字通道实现,两种通道都支持阻塞和非阻塞两种模式。对于高负载、高并发的(网络)应用,应使用 NIO 的非阻塞模式来开发
  • AIO (Asynchronous I/O): AIO 也就是 NIO 2。在 Java 7 中引入了 NIO 的改进版 NIO 2,它是异步非阻塞的 IO 模型。异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。AIO 是异步 IO 的缩写,虽然 NIO 在网络操作中,提供了非阻塞的方法,但是 NIO 的 IO 行为还是同步的。对于 NIO 来说,我们的业务线程是在 IO 操作准备好时,得到通知,接着就由这个线程自行进行 IO 操作,IO 操作本身是同步的。查阅网上相关资料,我发现就目前来说 AIO 的应用还不是很广泛,Netty 之前也尝试使用过 AIO,不过又放弃了。

Netty 是什么?

  • Netty 是⼀个 基于 NIO 的 client-server(客户端服务器)框架,使用它可以快速简单地开发网络应用程序。

  • 它极大地简化并优化了 TCP 和 UDP 套接字服务器等网络编程,并且性能以及安全性等很多方面甚至都要更好。

  • 持多种协议 如 FTP,SMTP,HTTP 以及各种⼆进制和基于⽂本的传统协议。

用官方的总结就是:Netty 成功地找到了⼀种在不妥协可维护性和性能的情况下实现易于开发,性能,稳定性和灵活性的方法。

除了上面介绍的之外,很多开源项⽬⽐如我们常用的 Dubbo、RocketMQ、Elasticsearch、gRPC 等等都用到了 Netty。

为什么要用 Netty 呢?能不能说⼀下自己的看法。

​ 因为 Netty 具有下面这些优点,并且相⽐于直接使用 JDK ⾃带的 NIO 相关的 API 来说更加易用

  • 统⼀的 API,⽀持多种传输类型,阻塞和非阻塞的
  • 简单⽽强大的线程模型
  • ⾃带编解码器解决 TCP 粘包/拆包问题。
  • ⾃带各种协议栈。
  • 真正的⽆连接数据包套接字⽀持。
  • ⽐直接使用 Java 核⼼ API 有更⾼的吞吐量、更低的延迟、更低的资源消耗和更少的内存复制。
  • 安全性不错,有完整的 SSL/TLS 以及 StartTLS ⽀持。
  • 社区活跃,成熟稳定,经历了大型项⽬的使用和考验,⽽且很多开源项⽬都使用到了 Netty, ⽐如我们经常接触的 Dubbo、RocketMQ 等等。
阅读全文 »