对于框架,我们需要学习Struts2框架:Struts是一个基于Sun J2EE平台的MVC框架,主要是采用Servlet和JSP技术来实现的。由于Struts能充分满足应用开发的需求,简单易用,敏捷迅速,在过去的一年中颇受关注。Struts把Servlet、JSP、自定义标签和信息资源(message resources)整合到一个统一的框架中,开发人员利用其进行开发时不用再自己编码实现全套MVC模式,极大的节省了时间,所以说Struts是一个非常不错的应用框架。Struts2的执行流程?a、浏览器发送请求b、浏览器请求被Struts2提供的过滤器StrutsPrepareAndExecuteFilter拦截c、核心控制器FilterDispatcher根据请求决定调用合适的Actiond、Struts2的拦截器链自动对请求应用通用功能,也包含用户自定义的一些拦截器e、回调Action的execute方法或自定义的action方法,首先这些方法会获得用户请求的参数,然后执行某种数据库的操作f、返回result视图,处理的结果会被输出到浏览器中拦截器和过滤器有哪些区别?拦截器是基于Java反射机制的,而过滤器是基于函数回调;拦截器只对action起作用,而过滤器对几乎所有请求起作用;拦截器可以访问action上下文,值栈的对象,而过滤器不能;介绍一下struts2的值栈值栈是对应每一个请求对象的数据存储中心。struts2的一个很重要的特点就是引入了值栈。之前我们通过缓存或者模型驱动在action和页面之间传递数据,数据混乱,并且难以管理,缓存还有时间限制,使用起来非常困难。值栈的引入解决了这个问题,它可以统一管理页面和action之间的数据,供action、result、interceptor等使用。我们大多数情况下都不需要考虑值栈在哪里,只需要获取相应的数据就可以啦,这大大降低了开发人员的工作量。HibernateHibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序实用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。Spring框架:概念: Spring是一个轻量级的IoC和AOP容器框架。是为Java应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求。常见的配置方式有三种:基于XML的配置、基于注解的配置、基于Java的配置。Spring模块组成:转存失败重新上传取消特点:(1)spring属于低侵入式设计,代码的污染极低;(2)spring的DI机制将对象之间的依赖关系交由框架处理,减低组件的耦合性;(3)Spring提供了AOP技术,支持将一些通用任务,如安全、事务、日志、权限等进行集中式管理,从而提供更好的复用。(4)spring对于主流的应用框架提供了集成支持。AopOOP面向对象,允许开发者定义纵向的关系,但并适用于定义横向的关系,导致了大量代码的重复,而不利于各个模块的重用。AOP,一般称为面向切面,作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。可用于权限认证、日志、事务处理。AOP实现的关键在于 代理模式,AOP代理主要分为静态代理和动态代理。静态代理的代表为AspectJ;动态代理则以Spring AOP为代表。(1)AspectJ是静态代理的增强,所谓静态代理,就是AOP框架会在编译阶段生成AOP代理类,因此也称为编译时增强,他会在编译阶段将AspectJ(切面)织入到Java字节码中,运行的时候就是增强之后的AOP对象。(2)Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改字节码,而是每次运行时在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。
Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理: ①JDK动态代理只提供接口的代理,不支持类的代理。核心InvocationHandler接口和Proxy类,InvocationHandler 通过invoke()方法反射来调用目标类中的代码,动态地将横切逻辑和业务编织在一起;接着,Proxy利用 InvocationHandler动态创建一个符合某一接口的的实例, 生成目标类的代理对象。 ②如果代理类没有实现 InvocationHandler 接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成指定类的一个子类对象,并覆盖其中特定方法并添加增强代码,从而实现AOP。CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。(3)静态代理与动态代理区别在于生成AOP代理对象的时机不同,相对来说AspectJ的静态代理方式具有更好的性能,但是AspectJ需要特定的编译器进行处理,而Spring AOP则无需特定的编译器处理。 InvocationHandler 的 invoke(Object proxy,Method method,Object[] args):proxy是最终生成的代理实例; method 是被代理目标实例的某个具体方法; args 是被代理目标实例某个方法的具体入参, 在方法反射调用时使用。
Ioc(1)IOC就是控制反转,是指创建对象的控制权的转移,以前创建对象的主动权和时机是由自己把控的,而现在这种权力转移到Spring容器中,并由容器根据配置文件去创建实例和管理各个实例之间的依赖关系,对象与对象之间松散耦合,也利于功能的复用。DI依赖注入,和控制反转是同一个概念的不同角度的描述,即 应用程序在运行时依赖IoC容器来动态注入对象需要的外部资源。(2)最直观的表达就是,IOC让对象的创建不用去new了,可以由spring自动生产,使用java的反射机制,根据配置文件在运行时动态的去创建对象以及管理对象,并调用对象的方法的。(3)Spring的IOC有三种注入方式 :构造器注入、setter方法注入、根据注解注入。
请解释Spring Bean的生命周期实例化Bean--->设置对象属性(依赖注入)--->处理Aware接口--->实现了BeanPostProcessor接口,会调用其实现的destroy()方法--->配置文件中配置了 init-method 属性--->配置了destroy-method属性,会自动调用其配置的销毁方法。1.客户端(浏览器)发送请求,直接请求到DispatcherServlet。2.DispatcherServlet根据请求信息调用HandlerMapping,解析请求对应的Handler。3.解析到对应的Handler(也就是我们平常说的Controller控制器)。4.HandlerAdapter会根据Handler来调用真正的处理器来处理请求和执行相对应的业务逻辑。5.处理器处理完业务后,会返回一个ModelAndView对象,Model是返回的数据对象,View是逻辑上的View。6.ViewResolver会根据逻辑View去查找实际的View。7.DispatcherServlet把返回的Model传给View(视图渲染)。8.把View返回给请求者(浏览器)。Spring 框架中都用到了哪些设计模式
(1)工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例;(2)单例模式:Bean默认为单例模式。(3)代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;(4)模板方法:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。(5)观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,如Spring中listener的实现--ApplicationListener。Spring事务的实现方式和实现原理:Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。真正的数据库层的事务提交和回滚是通过binlog或者redo log实现的。Spring中的隔离级别:① ISOLATION_DEFAULT:这是个 PlatfromTransactionManager 默认的隔离级别,使用数据库默认的事务隔离级别。② ISOLATION_READ_UNCOMMITTED:读未提交,允许另外一个事务可以看到这个事务未提交的数据。③ ISOLATION_READ_COMMITTED:读已提交,保证一个事务修改的数据提交后才能被另一事务读取,而且能看到该事务对已有记录的更新。④ ISOLATION_REPEATABLE_READ:可重复读,保证一个事务修改的数据提交后才能被另一事务读取,但是不能看到该事务对已有记录的更新。⑤ ISOLATION_SERIALIZABLE:一个事务在执行的过程中完全看不到其他事务对数据库所做的更新。
SpringMVC概念:Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,Controller分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。Springmvc的优点:(1)可以支持各种视图技术,而不仅仅局限于JSP;(2)与Spring框架集成(如IoC容器、AOP等);(3)清晰的角色分配:前端控制器(dispatcherServlet) , 请求到处理器映射(handlerMapping), 处理器适配器(HandlerAdapter), 视图解析器(ViewResolver)。(4) 支持各种请求资源的映射策略。Spring MVC的主要组件1)前端控制器 DispatcherServlet---(不需要程序员开发)作用:接收请求、响应结果,相当于转发器,有了DispatcherServlet 就减少了其它组件之间的耦合度。(2)处理器映射器HandlerMapping---(不需要程序员开发)作用:根据请求的URL来查找Handler(3)处理器适配器HandlerAdapter---注意:在编写Handler的时候要按照HandlerAdapter要求的规则去编写,这样适配器HandlerAdapter才可以正确的去执行Handler。(4)处理器Handler(需要程序员开发)(5)视图解析器 ViewResolver(不需要程序员开发)---作用:进行视图的解析,根据视图逻辑名解析成真正的视图(view)(6)视图View(需要程序员开发jsp)
SpringMvc怎么和AJAX相互调用的通过Jackson框架就可以把Java里面的对象直接转化成Js可以识别的Json对象。具体步骤如下 :
- 加入Jackson.jar(2)在配置文件中配置json的映射(3)在接受Ajax方法里面可以直接返回Object,List等,但方法前面要加上@ResponseBody注解。
SpringMVC常用的注解有哪些@RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上。用于类上,则表示类中的所有响应请求的方法都是以该地址作为父路径。@RequestBody:注解实现接收http请求的json数据,将json转换为java对象。@ResponseBody:注解实现将conreoller方法返回对象转化为json对象响应给客户
Spring和SpringMVC的区别Spring是IOC和AOP的容器框架,SpringMVC是基于Spring功能之上添加的Web框架,想用SpringMVC必须先依赖Spring。 SpringMVC是一个MVC模式的WEB开发框架;Spring是一个通用解决方案, 最大的用处就是通过Ioc/AOP解耦, 降低软件复杂性, 所以Spring可以结合SpringMVC等很多其他解决方案一起使用, 不仅仅只适用于WEB开发例子:1.Spring 是一个“引擎”;2.Spring MVC 是基于Spring的一个 MVC 框架;3.Spring Boot 是基于Spring4的条件注册的一套快速开发整合包。
SpringMvc中函数的返回值是什么答:返回值可以有很多类型,有String, ModelAndView。ModelAndView类把视图和数据都合并的一起的,但一般用String比较好。SpringMvc用什么对象从后台向前台传递数据的?答:通过ModelMap对象,可以在这个对象里面调用put方法,把对象加到里面,前台就可以通过el表达式拿到。怎么样把ModelMap里面的数据放入Session里面答:可以在类上面加上@SessionAttributes注解,里面包含的字符串就是要放入session里面的key
注解原理:注解本质是一个继承了Annotation的特殊接口,其具体实现类是Java运行时生成的动态代理类。我们通过反射获取注解时,返回的是Java运行时生成的动态代理对象。通过代理对象调用自定义注解的方法,会最终调用AnnotationInvocationHandler的invoke方法。该方法会从memberValues这个Map中索引出对应的值。而memberValues的来源是Java常量池。
MyBatis什么是Mybatis?(1)Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原生态sql,可以严格控制sql执行性能,灵活度高。(2)MyBatis 可以使用 XML或注解来配置和映射原生信息,将 POJO映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。(3)通过xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java对象和 statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。(从执行sql到返回result的过程)。
Mybaits的优点:
- 基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用。(2)与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接;(3)很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持)。(4)能够与Spring很好的集成;(5)提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护。MyBatis框架的缺点:(1)SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求。(2)SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。#{}和${}的区别是什么1.#{}是预编译处理,${}是字符串替换。2.Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;3.Mybatis在处理${}时,就是把${}替换成变量的值。4.使用#{}可以有效的防止SQL注入,提高系统安全性。当实体类中的属性名和表中的字段名不一样 ,怎么办 第1种: 通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致。第2种: 通过<resultMap>来映射字段名和实体类属性名的一一对应的关系。Mybatis是如何进行分页的?分页插件的原理是什么 Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页。可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。 分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。Spring Boot概念:Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。
特点
- 使编码变得简单2、使配置变得简单3、使部署变得简单4、使监控变得简单
二、springboot主要特性
1、遵循习惯优于配置的原则。使用springboot我们只需要很少的配置,大多数使用默认配置即可
2、项目快速搭建。springboot帮助开发者快速搭建spring框架,可无需配置的自动整合第三方框架
3、可以完全不使用xml配置,只需要自动配置和Java config
4、内嵌servlet容器,降低了对环境的要求,可用命令直接执行项目
5、提供了starter POM,能够非常方便的进行包管理
6、对主流框架无配置集成
缺点
1、高度集成,使用的时候不知道底层实现
2、由于不了解底层,导致项目出了问题会很难排查
Spring的核心配置文件Spring Boot 的核心配置文件是 application 和 bootstrap 配置文件。application 配置文件这个容易理解,主要用于 Spring Boot 项目的自动化配置。bootstrap 配置文件有以下几个应用场景bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;一些固定的不能被覆盖的属性;一些加密/解密的场景;Spring boot的配置文件有哪几种形式.properties 和 .yml,它们的区别主要是书写格式不同。转存失败重新上传取消
- 另外,.yml 格式不支持 @PropertySource 注解导入配置。Spring Boot 的核心注解是哪个@SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。@ComponentScan:Spring组件扫描。运行 Spring Boot 有哪几种方式?
- 打包用命令或者放到容器中运行--2)用 Maven/ Gradle 插件运行--3)直接执行 main 方法运行Spring Boot 有哪几种读取配置的方式Spring Boot 可以通过 @PropertySource,@Value,@Environment, @ConfigurationProperties 来绑定变量你如何理解 Spring Boot 配置加载顺序在 Spring Boot 里面,可以使用以下几种方式来加载配置。1)properties文件;2)YAML文件;3)系统环境变量;4)命令行参数;
spring Boot 2.X 有什么新特性1.配置变更2.JDK 版本升级3.第三方类库升级4.响应式 Spring 编程支持5.HTTP/2 支持6.配置属性绑定Spring Cloud
概念:spring cloud 是一系列框架的有序集合。它利用 spring boot 的开发便利性巧妙地 简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断 路器、数据监控等,都可以用 spring boot 的开发风格做到一键启动和部署。
spring cloud 断路器的作用是什么
在分布式架构中,断路器模式的作用也是类似的,当某个服务单元发生故障(类似用电器 发生短路)之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个错误响应, 而不是长时间的等待。这样就不会使得线程因调用故障服务被长时间占用不释放,避免了故障在分布式系统中的蔓延。
spring cloud 的核心组件有哪些?
1.Eureka:服务注册于发现。
2.Feign:基于动态代理机制,根据注解和选择的机器,拼接请求 url 地址,发起请求。
3.Ribbon:实现负载均衡,从一个服务的多台机器中选择一台。
4.Hystrix:提供线程池,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免 了服务雪崩的问题。
5.Zuul:网关管理,由 Zuul 网关转发请求给对应的服务。
SpringCloud和Dubbo
SpringCloud和Dubbo都是现在主流的微服务架构
SpringCloud是Apache旗下的Spring体系下的微服务解决方案
Dubbo是阿里系的分布式服务治理框架
服务的注册中心来看,Dubbo使用了第三方的ZooKeeper作为其底层的注册中心,实现服务的注册和发现,SpringCloud使用Spring Cloud Netflix Eureka实现注册中心,当然SpringCloud也可以使用ZooKeeper实现,但一般我们不会这样做
服务网关,Dubbo并没有本身的实现,只能通过其他第三方技术的整合,而SpringCloud有Zuul路由网关,作为路由服务器,进行消费者的请求分发,SpringCloud还支持断路器,与git完美集成分布式配置文件支持版本控制,事务总线实现配置文件的更新与服务自动装配等等一系列的微服务架构要素
SpringBoot和SpringCloud
SpringBoot是Spring推出用于解决传统框架配置文件冗余,装配组件繁杂的基于 Maven的解决方案,旨在快速搭建单个微服务
而SpringCloud专注于解决各个微服务之间的协调与配置,服务之间的通信,熔断,负载 均衡等技术维度并相同,并且SpringCloud是依赖于SpringBoot的,而SpringBoot并不是依赖 与SpringCloud,甚至还可以和Dubbo进行优秀的整合开发
微服务之间是如何独立通讯的
1.远程过程调用(Remote Procedure Invocation):
也就是我们常说的服务的注册与发现
直接通过远程过程调用来访问别的service。
2.消息:
负载均衡的意义是什么?
在计算中,负载均衡可以改善跨计算机,计算机集群,网络链接,中央处理单元或磁盘驱动器等多种计算资源的工作负载分布。负载均衡旨在优化资源使用,最大吞吐量,最小响应时间并避免任何单一资源的过载。使用多个组件进行负载均衡而不是单个组件可能会通过冗余来提高可靠性和可用性。负载平衡通常涉及专用软件或硬件,例如多层交换机或域名系统服务进程。
Dubbo
概念:Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC 分布式服务框架,现已成为 Apache 基金会孵化项目。
为什么要用Dubbo?
因为是阿里开源项目,国内很多互联网公司都在用,已经经过很多线上考验。内部使用了 Netty、Zookeeper,保证了高性能高可用性。
使用 Dubbo 可以将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,可用于提高业务复用灵活扩展,使前端应用能更快速的响应多变的市场需求。
Dubbo 和 Spring Cloud 有什么区别?
两个没关联,如果硬要说区别,有以下几点。
1)通信方式不同
Dubbo 使用的是 RPC 通信,而 Spring Cloud 使用的是 HTTP RESTFul 方式。
组成部分不同
Spring cloud的组件比dobbu的更加完善
dubbo都支持什么协议,推荐用哪种?
dubbo://(推荐)--rmi://---hessian://---http://---webservice://---thrift://---memcached://---redis://---rest://
Dubbo内置了哪几种服务容器?
Spring Container---Jetty Container---Log4j Container
Dubbo默认使用什么注册中心,还有别的选择吗?
推荐使用 Zookeeper 作为注册中心,还有 Redis、Multicast、Simple 注册中心,但不推荐。
Dubbo有哪几种配置方式?
- Spring 配置方式
2)Java API 配置方式
Dubbo 核心的配置有哪些
ActiveMQ
概念:activeMQ是一种开源的,实现了JMS1.1规范的,面向消息(MOM)的中间件,为应用程序提供高效的、可扩展的、稳定的和安全的企业级消息通信。
activemq的作用以及原理
Activemq 的作用就是系统之间进行通信。 当然可以使用其他方式进行系统间通信, 如果使用 Activemq 的话可以对系统之间的调用进行解耦, 实现系统间的异步通信。 原理就是生产者生产消息, 把消息发送给activemq。 Activemq 接收到消息, 然后查看有多少个消费者, 然后把消息转发给消费者, 此过程中生产者无需参与。 消费者接收到消息后做相应的处理和生产者没有任何关系
activemq的几种通信方式
1.publish(发布)-subscribe(订阅)方式的处理
发布订阅模式的通信方式, 默认情况下只通知一次, 如果接收不到此消息就没有了。 这种场景只适用于对消息送达率要求不高的情况。 如果要求消息必须送达不可以丢失的话, 需要配置持久订阅。 每个订阅端定义一个 id, <property name="clientId" 在订阅是向 activemq 注册。 发布消息 <property name="subscriptionDurable" value="true"/>和接收消息时需要配置发送模式为持久化template.setDeliveryMode(DeliveryMode.PERSISTENT);。 此时如果客户端接收不到消息, 消息会持久化到服务端(就是硬盘上), 直到客户端正常接收后为止。
4.2p - p(点对点)方式的处理
Jenkins(看不懂)
JPA-SpringData(没接触过)
源码,看看框架的底层实现
Maven
概念:Maven 主要服务于基于 Java 平台的项目构建、依赖管理和项目信息管理。
Maven 的主要功能主要分为 5 点
依赖管理系统---多模块构建---一致的项目结构---一致的构建模型和插件机制
你们项目为什么选用 Maven 进行构建?
首先,Maven 是一个优秀的项目构建工具。使用maven,可以很方便的对项目进行分模块构建,这样在开发和测试打包部署时,效率会提高很多。
其次,Maven 可以进行依赖的管理。使用 Maven ,可以将不同系统的依赖进行统一管理,并且可以进行依赖之间的传递和继承。
Maven 规约是什么
Maven 要负责项目的自动化构建,以编译为例,Maven 要想自动进行编译,那么它必须知道 Java 的源文件保存在哪里,这样约定之后,不用我们手动指定位置,Maven 能知道位置,从而帮我们完成自动编译。
遵循**“约定>>>配置>>>编码”**。即能进行配置的不要去编码指定,能事先约定规则的不要去进行配置。这样既减轻了劳动力,也能防止出错。
Maven 有哪些优点和缺点
优点
简化了项目依赖管理。
- 易于上手,对于新手可能一个 mvn clean package 命令就可能满足我们的工作。2.便于与持续集成工具(Jenkins)整合。3.便于项目升级,无论是项目本身升级还是项目使用的依赖升级。4.有助于多模块项目的开发,一个模块开发好后,发布到仓库,依赖该模块时可以直接从仓库更新,而不用自己去编译。5.Maven 有很多插件,便于功能扩展,比如生产站点,自动发布版本等
缺点
Maven 采用约定优于配置的策略(convention over configuration),虽然上手容易,但是一旦出了问题,难于调试。
中国的网络环境差,很多 repository 无法访问,比如 Google Code、 JBoss 仓库无法访问等。
我们都知道,写完代码之后需要进行编译和运行,以笔者自身为例,使用 IDE 写完代码,需要进行编译,再生成 war 包,以便部署到 Tomcat。
在编写 Java 代码的时候,我们除了需要调用 JDK 的 API ,还需要调用许多第三方的 API ,假如没有构建工具,你需要把这些 jar 包下载到本地,然后添加进入工程,在 IDE 中进行添加设置。这种方式非常繁琐,并且在遇到版本升级,Git 同步等时候,程序会变得非常脆弱,极易产生未知错误。所以便有了构建工具的产生,它可以让我们专注于写代码,而不需要考虑如何导入 jar 包,如何升级 jar 包版本,以及 git 多人协作等等问题。这是在编译过程中的优势,在运行和发布的过程中,构建工具依然可以帮助我们将工程生成指定格式的文件。
Git
Git和svn的区别
概念
Git 是分布式版本控制系统(DVCS)。它可以跟踪文件的更改,并允许你恢复到任何特定版本的更改。
与 SVN 等其他版本控制系统(VCS)相比,其分布式架构具有许多优势,一个主要优点是它不依赖于中央服务器来存储项目文件的所有版本。
每个开发人员都可以“克隆”我在图中用“Local repository”标注的存储库的副本,并且在他的硬盘驱动器上具有项目的完整历史记录,因此当服务器中断时,你需要的所有恢复数据都在你队友的本地 Git 存储库中。
还有一个中央云存储库,开发人员可以向其提交更改,并与其他团队成员进行共享,如图所示,所有协作者都在提交更改“远程存储库”。
git pull 和 git fetch 有什么区别
git pull 命令从中央存储库中提取特定分支的新更改或提交,并更新本地存储库中的目标分支。
git fetch 也用于相同的目的,但它的工作方式略有不同。当你执行 git fetch 时,它会从所需的分支中提取所有新提交,并将其存储在本地存储库中的新分支中。如果要在目标分支中反映这些更改,必须在 git fetch 之后执行git merge。只有在对目标分支和获取的分支进行合并后才会更新目标分支。为了方便起见,请记住以下等式:
<center><h5>git pull = git fetch + git merge</h5></center>
在 Git 中提交的命令是什么?
用于写入提交的命令是 git commit -a。
现在解释一下 -a 标志, 通过在命令行上加 -a 指示 git 提交已修改的所有被跟踪文件的新内容。还要提一下,如果你是第一次需要提交新文件,可以在在 git commit -a 之前先 git add <file>。