Java面试题-Spring(二)
Java面试题-Spring(二)
-
什么是Spring的内部Bean?
只有将bean用作另一个bean的属性时,才能将bean声明为内部bean。为了定义bean,Spring的基于xml的配置元数据提供了元素的使用。内部bean总是匿名的,它们总是作为原型。
-
什么是Spring装配?
当bean在Spring容器中组合在一起时,它被称为装配或bean装配。Spring容器需要知道需要什么bean以及容器应该如何使用依赖注入来将bean绑定在一起,同时装配bean。
-
自动装配有哪些方式?
Spring容易能够自动装配bean。可以通过检查BeanFactory的内容让Spring自动解析bean的协作者。
自动装配的不同模式:
- no:这是默认配置,表示没有自动装配;
- byName:它根据bean的名称注入对象依赖项。它匹配并装配其属性与xml文件中由相同名称定义的bean。
- byType:它根据类型注入对象依赖项。如果属性的类型与xml文件中的一个bean名称匹配,则匹配并装配属性。构造函数:它通过调用类的构造函数来注入依赖项。它有大量的参数。
- autodetect:首先容器尝试通过构造函数使用autowire装配,如果不能,则尝试通过byTyoe自动装配。
-
自动装配有什么局限?
覆盖的可能性:始终可以使用和设置指定依赖项,这将覆盖自动装配。
基本元数据类型:简单属性(如原数据类型、字符串和类)无法自动装配。
令人困惑的性质:总是喜欢使用明确的装配,因为自动装配不太精确。
-
什么是基于注解的容器配置
不使用xml来描述bean装配,开发人员通过在相关的类、方法或字段上声明使用注解将配置移动到组件类本身。它可以作为xml设置的替代方案。
例如:Spring的Java配置是通过使用@Bean和@Configuration来实现。@Bean注解扮演与元素相同的角色。@Configuration类允许通过简单的调用同一个类中其他@Bean方法来定义bean间依赖关系。
例如
@Configuration public class StudentConfig{ @Bean public StudentBean myStudent(){ return new StudentBean(); } }
-
如何在Spring中启动注解装配?
默认情况下,Spring容器未打开注解装配。因此,要使用基于注解装配,我们必须通过配置<context:annotation-config />元素在Spring配置文件中启用它。
-
@Component,@Controller,@Repository,@Service有何区别?
-
@Component:这将java类标记成bean。它是任何Spring管理组件的通用构造型。Spring组件的扫描机制现在可以将其拾取并将其拉入应用程序环境中。
-
@Controller:这将一个类标记为Spring Web MVC控制器。标有它的Bean会自动导入到IoC容器中。
-
@Service:此注解是组件注解的特化。它不会对@Component注解提供任何其他行为。您可以在服务层中使用@Service而不是@Component,因为它以更好的方式指定了意图。
-
@Repository:这个注解是具有类似用途和功能的@Component注解的特化。它为DAO提供了额外的好处。它将DAO导入IOC容器,并使未经检查的异常有资格转换为SpringDataAccessException。
-
-
@Required注解有什么用?
@Required应用于bean属性的setter方法。此注解仅指示必须在配置时使用bean定义中的显示属性值或使用自动装配填充受影响的bean属性。如果尚未填充受影响的bean属性,则容器将抛出BeanInitialzationException。
-
@Autowired注解有什么用?
@Autowired可以更准确地控制应该在何处以及如何进行自动装配。此注解用于在setter方法,构造函数,具有 任意名称或多个参数的属性或方法上自动装配bean。默认情况下,它是类型驱动的注入。
-
@Qualifier注解有什么用?
当创建多个相同类型的bean并希望仅使用属性装配其中一个bean时,可以使用@Qualifier注解和@Autowired通过指定应该装配哪个确切的bean来消除歧义。
-
@RequestMapping注解有什么用?
@RequestMapping注解用户将特定Http请求方法映射到将处理相应请求的控制器中的特定类/方法。此注释可应用于两个级别:
- 类级别:映射请求的URL
- 方法级别:映射URL以及HTTP请求方法
-
SpringDAO有什么用?
SpringDAO使得JDBC,Hibernate或JDO这样的数据访问技术更容易以一种统一的方式工作。这使得用户容易在持久性技术之间切换。它还允许在编写代码时,无需考虑捕获每种技术不同的异常。
-
Spring JDBC API中存在哪些类?
- JbdcTemplate
- SimpleJdbcTemplate
- NameParameterJdbcTemplate
- SimpleJdbcInsert
- SimpleJdbcCall
-
使用Spring访问Hibernate的方法有哪些?
- 使用Hibernate模板和回调进行控制反转;
- 扩展HibernateDAOSupport并应用AOP拦截器节点。
-
列举Spring支持的事务管理类型
Spring支持两种类型的事务管理:
- 程序化事务管理:在此过程中,在编程的帮助下管理事务。它具有极大的灵活性,但维护困难。
- 声明式事务管理:在此,事务管理与业务代码分离。仅使用注解或基于xml的配置来管理事务。
-
Spring支持哪些ORM框架?
- Hibernate
- Mybatis
- JPA
- JDO
- OJB
-
什么是AOP?
AOP就是面向切面编程,它与OOP面向对象编程相辅相成,提供了与OOP不同观点抽象软件结构的视角。在OOP中,我们以类Class作为我们的基本单元,而AOP中的基本单元是Aspect切面。
-
什么是Aspect?
Aspect由pointcount和advice组成。它既包含了横切逻辑的定义,也包括了连接点的定义。SpringAOP就是负责实施切面的框架,它将切面所定义的横切逻辑编织到切面所指定的连接点中。AOP的工作重心在于如何将增强编织目标对象的连接点上,这里包含两个工作:
- 如何通过pointcut和advice定位到特定的joinpoint上;
- 如何在advice中编写切面代码。
-
什么是切点(JoinPoint)?
切点是程序运行中的一些时间点,例如一个方法的执行,或是一个异常的处理。在SpringAOP中,JoinPoint总是方法的执行点。
-
什么是通知(Advice)?
特定JoinPoint处的Aspect所采取的动作称为Advice。SpringAOP使用一个Advice作为拦截器,在JoinPoint的周围维护一系列的拦截器。
-
有哪些类型的通知(Advice)?
- Before:这些类型的Advice在JoinPoint方法之前执行,并使用@Before注解标记进行配置。
- After Returning:这些类型的Advice在连接点方法正常执行后执行,并使用@AfterReturning注解标记进行配置。
- After Throwing:这些类型的Advice仅在JoinPoint方法通过抛出异常退出并使用@AfterThrowing注解标记配置时执行。
- After(finally):这些类型的Advice在连接点方法之后执行,无论方法退出是正常还是异常返回,并使用@After注解标记进行配置。
- Around:这些类型的Advice在连接点之前和之后执行,并使用@Around注解标记进行配置。
-
指出在Spring aop中Concern和cross-cuttingconcern的不同之处。
concern是我们想要在应用程序的特定模块中定义的行为,它可以定义为我们想要实现的功能。
cross-cutting concern是一个适用于整个应用的行为,这会影响整个应用程序。例如日志记录、安全性和数据传输是应用程序几乎每个模块都需要关注的问题,因此它们是跨领域的问题。
-
AOP有哪些实现方式?
实现AOP 的技术主要分两大类:
- 静态代理:指使用AOP框架提供的命令进行编译,从而在编译阶段就可生产AOP代理类,因此也称为编译时增强
- 编译时编织(特殊编译器实现)
- 类加载时编织(特殊的类加载器实现)
- 动态代理:在运行时在内存中“临时”生成AOP动态代理类,因此也被称为运行时增强。
- JDK动态代理
- CGLIB
- 静态代理:指使用AOP框架提供的命令进行编译,从而在编译阶段就可生产AOP代理类,因此也称为编译时增强
-
Spring AOP和AspectJ AOP有什么区别?
Spring AOP基于动态代理的方式实现,AspectJ基于静态代理方式实现。
Spring AOP仅支持方法级别的PointCut;AspectJ提供了完全的AOP支持,它还支持属性级别的PointCut。
-
如何理解Spring中的代理?
将Advice应用于目标对象 后创建的对象称为代理,在客户端对象的情况下,目标对象和代理对象是相同的。
-
什么是编织(Weaving)?
为了创建一个Advice对象而链接一个Aspect和其它应用类型或对象,称为编织(Weaving)。在Spring AOP中,编织在运行时执行。
-
Spring MVC框架有什么用?
Spring MVC框架提供模型-视图-控制器架构和随时可用的组件,用于开发灵活且松散耦合的Web应用程序。MVC模式有助于分离应用程序的不同方面,如输入逻辑,业务逻辑 和UI逻辑,同时在所有这些元素之间提供松散耦合。
-
描述一下DispatcherServlet的工作流程
- 向服务器发送Http请求,请求被前端控制器DispatcherServlet捕获。
- DispatcherServlet根据server.xml中的配置对请求的url进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回。
- DispatcherServlet根据获得的Handler,选择一个合适的HandlerAdapter。(如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法)。
- 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。在填充Handler的入参过程中,根据自身的配置,Spring将帮助做一些额外的工作:
- HttpMessageConveter:将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的相应信息。
- 数据转换:对请求消息进行数据转换。如String转换成Integer、Double等。
- 数据格式化:对请求消息进行数据格式化。如将字符串转换成格式化数字或格式化日期等。
- 数据验证:验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中。
- Handler(Controller)执行完成后,向DispatcherServlet返回一个ModelAndView对象;
- 根据返回的ModelAndView,选择一个合适的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet。
- ViewResolver结合Model和View来渲染视图。
- 视图复制将渲染结果返回客户端。
-
什么是WebApplicationContext?
WebApplicationContext是ApplicationContext的扩展,它具有Web应用程序所需的一些额外功能。它与普通的ApplicationContext在解析主题和决定与哪个Servlet关联的能力方面有所不同。
-
什么是Spring?
Spring是Java企业级应用的开源开发框架。Spring只要用于开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring框架目标是简化Java企业级应用开发,并通过POJO为基础的编程模型促进良好的编程习惯。
-
使用Spring框架的好处是什么?
- 轻量:Spring是轻量的,基本版本大约2MB;
- 控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。
- 面向切面的编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。
- 容器:Spring包含并管理应用中对象的声明周期和配置。
- MVC框架:Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。
- 事务管理:Spring提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。
- 异常处理:Spring提供方便的API把具体技术相关的异常转化为一致的unchecked异常。
-
Spring由哪些模块组成?
- Core
- Bean
- Context
- Expression Language
- JDBC
- ORM
- OXM
- Java Messaging Servi(JMS)
- Transaction
- Web
- Web-Servlet
- Web-Struts
- Web-Portlet