-
java面向对象编程
面向对象(概念):
现实世界存在的任务事物都可以称之为对象,面向对象是对现实世界建模的一种方式,将一种抽象的思想给具体实例化,
对象中包含的内容特征是它的属性,对象的一些操作行为是它的方法。例如简历就是一个对象,里面的内容是它的属性,
看、拿、放都可以称为这个对象的方法。
-
三大特性:
-
封装:
封装,就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。
-
继承:
继承,指可以让某个类型的对象获得另一个类型的对象的属性和方法。它支持按级分类的概念。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”,“父类”或“超类”。继承的过程,就是从一般到特殊的过程。要实现继承,可以通过“继承”和“组合”来实现。继承概念的实现方式有两类:实现继承与接口继承。实现继承是指直接使用基类的属性和方法而无需额外编码的能力;接口继承是指仅使用属性和方法的名称,但是子类必须提供实现的能力。
-
多态:
多态,是指一个类实例的相同方法在不同情形有不同表现形式。多态机制使具有不同结构内部的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。
-
-
五大原则
-
单一职责原则(SRP)
是指一个类的功能要单一,不能包罗万象。如同一个人一样,分配的工作不能太多,否则一天到晚虽然忙忙碌碌的,但效率却高不起来。
-
开放封闭原则(OCP)
一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。
-
里氏替换原则(LSP)
子类应当可以替换父类并出现在父类能够出现的任何地方。
-
依赖倒置原则(DIP)
高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。
依赖倒置的核心思想是面向接口编程。 依赖倒置的一个核心原则就是降低耦合性 -
接口分离原则(ISP)
模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来。
-
-
高内聚,低耦合
-
高内聚
高内聚是针对类内部的方法而言,把程序的功能尽量分散,别在一个类里只写一个方法,这样会给调试等带来很多麻烦。
所谓高内聚是指一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一原则。
-
低耦合
低耦合是针对类与类之间的关系而定,意思是类之间的关系要简单,不要有很强的依赖关系,不然,运行起来就会出问题,使一个类的运行影响到其他的类。
-
-
接口和抽象的区别
接口和抽象类的概念不一样。接口是对动作的抽象,抽象类是对根源的抽象。 抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。 当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。 -
常用的设计模式
-
单例模式
一个类在java虚拟机中只有一个对象,并提供一个全局访问点
- 解决问题:对象的唯一性,性能浪费太多。
- 应用场景:数据库连接对象,属性配置文件的读取对象。
- 模式结构:饿汉式和懒汉式(如果考虑性能的话,就用懒汉式,因为懒汉式是在方法里面进行初始化的),构造器私有化,对外提供方法加同步关键字。
饿汉式: public class HurgrySingleton { private static HurgrySingleton hurgry=new HurgrySingleton(); private HurgrySingleton(){}; public static HurgrySingleton getSinletonHurgry(){ return hurgry; } }懒汉式: public class LarzySingleton { private static LarzySingleton larzy=null; private LarzySingleton(){}; public static synchronized Larzy getSinletonLarzy(){ if(larzy==null){ larzy=new LarzySingleton(); } return larzy; } } -
简单工厂
用一个方法来代替new关键字
Spring的核心就是工厂模式。
- 解决问题:对象产生过多,或者经常有子类替换生成。
- 应用场景:对于经常生成的对象,或者父子类替换生成。
- 模式结构:写一个对外声明的方法,方法里面使用new关键字代替。
-
-
1. 定义一个操作的接口: public interface Operation { public double getResult(double numberA,double numberB) throws Exception; } 2. 定义具体的操作类: public class Add implements Operation{ // 加法计算 public double getResult(double numberA, double numberB) { return numberA + numberB; } } public class Sub implements Operation{ // 减法计算 public double getResult(double numberA, double numberB) { return numberA-numberB; } } public class Mul implements Operation{ // 乘法计算 public double getResult(double numberA, double numberB) { return numberA * numberB; } } public class Div implements Operation { // 除法计算 public double getResult(double numberA, double numberB) throws Exception { if (numberB == 0) { throw new Exception("除数不能为0!"); } return numberA / numberB; } } 3.定义简单工厂类 public class EasyFactory { // 简单工厂,根据字符串创建相应的对象 public static Operation createOperation(String name) { Operation operationObj = null; switch (name) { case "+": operationObj = new Add(); break; case "-": operationObj = new Sub(); break; case "*": operationObj = new Mul(); break; case "/": operationObj = new Div(); break; } return operationObj; } } 4.测试 public class Client { public static void main(String[] args) throws Exception { Operation add = EasyFactory.createOperation("+"); Operation sub = EasyFactory.createOperation("-"); Operation mul = EasyFactory.createOperation("*"); Operation div = EasyFactory.createOperation("/"); } }-
代理模式(Proxy)
为其他对象提供一个代理,以控制对当前对象的访问
Spring里面的AOP实现。
- 解决问题:不能直接访问该对象,或者太大的资源耗费多。
- 应用场景:权限,或者大对象的访问权限。
- 模式结构:代理类和被代理类实现同一个接口,用户访问的时候先访问代理对象,然后让代理对象去访问被代理对象。
创建一个接口: public interface SellHouse { void sell(double money); } 创建一个被代理类: public class Hoster implements SellHouse { @Override public void sell(double money) { System.out.println("祝你居住愉快"); } } 创建一个代理类: public class Medium implements SellHouse { SellHouse hoster=new Hoster(); @Override public void sell(double money) { if(money>=1000){ hoster.sell(money); }else{ System.out.println("你的价格太低了"); } } } 测试类: public class Renter { public static void main(String[] args) { SellHouse renter=new Medium(); renter.sell(500); } } -
适配器模式
将两个原来不兼容的类兼容起来一起工作
类适配器和对象适配器的区别:类适配器通过继承来完成适配,对象适配器则是通过关联(组合)来完成。
-
解决问题:以及存在的相同功能的代码,但是接口不兼容,不能直接调用。
-
应用场景:在使用旧的API的时候,没有源码,和新的不能兼容。
-
模式结构:分为类适配器和对象适配,一般常用的就是对象适配器,因为组合优于继承。
-
类适配器:
在目标接口中的 request() 调用 Adaptee 的 adapteeRequest() 方法呢?
已存在的将被适配的类: public class Adaptee { public void adapteeRequest() { System.out.println("被适配者的方法"); } } 定义一个目标接口: public interface Target { void request(); } 适配器类: public class Adapter extends Adaptee implements Target{ @Override public void request() { //...一些操作... super.adapteeRequest(); //...一些操作... } }- 对象适配器:
public class Adapter implements Target{ // 适配者是对象适配器的一个属性 private Adaptee adaptee = new Adaptee(); @Override public void request() { //... adaptee.adapteeRequest(); //... } } -
-
策略模式
定义一系列算法并可以互相替换
- 解决问题:做一件事情有很多种方法。
- 应用场景:购物车里面的付款方式。
- 模式结构:声明一个顶级接口,定义一个策略方法,具体的实例都要实现这个接口。
定义一个顶级接口: public interface Person { void repast(); } 具体的实例类1: public class African implements Person { @Override public void repast() { System.out.println("非洲人用手吃饭"); } } 具体的实例类2: public class America implements Person { @Override public void repast() { System.out.println("美国人用刀叉吃饭"); } } 具体的实例类3: public class Chinese implements Person { @Override public void repast() { System.out.println("中国人用筷子吃饭"); } } 测试类: public class Test { public static void main(String[] args) { Person chinese=new Chinese(); Person america=new America(); Person african=new African(); chinese.repast(); america.repast(); african.repast(); } }
-
-
项目管理工具
-
Maven
- 优点:
- Maven是一个项目管理和综合工具。Maven提供了开发人员构建一个完整的生命周期框架。
- 在多个开发团队环境时,Maven可以设置按标准在非常短的时间里完成配置工作,使开发人员的工作更加轻松。
- Maven增加可重用性并负责建立相关的任务。
- 缺点:
- maven是一个庞大的构建系统,学习难度大
- maven采用约定优于配置的策略(convention overconfiguration),虽然上手容易,但是一旦出了问题,难于调试。
- 当依赖很多时,m2eclipse 老是搞得Eclipse很卡。
- 中国的网络环境差,很多repository无法访问,比如google code, jboss 仓库无法访问等。
-
SVN
- 优点:
- 管理方便,逻辑明确,符合一般人思维习惯。
- 易于管理,集中式服务器更能保证安全性。
- 代码一致性非常高。
- 适合开发人数不多的项目开发。
- 缺点:
- 服务器压力太大,数据库容量暴增。
- 如果不能连接到服务器上,基本上不可以工作,看上面第二步,如果服务器不能连接上,就不能提交,还原,对比等等。
- 不适合开源开发(开发人数非常非常多,但是Google app engine就是用svn的)。但是一般集中式管理的有非常明确的权限管理机制(例如分支访问限制),可以实现分层管理,从而很好的解决开发人数众多的问题。
-
Git
- 优点:
- 适合分布式开发,强调个体。
- 公共服务器压力和数据量都不会太大。
- 速度快、灵活。
- 任意两个开发者之间可以很容易的解决冲突。
- 离线工作。
- 缺点:
- 学习周期相对而言比较长。
- 不符合常规思维。
- 代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。
-
-
常用的一些开源框架
-
Spring
Spring是一个轻量级的IOC和AOP容器框架。是为java应用程序提供基础性服务的一套框架,目的是简化企业应用程序的开发,它使得开发者只需要关心业务需求。
-
AOP:面向切面编程
AOP:面向切面编程,将跟业务逻辑没有关系的代码提取出来,在调用目标方法之前或者之后执行。 常用的场景,事务,日志,权限控制,异常处理等方面。
AOP实现的关键在于代理模式,AOP代理主要分为静态代理和动态代理。
- AspectJ是静态代理的增强,所谓静态代理,就是AOP框架会在编译阶段生成AOP代理类,因此也称为编译时增强,他会在编译阶段将AspectJ(切面)织入到java字节码中,运行的时候就是增强之后的AOP对象。
- Spring AOP使用的是动态代理,所谓的动态代理就是说AOP框架不会去修改字节码。而是每次运行时在内存里临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。
SpringAOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理
-
IOC:控制反转
IOC:创建对象的权利,交给spring容器创建。
-
DI:依赖注入
DI:如果一个对象A需要使用另一个对象B才能实现某个功能,这时就可以说A对象依赖于B对象, 而spring容器在创建A对象时,会自动将A对象需要的B注入到A对象中,此过程就是依赖注入。
-
核心容器
核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory, 它是工厂模式的实现。BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置 和依赖性规范与实际的应用程序代码分开。
-
Spring上下文
Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务, 例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。
-
Spring DAO:
JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的 错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和 关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
-
Spring ORM:
Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、 Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
-
Spring Web 模块
Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以, Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及 将请求参数绑定到域对象的工作。
-
-
SpringMVC
-
对SpringMVC框架的理解:
mvc指的是Model(业务模型),View(视图),Controller(控制器)
SpringMVC就是Spring框架的一个模块,所以它可以和spring框架进行无缝结合,它是一个基于mvc设计思想的前端web层框架,主要作用就是对前端请求进行处理。它的前端控制器是一个servlet,它的请求拦截是基于方法级别的。
-
执行流程:
SpringMVC框架主要由DispatcherServlet,处理器映射,处理器(控制器),视图解析器,视图组成。
1. 客户端请求提交到DispatcherServlet 2. 由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller 3. DispatcherServlet将请求提交到Controller 4. Controller调用业务逻辑处理后,返回ModelAndView 5. DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图 6. 视图负责将结果展示到客户端
-
-
SpringBoot
-
什么是springboot?
Spring Boot基本上是Spring框架的扩展,它消除了设置Spring应用程序所需的XML配置,为更快,更高效的开发生态系统铺平了道路。
Spring Boot应用程序的入口点是使用@SpringBootApplication注释的类
- 用来简化spring应用的初始搭建以及开发过程 使用特定的方式来进行配置(propertites或yml文件)
- 创建独立的spring应用程序main方法运行
- 嵌入的tomcat无需部署war文件
- 简化maven配置
- 自动配置spring 添加对应功能starter自动化配置
-
springboot常用的starter有哪些?
spring-boot-starter-web嵌入tomcat和webkaifa需要servlet与jsp支持
spring-boot-starter-data-jpa数据库支持
spring-boot-starter-data-redis数据库支持
spring-boot-starter-data-solr solr支持
mybatis-spring-boot-starter第三方的mybatis集成starter
-
springboot自动配置的原理
在spring程序main方法中添加@SpringBootApplication或者@EnableAutoConfiguration会自动去maven中读取每个starter中的spring.factories文件,该文件配置了所有需要被创建spring容器中的bean
-
springboot读取配置文件的方式
springboot默认读取配置文件为application.properties或者application.yml
-
@SpringBootApplication 是做什么的?
根据 Spring Boot 文档, @SpringBootApplication 注解相当于使用 @Configuration 、@EnableAutoConfiguration 和 @ComponentScan 及其默认属性。Spring Boot 允许开发人员使用单个注解而不是多个注解。但是,正如我们所知,Spring 提供了松散耦合的特性,我们可以根据项目的需要单独使用每个注解。
-
Spring Boot有哪些优点?
- 快速创建独立运行的spring项目与主流框架集成
- 使用嵌入式的servlet容器,应用无需打包成war包
- starters自动依赖与版本控制
- 大量的自动配置,简化开发,也可修改默认值
- 准生产环境的运行应用监控
- 与云计算的天然集成
-
Spring Boot中的监视器是什么?
Spring boot actuator是spring启动框架中的重要功能之一。Spring boot监视器可帮助您访问生产环境中正在运行的应用程序的当前状态。 有几个指标必须在生产环境中进行检查和监控。即使一些外部应用程序可能正在使用这些服务来向相关人员触发警报消息。监视器模块公开了一组可直接作为HTTP URL访问的REST端点来检查状态。
-
springboot自动配置的原理
在spring程序main方法中 添加@SpringBootApplication或者@EnableAutoConfiguration 会自动去maven中读取每个starter中的spring.factories文件 该文件里配置了所有需要被创建spring容器中的bean
-
总结Spring Boot Starter的工作原理
- Spring Boot 在启动时扫描项目所依赖的JAR包,寻找包含spring.factories文件的JAR
- 根据spring.factories配置加载AutoConfigure类
- 根据 @Conditional注解的条件,进行自动配置并将Bean注入Spring Context
-
Spring Boot、Spring MVC 和 Spring 有什么区别?
SpringFrame
SpringFramework 最重要的特征是依赖注入。所有 SpringModules 不是依赖注入就是 IOC 控制反转。 当我们恰当的使用 DI 或者是 IOC 的时候,我们可以开发松耦合应用。松耦合应用的单元测试可以很容易的进行。SpringMVC
Spring MVC 提供了一种分离式的方法来开发 Web 应用。通过运用像 DispatcherServelet, MoudlAndView 和 ViewResolver 等一些简单的概念,开发 Web 应用将会变的非常简单。SpringBoot
Spring 和 SpringMVC 的问题在于需要配置大量的参数。 Spring Boot通过一个自动配置和启动的项来目解决这个问题。 -
Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?
-
@SpringBootApplication是启动类上面的注解,它也是 Spring Boot 的核心注解,主要组合包含了以下 3 个注解:
-
@SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。
-
@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。
-
@ComponentScan:Spring组件扫描。
-
-
-
SpringCloud
-
什么是微服务?
以前的模式是所有的代码在同一个工程中 部署在同一个服务器中 同一个项目的不同模块不同功能互相抢占资源
微服务 将工程根据不同的业务规则拆分成微服务 微服务部署在不同的机器上 服务之间进行相互调用
java微服务的框架有dubbo(只能用来做微服务),springCloud(提供了服务的发现,断路器等)
-
什么是spring cloud?
SpringCloud为开发人员提供了快速构建分布式系统的一些通用模式(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁,领导选举,分布式会话,群集状态)。分布式系统的协调导致了锅炉板模式,并且使用Spring Cloud开发人员可以快速地站起来来实现这些模式的服务和应用程序。它们可以在任何分布式环境中正常工作,包括开发人员自己的笔记本电脑,裸机数据中心和受管平台,Cloud Foundry。
-
springcloud如何实现服务的注册和发现
服务在发布时 指定对应的服务名(服务名包括了IP地址和端口) 将服务注册到注册中心(eureka或者zookeeper)
这一过程时springcloud自动实现,只需要在main方法添加@EnableDisscoveryClient 同一个服务修改端口就可以启动多个实例
调用方法:传递服务名称通过注册中心获取所有的可用实例,通过负载均衡策略调用(ribbon和feign)对应的服务
-
SpringCloud断路器的作用
当一个服务调用另一个服务由于网络原因或者自身原因出现问题时 ,调用者就会等待被调者的响应,
当更多的服务请求到这些资源时,导致更多的请求等待,这样就会发生连锁效应,断路器就是解决这一问题的。
断路器有完全打开状态: 一定时间内,达到一定的次数无法调用,并且多次检测没有恢复的迹象,断路器完全打开,那么下次的请求不会请求到该服务。 半开: 短时间内有回复迹象,断路器会将部分请求发送给服务,当能正常调用时,断路器关闭。 关闭: 当服务一直处于正常状态,能正常调用,断路器关闭。
-
-
MyBatis
-
对Mybatis的理解
Mybatis是一个优秀的ORM框架,应用在持久层,它对jdbc的操作数据库过程进行封装,使开发者只关注SQL本身,而不需要花费精力去处理例如注册驱动,创建connection,等jdbc繁杂的过程代码,一般用mapper代理的方式开发,直接在xml里面写sql。
-
Mybatis的工作流程
1. mybatis配置 SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置类mybatis的运行环境等信息。 2. 通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂。 3. 由会话工厂创建sqlSession即会话,操作数据库需要通过SqlSession(DefaultSqlSession)进行。 4. mybatis底层自定义类Executor(BaseExecutor)执行器接口操作数据库,Executor接口有 两个实现,一个是基本执行器、一个是缓存执行器。 5. Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。 mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。 6. Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过 Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对 preparedStatement设置参数。 7. Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor 通过 Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc 编程中对结果的解析处理过程。
-
-
Hibernate
-
对hibernate的理解
Hibernate是轻量级的持久层解决方案,是一个关系数据库ORM框架, 对JDBC访问数据库的代码做了封装.我们可以很容易的对数据库进行增删改查操作.
-
hibernate的查询方式
(1)导航对象图检索方式。根据已经加载的对象,导航到其他对象。
(2)OID检索方式。使用get或者load加载对应的对象
(3)HQL检索方式。
(4)QBC检索方式。
(5)SQL检索方式。
-
sql与hsql的区别
(1)sql是直接操作数据库的
(2)hql是通过操作对象操作数据库,对大小写敏感。
-
一级缓存和二级缓存的区别
一级缓存是session级别的缓存,二级缓存是sessionFactory级别的缓存。
-
hibernate中get和load的区别?
get和load都是根据id获取数据。
(1)get先查询session中对应id是否有数据,如果有则直接返回,有查询数据库,如数据库中没有则返回为null;
(2)load方式查询session中对应id是否有数据,如果没有生成代理对象,查询数据库。如没有对应的id则抛出异常
- hibernate和mybatis对比?
-
在移植性方面hibernate配置一下方言即可.而一般情况下mybatis则需要修改sql语句
-
hibernate是一个完全的ORM框架.完全的面向对象.更符合我们开发者的思维模式.mybatis需要我们手动写sql语句
-
hibernate的优化成本比较高.因为hibernate的sql语句是自动生成的,所以在优化方面一般的新手无从下手.而mybatis只要修改sql就可以了.更加容易上手
-
-
Spring Data JPA
JPA意即Java持久化API,是在JDK5.0后提出的持久化规划,JPA的出现主要是为了简化持久层开发以及整合ORM技术。
- ORM映射元数据:支持XML和注解两种元数据的形式,元数据描述对象和表之间的映射关系。
- API:操作实体对象来执行CRUD操作
- 查询语言:通过面向对象而非面向数据库的查询语言(JPQL)查询数据,避免程序的SQL语句紧密耦合。
使用SpringData创建查询
1. 声明一个接口继承自Repository或Repository的一个子接口,对于Spring Data JPA通常是JpaRepository 2. 在接口中声明查询方法,如findOneByCustomerId() 3. 在application.properties或在application.yml文件中配置几个属性即可。 4. 在需要的接口中注入Reposotiry即可。JPA和Hibernate的区别?
Hibernate是JPA规范的一个具体实现 hibernate有JPA没有的特性 hibernate 的效率更快 JPA 有更好的移植性,通用性SpringDataJPA的一些常用语法
//根据firstName与LastName查找(两者必须在数据库有) DemoJpa findByFirstNameAndLastName(String firstName, String lastName); //根据firstName或LastName查找(两者其一有就行) DemoJpa findByLastNameOrFirstName(String lastName,String firstName); //根据firstName查找它是否存在数据库里<类似与以下关键字> //DemoJpa findByFirstName(String firstName); DemoJpa findByFirstNameIs(String firstName); //在Age数值age到age2之间的数据 List<DemoJpa> findByAgeBetween(Integer age, Integer age2); //小于指定age数值之间的数据 List<DemoJpa> findByAgeLessThan(Integer age); //小于等于指定age数值的数据 List<DemoJpa> findByAgeLessThanEqual(Integer age); //大于指定age数值之间的数据 List<DemoJpa> findByAgeGreaterThan(Integer age); //大于或等于指定age数值之间的数据 List<DemoJpa> findByAgeGreaterThanEqual(Integer age); //在指定age数值之前的数据类似关键字<LessThan> List<DemoJpa> findByAgeAfter(Integer age); //在指定age数值之后的数据类似关键字<GreaterThan> List<DemoJpa> findByAgeBefore(Integer age); //返回age字段为空的数据 List<DemoJpa> findByAgeIsNull(); //返回age字段不为空的数据 List<DemoJpa> findByAgeNotNull(); //根据age选取所有的数据源并按照LastName进行升序排序 List<DemoJpa> findByAgeOrderByLastName(Integer age); //返回不是指定age的所有数据 List<DemoJpa> findByAgeNot(Integer age);-
Spring Data Mongodb
hibernate是传统数据库的ORM框架(Object Relational Mapping对象关系映射,简称,ORM)
mongoDB是nosql的非关系型数据库
mongoDB的ORM框架,有mongoDB官方提供Morphia框架或者spring-data-mongoDB框架
-
Shiro
-
Shiro的优点
简单的身份认证, 支持多种数据源 对角色的简单的授权, 支持细粒度的授权(方法级) 支持一级缓存,以提升应用程序的性能; 内置的基于 POJO 企业会话管理, 适用于 Web 以及非 Web 的环境 非常简单的加密 API 不跟任何的框架或者容器捆绑, 可以独立运行 -
Shiro架构的核心组件
Authenticator:管理登陆登出 Autorizer:授权器赋予主体有那些权限 session Manager:shiro自己实现session管理器 session DAO:提供了session的增删改插 Cache Manager:缓冲管理器 Raelms:和数据库交互的桥梁 -
Shiro认证过程
创建SecurityManager -> 主体提交认证 -> SecurityManager认证 -> Authenticator认证 -> Realm验证
-
Shiro授权过程
创建SecurityManager ->主体授权 -> securityManager授权 -> Authorizer授权 ->Realm获取权限数据
-
-
-
RestFul
REST(Representational State Transfer)表象化状态转变(表述性状态转变),在2000年被提出,基于HTTP、URI、XML、JSON等标准和协议,支持轻量级、跨平台、跨语言的架构设计。是Web服务的一种新的架构风格(一种思想)。
-
REST架构的主要原则
- 网络上的所有事物都被抽象为资源
- 每个资源都有一个唯一的资源标识符
- 同一个资源具有多种表现形式(xml,json等)
- 对资源的各种操作不会改变资源标识符
- 所有的操作都是无状态的
- 符合REST原则的架构方式即可称为RESTful
-
/emp/1 HTTP GET 查询id=1的emp
/emp/1 HTTP DELETE 删除id=1的emp,实验中直接删除会报405错误,但是采用$.ajax异步删除就没问题
/emp/1 HTTP PUT 跟新emp
/emp/add HTTP POST 新增emp
-
常用的数据库
-
mysql
-
mongodb
-
oracle
-
redis
-
详解:juejin.im/editor/draf…
-
-
memcached缓存框架
Memcached是一款开源的、高性能的纯内存缓存服务软件。Mem是内存的意思,cache是缓存的意思,d是daemon的意思。 memcache 是项目名称,也是一款软件,其架构是C/S架构。
缓存: 将数据存储到内存中,只有当磁盘胜任不了的时候,才会启用缓存
缺点:断电数据丢失(双电),用缓存存储数据的目的只是为了应付大并发的业务。
数据库: mysql(关系型数据库,能够保证数据一致性,保证数据不丢失,当因为功能太多,导致性能不高) ===数据参考
缓存数据库: memcache redis(非关系型数据库,性能极高,但不保证数据完整性) === 业务的数据提供者
- memcachedb 会将内存的数据写入到磁盘中
- redis 主要工作场所是内存中,但是定期备份内存数据到硬盘
memcache优点:
① 对于用户来讲,用户访问网站更快了,体验更好了。 ② 对网站来说,数据库压力降低了。只有当内存没有数据时才会去请求数据库。第一次写入的数据也会请求数据库。一般公司没有预热,只有当用户读取过数据库才会放到Memcached中。 ③ 提升了网站的并发访问,减少服务器数量。
-
Activiti工作流
-
什么是工作流,工作流的核心对象是什么,activiti共操作数据库多少张表
- 工作流就是多个参与者,按照某种预定义的规则,传递业务信息,进行审核的功能一个框架(Activiti)
- processEngine,调用Service,从而操作数据库的表
- 23表
-
工作流中的接口
- RepositoryService:流程定义和部署对象
- RuntimeService:执行管理,包括流程实例和执行对象(正在执行)
- TaskService:执行任务相关的(正在执行)
- HistoryService:历史管理
- IdentityService:Activiti表的用户角色组
-
-
消息中间件
-
ActiveMQ
ActiveMQ/ApolloMQ
优点:老牌的消息队列,使用Java语言编写。对JMS支持最好,采用多线程并发,资源消耗比较大。如果你的主语言是Java,可以重点考虑。
缺点:由于历史悠久,历史包袱较多,版本更新很缓慢。集群模式需要依赖Zookeeper实现。最新架构的产品被命名为Apollo,号称下一代ActiveMQ,目前案例较少。
-
RabbitMQ
优点:生态丰富,使用者众,有很多人在前面踩坑。AMQP协议的领导实现,支持多种场景。淘宝的MySQL集群内部有使用它进行通讯,OpenStack开源云平台的通信组件,最先在金融行业得到运用。
缺点:Erlang代码你Hold得住不? 虽然Erlang是天然集群化的,但RabbitMQ在高可用方面做起来还不是特别得心应手,别相信广告。
-
-
使用Dubbo分布式服务治理框架及Zookeeper分布式服务协调框架的运行原理及开发
-
Dubbo
-
什么是分布式?什么是集群?主要区别
分布式是将一个服务分个部分,然后通过远程调用方式进行。远程调用框架RPC框架,spring cloud,dubbo。集群是将同一个服务的多个副本部署在不同的集群上,通过负载均衡的方式提供复试。场景:厨师。
-
服务治理包括哪些内容?
服务治理需要服务治理框架,dubbo。即对服务进行管理,例如服务的接口名称,权重等信息。
-
注册中心的作用?你怎么理解注册中心的?
如果没有注册中心,需要在本地维护一个provider的地址列表。注册中心角色,它是集中式数据管理,消费者通过注册中心来访问数据。通过注册中心,使得provider和consumer之间是透明。
-
什么是RPC?
远程调用框架。
-
dubbo中负载均衡的策略有哪些?
Provider: 集群,集群只需要重启几个实例即可。
Zookeeper:集群
Consumer:集群
负载:Loadbalence轮询,随机
-
-
推荐使用zookeeper注册中心,还有redis等不推荐。
核心配置有 dubbo:service/ dubbo:reference/ dubbo:protocol/ dubbo:registry/ dubbo:application/ dubbo:provider/ dubbo:consumer/ dubbo:method/
dubbox是当当网基于dubbo上做了一些扩展,如加了服务可restful调用,更新了开源组件等。
-
Zookeeper
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
zookeeper是一个开源的分布式协调服务框架。
应用场景:分布式通知/协调、负载均衡、配置中心、分布式锁、分布式队列等。
Paxos算法。
选举算法及流程。
节点类型:持久节点、持久顺序节点、临时节点、临时顺序节点。
部署模式:单机模式、伪集群模式、集群模式。
集群需要一半以上的机器可用,所以,3台挂掉1台还能工作,2台不能。
-
Tomcat服务器,Nginx+Tomcat负载均衡
-
Linux基本操作,基于CentOs的服务环境搭建以及项目部署
-
OAuth2协议的认证机制和运行原理
-
JWT Token认证安全管理
-
Hadoop生态系统,MapReduce计算模型,HDFS分布式文件系统的运行原理,搭建环境和API。
-
区块链技术,以太坊,智能合约,Solidity合约编码,Web3j编码,与智能合约集成开发以及私有链的部署。