zoukankan      html  css  js  c++  java
  • 框架类(spring&mybatis&spring mvc&dubbo&MQ)

    一、spring

    1. Spring aop(面相切面编程),ioc(控制反转) di(依赖注入)的理解

      http://blog.csdn.net/jy_he/article/details/51768337 

    http://blog.csdn.net/zhangliangzi/article/details/51550912 

    这个面相切面编程真的不想了解了。说说ioc和di。

    ioc和di是同一个东西在不同角度进行分析,在一个项目开发中我们需要把bean放到spring容器中,当我们需要使用这些bean的时候,就由spring容器来帮我们注入,即通过控制反转和依赖注入。都是通过反射机制来实现的。

    IOC,控制反转,顾名思义就是控制器和传统的方式不同。这里有spring容器替你管理和创建相应的对象,即由IOC容器帮找到相应依赖的对象并注入,而不是传统的放心对象主动去找。IOC容器就是一个对象制造工厂,你不需要关系对象的创建和销毁,IOC包办了。

    另一种解释:就是指对 对象的创建、维护、销毁等生命周期的控制由程序控制改为由IOC容器控制,需要某个对象时就直接通过名字去IOC容器中获取。

    Di,即由Spring容器动态注入到依赖组件中

     

    一句话总结:Ioc和di是指,对象的控制权交给了ioc容器管理,用到的时候由ioc容器注入到组件中

    Ioc和di的意义:但它的存在使我们不需要很多代码、不需要考虑对象间复杂的耦合关系就能从IOC容器中获取合适的对象,而且提供了对 对象的可靠的管理,极大地降低了开发的复杂性

     

     

    1. spring注解

     

    l http://note.youdao.com/noteshare?id=aca1a0f4bc7595f8b304db29098279a8&sub=BED48DA216E7427B966FCAC72F18EE5A

     

    (1) @Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配

     

    (2) @Autowired是Spring的注解,@Resource是J2EE的注解

     

    @Controller,用以标记控制层组件

     

    @servier,用于标记服务层组件

     

    @Repository 用于标记数据库访问层,即DAO层

     

    @Component 泛指组件,当无法归类到以上三层的时候,可以用这个注解

     

    @Autowired标注的bean接口有多个实现的时候,怎么指定使用哪个实现类?用注解@Qualifier,类似如下

     

        @Autowired

     

    @Qualifier("redisCacheServiceImpl")

     

    private CacheService cacheService;

     

    Spring默认的bean name是类名首字母小写

     

    二、spring mvc

    1. Springmvc原理

    (1) 客户端发送一个http请求到服务端,web服务端对http进行解析,如果匹配到dispatcherServelet的请求映射路径,web将请求转交给dispatcheservelet

    (2) Dispatchservelet根据请求的信息以及handlermapping中配置的信息找到处理请求的处理器

    (3) Dispathservelet根据handlermapping找到对应的handler,再有具体的handleradapterhandler进行具体的调度

    (4) Handler处理完后由具体的ModelAndView()对象返回给dispatchserverlet

    (5) 通过viewResoler将逻辑视图转为真正的view

    (6) Dispacher通过model解析出ModelAndView()中的参数进行解析最终展现出完整的view并返回给客户端

    1. 拦截器和过滤器

     过滤器依赖servlet容器实现。在实现上基于函数回调,可以对几乎所有的请求进行过滤,但过滤实例只能在容器初始化时调用

    拦截器,依赖web框架,在实现上基于JAVA反射机制,缺点是只能对controller进行拦截,不能直接对访问静态资源的请求进行拦截。

    拦截器可以在方法前后,异常前后等调用。过滤器只能在请求前和请求后各调用一次;拦截器是被包裹在过滤器中的

    过滤器和拦截器的执行顺序如下

    三、mybatis

    1. mybatis缓存和代理机制。mybatis和hibernate的比较

    http://blog.csdn.net/lu930124/article/details/50991899

    l mybatis提供了一级缓存和二级缓存,用来提高查询性能。

     一级缓存是SQLSession级别的缓存,Mybatis默认开启一级缓存,是基于hashmap的本地缓存。不同的SQLSession之间的缓存数据区域互不影响。同一个SQLSession执行两次相同的sql查询语句,第二次直接从缓存中拿数据。执行insert、update和delete会清除缓存。

    二级缓存是mapper级别的缓存,同样是基于hashmap进行存储,多个SQLSession可以共享二级缓存,其作用域是 mapper 的同一个 namespace。不同的 SqlSession 两次执行相同的 namespace 下的 sql 语句,会执行相同的 sql,第二次查询只会查询第一次查询时读取数据库后写到缓存的数据,不会再去数据库查询。

     二级缓存是mapper级别的缓存,多个SQLSession共享

    如下图

     代理模式,即只需要程序员编写Mapper接口(相当于DAO),由mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同DAO接口实现类方法。

    Mapper接口开发需要遵循以下规范:

    1、 Mapper.xml文件中的namespace与mapper接口的类路径相同。

    2、  Mapper接口方法名和Mapper.xml中定义的每个statement的id相同

    3、 Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同

    4、 Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同

    mapper.xml文件,然后写mapper.java的接口文件,然后加载mapper.xml文件。mybatis官方推荐使用mapper代理方法开发mapper接口,程序员不用编写mapper接口实现类,使用mapper代理方法时,输入参数可以使用pojo包装对象或map对象,保证dao的通用性。就是代理到mapper.xml文件吧?

    l Mybaits和hibernate的比较

    相同点:都是ORM框架。

    不同点:mybaits是通过mapper.xml维护映射关系,程序员手动编写的sql比hibernate的hql语句更加灵活,sql调优更容易,hibernate太重,sql调优麻烦;但是hibernate的hql的数据移植行好。:mybatis和hibernate都可以使用第三方缓存,而hibernate相比maybatis有更好的二级缓存机制

    总结下来就是:

    (1) mybatis是通过mapper.xml维护映射关系。Hibernate用hql语句,成本高,但是移植性好,那我们搞java的不太注重这个移植性问题了。Mybaits的sql调优更容易。

     

    1. Mybatis

    是数据持久层框架。可以使用mybatis generator自动生成mapper和对应的配置文件。有2种基本用法:

    (1) 使用注解

    (2) 使用xml配置文件

    基本使用是DAO层定义接口,接口的实现写在Mapper中和xml的配置文件名称相关,一一对应

    四、dubbo

    1. Dubbo基本原理&rpc框架基本原理

    Provider,服务提供方,生产者。

    Consumer,服务消费方,消费者

    Registry,服务注册与发现的注册中心

    Monitor,监控中心,作用于服务治理

    Container, 运行的服务器

    调用关系说明:

    0. 服务容器负责启动,加载,运行服务提供者。

    1. 服务提供者在启动时,向注册中心注册自己提供的服务。

    2. 服务消费者在启动时,向注册中心订阅自己所需的服务。

    3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。

    4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

    5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

    1. Zookeeper

       Zookeeper是一个分布式应用协调服务。用来解决分布式系统中常见的一些数据管理问题,如统一命名服务、状态同步服务、集群管理、分布式应用配置。zookeeper维护的是一个类似文件系统的数据结构。客户端监听他关心的节点,当目录节点发生变化时,zookeeper会通知客户端。paxos算法实现,原理我不知道。

    五、MQ

    1. 到家消息队列(dmq)

       应用场景有,异步处理、应用解耦、流量削峰、日志处理、消息通讯。

      主要组成有队列管理器、消息、队列、通道

      Redis实现消息队列的原理是利用redis list中的lpush和rpop实现fifo消息队列。

    (1) 消息顺序,消息队列一般是不支持消息顺序的,非要实现也可以,保证a消息ack后,再发b消息,但对吞吐量有影响,所以这种情况用rpc服务更合适

    (2) 消息重复,这个一般是业务方自己进行幂等性处理,例如用数据库幂等表记录mq id,如果mq id存在则不处理,不存在和存入

    (3) 事物消息,RocketMQ实现了事物消息

     到家的消息队列原理

     

     

    上图是一个MQ的核心架构图,基本可以分为三大块:

    1发送方 -> 左侧粉色部分

    2MQ核心集群 -> 中间蓝色部分包括zk、db和后台管理等,mq核心集群对消息落地(落db)后对发送方callback,落地后发送给接收方,接收方收到后发送ack,mq serve收到ack将落地的消息进行删除。

    发送方消息丢失,没有收到callback,则重发,mqserve这时候对接收方重发。下半场的消息必答会重发,接收方自己做幂等性处理。接收方最好不要对mq id做幂等,因为不知道

    上半场是mq id,下半场是业务方自己去重,如orderid

    (3)接收方 -> 右侧黄色部分

    六、ES

     

    ES是一个基于Lucene构建的开源、分布式、RESTful的全文本搜索引擎。

     

    1,es的工作过程实现是如何的?如何实现分布式的啊

     

    Elasticsearch中通过分区实现分布式,数据写入的时候根据_routing规则将数据写入某一个Shard中,这样就能将海量数据分布在多个Shard以及多台机器上,已达到分布式的目标。

     

    2,es在数据量很大的情况下(数十亿级别)如何提高查询效率啊?

     

    3,es的查询是一个怎么的工作过程?底层的lucence介绍一下呗?倒排索引知道吗?

     

    对于Search类请求,查询的时候是一起查询内存和磁盘上的Segment,最后将结果合并后返回。这种查询是近实时(Near Real Time)的。

     

    对于Get类请求,查询的时候是先查询内存中的TransLog,如果找到就立即返回,如果没找到再查询磁盘上的TransLog,如果还没有则再去查询磁盘上的Segment。这种查询是实时(Real Time)的。

    7、MAVEN

    1、maven如何用git命令查看依赖树?

      mvn dependency:tree

      maven会根据传递依赖自动将jar引用的包下载下来,如果自动下载的jar包和已存在的jar相同,则可能发生版本冲突;

     

  • 相关阅读:
    VisualSVN-Server windows 版安装时报错 "Service 'VisualSVN Server' failed to start. Please check VisualSVN Server log in Event Viewer for more details."
    Pytest 单元测试框架之初始化和清除环境
    Pytest 单元测试框架入门
    Python(email 邮件收发)
    Python(minidom 模块)
    Python(csv 模块)
    禅道简介
    2020年最好的WooCommerce主题
    Shopify网上开店教程(2020版)
    WooCommerce VS Magento 2020:哪个跨境电商自建站软件更好?
  • 原文地址:https://www.cnblogs.com/tilamisu007/p/9640854.html
Copyright © 2011-2022 走看看