一、mybatis
首先,mybatis是一个对象关系映射(orm)框架,是为了解决面向对象与关系数据库的存在互不匹配的现象。也就是说mybatis的关注点在于对象与数据库之间的映射,mybatis会把从数据库中拿到的松散数据进行封装,使开发者直接拿到一个对象。mybatis其实就是对jdbc操作数据库进行的一个封装,使关注者只需要关注sql本身。
Mybatis需要手写Sql语句,对jdbc的封装程度不如hibernate,但因此也灵活得多; 在使用mybatis时,只需要关注三个部分(1.sql语句 ;2.输入参数; 3.输出参数)。
mybatis实现数据的持久化:
1)开发持久化类po,编写持久化操作Mapper,定义sql语句;
2)获取sqlseesionfactory;
3)获取sqlseesion;
4)用面向对象的方式操作数据库;
5)关闭事务,关闭sqlseesion。
#{}和¥{}
#{}解析传递的参数数据,sql语句预编译处理,防止sql注入 , 先将#{}替换成 ?再调用preparedStatement的set方法来赋值;
${}传递过来的参数原装拼接到sql语句中,${}字符串替换 ,直接替换成变量的值;
如何实现动态sql原理
使用OGNL从sql参数中计算表达式的值,根据表达式的值拼装动态sql。
二、spring
spring是一个非常庞大的体系,在它的体系下有熟知的springframework、springdata、springsecurity、springboot、springclouod……
spring的核心概念有bean、ioc(di)、aop。Spring通过BeanFactory来获取这些类的对象,在配置文件中通过节点将类交给Spring进行管理,ApplicationContext的实现类通过getBean()方法从Spring容器中获取对象,默认为单例的。
ioc:
将需要创建的对象以池的方式管理,注入到需要的对象中去。
方式: setter注入,接口注入,构造方法注入。
aop:
面向切面 :把为业务模块所共同调用的逻辑或责任封装起来;减少重复代码,降低耦合,便于后期维护与开发。
使用场景:事务、错误处理、日志信息 、权限控制;
Spring bean:生命周期
Spring Bean的生命周期分为四个阶段和多个扩展点。扩展点又可以分为影响多个Bean和影响单个Bean。整理如下:
四个阶段
· 实例化 Instantiation
· 属性赋值 Populate
· 初始化 Initialization
· 销毁 Destruction
bean 实例化过程:
1.实例化 bean 对象,类似于 new XXObject()
2.将配置文件中配置的属性填充到刚刚创建的 bean 对象中。
3.检查 bean 对象是否实现了 Aware 一类的接口,如果实现了则把相应的依赖设置到 bean 对象中。比如如果 bean 实现了 BeanFactoryAware 接口,Spring 容器在实例化bean的过程中,会将 BeanFactory 容器注入到 bean 中。
4.调用 BeanPostProcessor 前置处理方法,即 postProcessBeforeInitialization(Object bean, String beanName)。
5.检查 bean 对象是否实现了 InitializingBean 接口,如果实现,则调用 afterPropertiesSet 方法。或者检查配置文件中是否配置了 init-method 属性,如果配置了,则去调用 init-method 属性配置的方法。
6.调用 BeanPostProcessor 后置处理方法,即 postProcessAfterInitialization(Object bean, String beanName)。我们所熟知的 AOP 就是在这里将 Adivce 逻辑织入到 bean 中的。
7.注册 Destruction 相关回调方法。
8.bean 对象处于就绪状态,可以使用了。
9.应用上下文被销毁,调用注册的 Destruction 相关方法。如果 bean 实现了 DispostbleBean 接口,Spring 容器会调用 destroy 方法。如果在配置文件中配置了 destroy 属性,Spring 容器则会调用 destroy 属性对应的方法。
spring事务:
1.事务在代码里或者数据库中都可以配置;
2.事务是并发控制的单位,是用户定义的操作序列。这些操作要么都做,要么都不做,不可分割;
3.事务是作为单个逻辑工作单元执行的一系列操作;
事务的四大特性:
1、原子性:事务是一个原子操作,由一系列动作组成;事务的原子性确保动作要么全部完成,要么完全不起作用。
2、一致性:一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败;
3、隔离性:事务之间应该隔离开来;因为可能有许多事务会同时处理相同的数据,每个事务都应该与其他事务有隔离策略。
4、持久性(acid):一旦事务完成,它的结果不会收到影响。通常情况下,事务的结果被写到持久化存储器中。
commit:提交事务; rollback:回滚事务; savepoint:保存点;
三、springmvc
springmcv是一个基于java的实现了mvc设计模式的请求驱动类型轻量级web框架,通过把model、view、controller分离,将web层进行解耦,把复杂的web应用分为逻辑清晰的几部分,减少出错,简化开发,方便组内人员互相开发配合。
springmvc的工作流程:
1.用户发送请求到前端控制器DispatcherServlet
2.DispatcherServlet通过处理器映射器选择相应的controller
3.DispatcherServlet将请求交给controller处理
4.controller处理完毕后返回modelandview给处理器映射器
5.处理映射器通过视图解析器解析试图
6.根据模型数据渲染视图回应用户
对springmvc的理解:
1.这是一个基于mvc的web框架;
2.springmvc是spring的一个模块,是spring的子容器,子容器可以拿父容器的东西,父容器不能拿子容器的东西;
3.springmvc的DispatcherServlet用于分发请求,使操作变得简单;
4.springmvc三大组件
1)handleMapping:处理器映射器
用户请求路径到controller的映射;
2)handlerAdapter:处理器适配器
根据handler的开发方式的不同寻找不同的处理器适配器;
3)viewResolver:视图解析器
可以解析jsp/freemarkerr/pdf等;
四、ssm
ssm是springmvc、spring、mybatis等框架的整合,将整个系统划分成为dao层、mapper层、service层、controller层四层。使用springmvc负责请求的转发和视图的管理,spring实现业务对象管理,mybatis作为对数据对象持久化引擎。
五、Spring Cloud
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
核心组件:
Netflix Eureka 服务注册与发现
当我们的微服务过多的时候,管理服务的通信地址是一个非常麻烦的事情,Eureka就是用来管理微服务的通信地址清单的,有了Eureka之后我们通过服务的名字就能实现服务的调用。
Netflix Ribbon\Feign : 客户端负载均衡
Ribbon和Feign都是客户端负载均衡器,它的作用是在服务发生调用的时候帮我们将请求按照某种规则分发到多个目标服务器上,简单理解就是用来解决微服务之间的通信问题。
Netflix Hystrix :熔断器,容错管理工具
旨在通过熔断机制控制服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。
Netflix Zuul : 服务网关
zuul作为服务网关,我们可以把它看作是微服务的大门,所有的请求都需要经过zuul之后才能到达目标服务,根据这一特性,我们可以把微服务公共的事情交给zuul统一处理,如:用户鉴权,请求监控等。
Spring Cloud Config :分布式配置
微服务架构中的服务实例非常的多,服务的配置文件分散在每个服务中,每次修改服务的配置文件和重新服务实例都是一个很麻烦的工作,Spring Cloud Config作为分布式配置管理中心就是用来统一的管理服务的配置文件。
Spring Cloud Bus : 消息总线
消息总线是在微服务中给各个微服务广播消息的一个组件,我们使用消息总线构建一个消息中心,其他微服务来接入到消息中心,当消息总线发起消息,接入的微服务都可以收到消息从而进行消费。
Spring Cloud sleuth :微服务链路追踪
当我们的应用采用微服务架构之后,后台可能有几十个甚至几百个服务在支撑,一个请求请求可能需要多次的服务调用最后才能完成,链路追踪的作用就是来监控维护之间的调用关系,让程序员方便直观的感受到一个请求经历了哪些微服务,以及服务的请求时间,是否有异常等。
spring cloud 如何实现服务的注册和发现
服务器发布时,指定了服务器的用户名端口,将服务注册到注册中心(zk,eureka),这一过程springcloud自动实现,只需要在main方法上添加。
ribbon和feign的区别
ribbon和feign都是调用其他服务,不过方式不同
1.启动类注解不同,ribbon的启动注解@Ribbonclient,feign的启动类注解@Enablefeignclient ;
2.服务指定位置不同,ribbon在启动注解上声明,feign在定义抽象接口方法上声明@feignclient ;
3.调用方式不同,ribbon需要自己构建http请求,模拟http请求,然后调用template发送给其他服务,步骤相当的繁琐 ;
feign则是在ribbon上进行了改进,采用接口的方式,将其他需要调用的方法,定义成抽象方法即可。