1. 什么是Maven

Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。当你使用Maven的时候,你用一个明确定义的项目对象模型来描述你的项目,然后Maven可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件。
Maven 有一个生命周期,当你运行 mvn install 的时候被调用。这条命令告诉 Maven 执行一系列的有序的步骤,直到到达你指定的生命周期。遍历生命周期旅途中的一个影响就是,Maven 运行了许多默认的插件目标,这些目标完成了像编译和创建一个 JAR 文件这样的工作。
此外,Maven能够很方便的帮你管理项目报告,生成站点,管理JAR文件,等等。

2. 什么是SVN。

SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS、CVS,它采用了分支管理系统,它的设计目标就是取代CVS。互联网上很多版本控制服务已从CVS迁移到Subversion。说得简单一点SVN就是用于多个人共同开发同一个项目,共用资源的目的。

3. 什么是GIT。

Git(读音为/gɪt/。)是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。[1]  Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

4. Java常用构建工具区别(ant,maven,gradle区别)。

Java世界中主要有三大构建工具:Ant、Maven和Gradle
目前:Ant已经销声匿迹、Maven也没落了,而Gradle的发展则如日中天。
Maven的主要功能主要有,分别是依赖管理系统、多模块构建、一致的项目结构、一致的构建模型和插件机制。
第一Maven为Java世界引入了一个新的依赖管理系统。在Java世界中,可以用groupId、artifactId、version组成的Coordination(坐标)唯一标识一个依赖。任何基于Maven构建的项目自身也必须定义这三项属性,生成的包可以是Jar包,也可以是war包或者ear包。一个典型的依赖引用如下所示:
Gradle在设计的时候基本沿用了Maven的这套依赖管理体系。不过它在引用依赖时还是进行了一些改进。首先引用依赖方面变得非常简洁。
第二,Maven和Gradle对依赖项的scope有所不同。在Maven世界中,一个依赖项有6种scope,分别是complie(默认)、provided、runtime、test、system、import。而grade将其简化为了4种,compile、runtime、testCompile、testRuntime。那么如果想在gradle使用类似于provided的scope怎么办?别着急,由于gradle语言的强大表现力,我们可以轻松编写代码来实现类似于provided scope的概念(例如How to use provided scope for jar file in Gradle build?)。
第三点是Gradle支持动态的版本依赖。在版本号后面使用+号的方式可以实现动态的版本管理。
第四点是在解决依赖冲突方面Gradle的实现机制更加明确。 

5. 常用源码版本管理工具有几种,并说明其优缺点(svn,git)。

其实Git和SVN还是挺像的,都有提交,合并等操作,看来这是源码管理工具的基本操作。
 1. Git是分布式的,SVN是集中式的,好处是跟其他同事不会有太多的冲突,自己写的代码放在自己电脑上,一段时间后再提交、合并,也可以不用联网在本地提交;
2. Git下载下来后,在本地不必联网就可以看到所有的log,很方便学习,SVN却需要联网;
3. Git鼓励分Branch,而SVN,说实话,我用Branch的次数还挺少的,SVN自带的Branch merge我还真没用过,有merge时用的是Beyond Compare工具合并后再Commit的;
4. Tortoise也有出Git版本,真是好东西;
5. SVN在Commit前,我们都建议是先Update一下,跟本地的代码编译没问题,并确保开发的功能正常后再提交,这样其实挺麻烦的,有好几次同事没有先Updata,就Commit了,发生了一些错误,耽误了大家时间,Git可能这种情况会少些。 

6. 什么是MVC?常用的MVC框架有哪些?

1、M:Model 模型层 主要用来处理业务逻辑,承载数据;
2、V:View 视图层 主要用来做页面显示的
3、C:Control 控制层 主要用来进行业务流程控制;
4、常用的MVC框架包括:Struts、Struts2、SpringMVC;谈谈Struts2的工作流程(或运行原理)。
1、客户端发送一个指向Servlet容器(例如Tomcat)的请求
2、这个请求经过一系列的过滤器(Filter)
3、接着核心控制器FilterDispatcher被调用(2.3以后是StrutsPrepareAndExecuteFilter过滤器),将request中所携带的数据放入值栈(ValueStack);
4、 核心控制器询问ActionMapper来决定这个请求是否需要调用某个Action,把请求的处理交给ActionProxy;
5、 ActionProxy通过Configuration Manager询问框架的配置文件(struts.xml),找到调用的Action类;
6、 ActionProxy创建一个ActionInvocation的实例;
7、 ActionInvocation在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用;
8、 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果(JSP显示结果)。

7. Struts框架的优缺点。

优点:
1、实现MVC模式,结构清晰,使开发者只关注业务逻辑的实现;
2、有丰富的tag可以用 ,Struts的标记库(Taglib),如能灵活动用,则能大大提高开发效率;
3、通过配置文件,使系统的脉络更加清晰。一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着很大的好处。
4、Struts提供了两种异常处理方式,声明式异常处理和编程式异常处理
5、对国际化进行支持,支持I18N;
缺点:
1、实现MVC模式,代码复杂度提升;
2、需要维护配置文件,比较麻烦;

8. 说说struts2和springmvc的区别?

  1. 拦截机制的不同  
    Struts2是类级别的拦截,每次请求就会创建一个Action,和Spring整合时Struts2的ActionBean注入作用域是原型模式prototype,然后通过setter,getter吧request数据注入到属性。Struts2中,一个Action对应一个request,response上下文,在接收参数时,可以通过属性接收,这说明属性参数是让多个方法共享的。Struts2中Action的一个方法可以对应一个url,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了,只能设计为多例。   
    SpringMVC是方法级别的拦截,一个方法对应一个Request上下文,所以方法直接基本上是独立的,独享request,response数据。而每个方法同时又何一个url对应,参数的传递是直接注入到方法中的,是方法所独有的。处理结果通过ModeMap返回给框架。在Spring整合时,SpringMVC的Controller Bean默认单例模式Singleton,所以默认对所有的请求,只会创建一个Controller,有应为没有共享的属性,所以是线程安全的,如果要改变默认的作用域,需要添加@Scope注解修改。   
    Struts2有自己的拦截Interceptor机制,SpringMVC这是用的是独立的Aop方式,这样导致Struts2的配置文件量还是比SpringMVC大。
    2、底层框架的不同  
    Struts2采用Filter(StrutsPrepareAndExecuteFilter)实现,SpringMVC(DispatcherServlet)则采用Servlet实现。Filter在容器启动之后即初始化;服务停止以后坠毁,晚于Servlet。Servlet在是在调用时初始化,先于Filter调用,服务停止后销毁。
    3、性能方面  
    Struts2是类级别的拦截,每次请求对应实例一个新的Action,需要加载所有的属性值注入,SpringMVC实现了零配置,由于SpringMVC基于方法的拦截,有加载一次单例模式bean注入。所以,SpringMVC开发效率和性能高于Struts2。
    4、配置方面  
    spring MVC和Spring是无缝的。从这个项目的管理和安全上也比Struts2高。

9. 什么是AOP?

1.AOP为Aspect Oriented Programming的缩写,意为:面向切面编程(也叫面向方面),可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种思想。
2.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 当项目中需要编写大量相同功能重复代码时,可以考虑使用AOP的形式来实现。如声明式事务管理、权限校验等

10. 什么是IOC和DI?

1.IOC是控制反转,DI是依赖注入,其基本含义差不多。
2.IOC:原来创建对象的控制权是由我们自己来创建的,现在不再是由程序员创建了,由IOC容器为我们提供,这样带来的好处是,降低代码的耦合度,更加符合开闭原则;备注:学生需要知道怎么在配置文件里配置相关信息,面试官可能会问。

11. 依赖注入的两种方式?

1.Set注入
2.构造器注入

12. Web应用开发中,如何启用Spring框架支持,写出关键配置。

在WebApp中获得XMLWebApplicationContext的步骤
1.在Web.xml中配置上下文载入器.
2.指定上下文载入器的配置文件.
3.获得应用上下文.

13. 简述Spring Aop 实现方法(cglib,java proxy差别)。

springAOP主要通过Java 动态代理的方式进行实现。 
GCLIB代理  
cglib(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。  
cglib封装了asm,可以在运行期动态生成新的class。  
cglib用于AOP,jdk中的proxy必须基于接口,cglib却没有这个限制。
原理区别:
java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。
1.如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 
2.如果目标对象实现了接口,可以强制使用CGLIB实现AOP 
3.如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换

14. Spring框架为企业级开发带来的好处有哪些?

1. IoC容器:IoC容器帮助应用程序管理对象以及对象之间的依赖关系,对象之间的依赖关系如果发生了改变只需要修改配置文件而不是修改代码,因为代码的修改可能意味着项目的重新构建和完整的回归测试。有了IoC容器,程序员再也不需要自己编写工厂、单例,这一点特别符合Spring的精神“不要重复的发明轮子”。
2. AOP:面向切面编程,将所有的横切关注功能封装到切面(aspect)中,通过配置的方式将横切关注功能动态添加到目标代码上,进一步实现了业务逻辑和系统服务之间的分离。另一方面,有了AOP程序员可以省去很多自己写代理类的工作。
3. MVC:Spring的MVC框架是非常优秀的,从各个方面都可以甩Struts 2几条街,为Web表示层提供了更好的解决方案。
 4. 事务管理:Spring以宽广的胸怀接纳多种持久层技术,并且为其提供了声明式的事务管理,在不需要任何一行代码的情况下就能够完成事务管理。 

15. SpringMVC 执行流程。

1.用户请求首先发送到前端控制器DispatcherServlet,DispatcherServlet根据请求的信息来决定使用哪个页面控制器Controller(也就是我们通常编写的Controller)来处理该请求。找到控制器之后,DispatcherServlet将请求委托给控制器去处理。
2.接下来页面控制器开始处理用户请求,页面控制器会根据请求信息进行处理,调用业务层等等,处理完成之后,会把结果封装成一个ModelAndView返回给DispatcherServlet。
3.前端控制器DispatcherServlet接到页面控制器的返回结果后,根据返回的视图名选择相应的试图模板,并根据返回的数据进行渲染。
4.最后前端控制器DispatcherServlet将结果(如jsp)返回给用户。

16. 描述Spring 事务的概念。

  1. 事务简介:事务管理是企业级应用程序开发中必不可少的技术,用来确保数据的完整性和一致性事务就是一系列的动作,它们被当作一个单独的工作单元。这些动作要么全部完成,要么全部不起作用
  2. 事务的四个关键属性(ACID)
    ① 原子性(atomicity):事务是一个原子操作,有一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用
    ② 一致性(consistency):一旦所有事务动作完成,事务就被提交。数据和资源就处于一种满足业务规则的一致性状态中
    ③ 隔离性(isolation):可能有许多事务会同时处理相同的数据,因此每个事物都应该与其他事务隔离开来,防止数据损坏
    ④ 持久性(durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响。通常情况下,事务的结果被写到持久化存储器中

17. 描述Spring 事务管理机制。

作为企业级应用程序框架,Spring在不同的事务管理API之上定义了一个抽象层。而应用程序开发人员不必了解底层的事务管理API,就可以使用Spring的事务管理机制。
Spring既支持编程式事务管理(也称编码式事务),也支持声明式的事务管理
编程式事务管理:将事务管理代码嵌入到业务方法中来控制事务的提交和回滚,在编程式事务中,必须在每个业务操作中包含额外的事务管理代码
声明式事务管理:大多数情况下比编程式事务管理更好用。它将事务管理代码从业务方法中分离出来,以声明的方式来实现事务管理。事务管理作为一种横切关注点,可以通过AOP方法模块化。Spring通过Spring AOP框架支持声明式事务管理。

18. 描述Spring 事务的方式。

如何在Spring配置文件中定义事务管理器:
声明对本地事务的支持:
a)JDBC及iBATIS、MyBatis框架事务管理器
<bean id="txManager" class="org.springframework.jdbc.datasource
	.DataSourceTransactionManager">    
	<property name="dataSource" ref="dataSource"/>
	</bean>
	<tx:advice id=”txAdvice” transaction-manager=”txManager”>	<tx:attributes>		
	<tx:method name=”delete*” propagation=”REQUIRED” />	
	</tx:attributes></tx:advice> <aop:config>	
	<aop:cutpoint expression=”execution(* com.muke.mytest.service.impl*.*(..))” id=”pointcut1”>												<aop:advisor advice-ref=”txAdvice” pointcut-ref=”pointcut1” />	
	</aop:cutpoint></aop:config> 

19. 描述Spring 事务的属性。

在Spring中,声明式事务是通过事务属性来定义的,事务属性描述了事务策略如何应用到方法上。尽管Spring提供了多种声明式事务的机制,但是所有的方式都依赖这五个参数来控制如何管理事务策略。声明式事务通过传播行为,隔离级别,只读提示,事务超时及回滚规则来进行定义。
Spring事务的传播行为:
当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。
事务的传播行为可以由传播属性指定。Spring定义了7种传播行为:
1.Propagation.REQUIRED方法被调用时自动开启事务,在事务范围内使用则使用同一个事务,否则开启新事务。       
2.Propagation.REQUIRES_NEW无论何时自身都会开启事务
3.Propagation.SUPPORTS自身不会开启事务,在事务范围内则使用相同事务,否则不使用事务
4.Propagation.NOT_SUPPORTED自身不会开启事务,在事务范围内使用挂起事务,运行完毕恢复事务
5.Propagation.MANDATORY自身不开启事务,必须在事务环境使用否则报错
6.Propagation.NEVER自身不会开启事务,在事务范围使用抛出异常
7.Propagation.NESTED如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按
TransactionDefinition.PROPAGATION_REQUIRED 属性执行。需要JDBC3.0以上支持。

20. 描述Spring 事务的隔离级别。

  1. ISOLATION_DEFAULT: 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。另外四个与JDBC的隔离级别相对应
  2. ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。
  3. ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据 .
  4. ISOLATION_REPEATABLE_READ: 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。 它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。
  5. ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。
    除了防止脏读,不可重复读外,还避免了幻像读。

21. 描述Spring 事务的只读、超时、回滚的原则。

  1. Spring事务的只读
    “只读事务”并不是一个强制选项,它只是一个“暗示”,提示数据库驱动程序和数据库系统,这个事务并不包含更改数据的操作,那么JDBC驱动程序和数据库就有可能根据这种情况对该事务进行一些特定的优化,比方说不安排相应的数据库锁,以减轻事务对数据库的压力,毕竟事务也是要消耗数据库的资源的。“只读事务”仅仅是一个性能优化的推荐配置而已,并非强制你要这样做不可。
  2. Spring事务的事务超时
    为了使应用程序更好的运行,事务不能运行太长的时间。因此,声明式事务的第四个特性就是超时。
  3. Spring事务的回滚规则
    默认情况下,事务只有在遇到运行期异常时才会回滚,而在遇到检查型异常时不会回滚,但是也可以声明事务在遇到特定的检查型异常时像遇到运行期异常那样回滚。同样,你还可以声明事务遇到特定的异常不回滚,即使这些异常是运行期异常。

22. Spring Boot 的优点。

1.创建独立的Spring应用程序
2.嵌入式的Tomcat,不需要部署war包
3.简化Maven配置
4.自动配置Spring
5.提供生产就绪型功能,如指标,健康检查,和外部配置
6.开箱即用,没有代码生成,也无需XML配置

23. Spring中自动装配的方式有哪些?

no:不进行自动装配,手动设置Bean的依赖关系。

  • byName:根据Bean的名字进行自动装配。
  • byType:根据Bean的类型进行自动装配。
  • constructor:类似于byType,不过是应用于构造器的参数,如果正好有一个Bean与构造器的参数类型相同则可以自动装配,否则会导致错误。
  • autodetect:如果有默认的构造器,则通过constructor的方式进行自动装配,否则使用byType的方式进行自动装配。

24. Spring中的自动装配有哪些限制?

 如果使用了构造器注入或者setter注入,那么将覆盖自动装配的依赖关系。
 - 基本数据类型的值、字符串字面量、类字面量无法使用自动装配来注入。
- 优先考虑使用显式的装配来进行更精确的依赖注入而不是使用自动装配。

25. Spring JavaConfig 与Xml配置优缺点。

xml配置
优势:集中配置,代码配置分离更加方便管理
劣势:繁杂,编译期不容易发现错误
javaConfig配置
优势:代码简洁,
劣势:国内xml配置方式比较多,不容易被人接受

26. Spring IOC容器中Bean范围(scope)有几个?

singleton
prototype 多例即原型
Request  和http请求关联
Session 会话
application 应用程序

27. 阐述Spring框架中Bean的生命周期?

Spring IoC容器找到关于Bean的定义并实例化该Bean。
② Spring IoC容器对Bean进行依赖注入。
方法被调用。
当销毁Bean实例时,如果Bean实现了DisposableBean接口,则调用其destroy方法。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐