JavaWeb编程面试题
面试题持续更新中…
1.什么是Spring框架?Spring框架有哪些主要模块?(简述题) Spring 是一种轻量级开发框架,旨在提高开发人员的开发效率以及系统的可维护性。 一般说spring框架指的是Spring Framework,它是很多模块的集合,这些模块是:核心容器、数据访问/集成、Web、AOP(面向切面编程)、工具、消息和测试模块。Spring框架的主要目的是简化Java后端开发工作。
2.Spring的优点?(简述题)
- spring属于低侵入式设计,代码的污染极低;
- spring的DI机制将对象之间的依赖关系交由框架处理,降低组件的耦合度;
- spring提供了AOP技术,支持将一些通用任务,如安全、事务、日志、权限等进行集中式管理,从而提供更好的复用;
- spring对于主流的应用框架提供了集成支持。
3.列举一些重要的spring模块?(简书题) 一些重要的Spring Framework模块:
- Spring Core:基础,可以说Spring其他所有的功能都需要依赖于该核心库。主要提供IOC依赖注入功能。
- Spring AOP:提供了面向切面的编程实现。
- Spring Aspects:该模块为与AspectJ的集成提供支持。
- Spring JDBC:Java数据库连接。
- Spring JMS:Java消息服务。
- Spring ORM:用于支持Mybatis、Hibernate等ORM框架的支持。
- Spring Web:为创建web应用程序提供支持。
- Spring Test:提供了对JUnit和TestNG测试的支持。
4.spring 常用的注入方式有哪些?(简述题) Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入方式主要有三种:
5.谈谈对Spring IoC的理解?(简述题) IoC(Inverse of Control:控制反转)是一种设计思想,就是将原本在程序中手动创建对象的控制权交由spring框架来管理。IoC在其他语言中也有应用,并非Spring特有。IoC容器是Spring用来实现IoC的载体,IoC容器实际上就是个Map(key, value),Map中存放的是各种对象。 将对象之间的相互依赖关系交给IOC容器来管理,并由IOC容器完成对象的注入。这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。IOC容器就像一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件或注解即可,完全不用考虑对象是如何被创建出来的。
6.谈谈对Spring AOP的理解?(简述题) AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无法,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。 Spring AOP就是基于动态代理的,如果要代理的对象实现了某个接口,那么Spring AOP会使用JDK Proxy,去创建代理对象。而对于没有实现接口的对象,就无法使用JDK Proxy去进行代理,这时候Spring AOP会使用Cglib,这时候Spring AOP会使用CGLIB生成一个被代理对象的子类来作为代理。 使用AOP之后我们可以把一些通用的功能抽象出来,在需要用到的地方直接使用即可,这样大大简化了代码量。我们需要增加新功能时也方便,提供了系统的扩展性。日志功能、事务管理等等场景都用到了AOP。
7.spring 支持几种 bean的作用域?(简述题) 当通过spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域。 Spring支持如下6种作用域:
- singleton:单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例。
- prototype:原型模式,每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例。
- request:对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,即每次HTTP请求将会产生不同的Bean实例。只有在Web应用中使用Spring时,该作用域才有效。
- session:对于每次HTTP Session,使用session定义的Bean都将产生一个新实例。同样只有在Web应用中使用Spring时,该作用域才有效。
- application:整个应用活动期间。
- websocket:一次端口通信。
其中比较常用的是singleton和prototype两种作用域。对于singleton作用域的Bean,每次请求该Bean都将获得相同的实例。容器负责跟踪Bean实例的状态,负责维护Bean实例的生命周期行为;如果一个Bean被设置成prototype作用域,程序每次请求该id的Bean,Spring都会新建一个Bean实例,然后返回给程序。在这种情况下,Spring容器仅仅使用new 关键字创建Bean实例,一旦创建成功,容器不在跟踪实例,也不会维护Bean实例的状态。 如果不指定Bean的作用域,Spring默认使用singleton作用域。Java在创建Java实例时,需要进行内存申请;销毁实例时,需要完成垃圾回收,这些工作都会导致系统开销的增加。因此,prototype作用域Bean的创建、销毁代价比较大。而singleton作用域的Bean实例一旦创建成功,可以重复使用。因此,除非必要,否则尽量避免将Bean被设置成prototype作用域。
8.spring自动装配 bean 有哪些方式?(简述题) Spring容器负责创建应用程序中的bean同时通过ID来协调这些对象之间的关系。作为开发人员,我们需要告诉Spring要创建哪些bean并且如何将其装配到一起。 spring中bean装配有两种方式:
- 隐式的bean发现机制和自动装配
- 在Java代码或者XML中进行显示配置
当然这些方式也可以配合使用。
9.spring中的bean是线程安全的吗?(简述题) spring中的bean默认是单例模式,spring容器本身并没有提供线程安全的策略,因为是否线程安全完全取决于bean本身的特性。
10.Spring 框架中用到了哪些设计模式?(简述题) 关于下面一些设计模式的详细介绍
- 工厂设计模式 : Spring使用工厂模式通过 BeanFactory、ApplicationContext 创建 bean 对象。
- 代理设计模式 : Spring AOP 功能的实现。
- 单例设计模式 : Spring 中的 Bean 默认都是单例的。
- 模板方法模式 : Spring 中 jdbcTemplate、hibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。
- 包装器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
- 观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。
- 适配器模式 :Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配Controller。
11.@Component 和 @Bean 的区别是什么?(简述题)
- 作用对象不同: @Component 注解作用于类,而@Bean注解作用于方法。
- @Component通常是通过类路径扫描来自动侦测以及自动装配到Spring容器中(我们可以使用 @ComponentScan 注解定义要扫描的路径从中找出标识了需要装配的类自动装配到 Spring 的 bean 容器中)。@Bean 注解通常是我们在标有该注解的方法中定义产生这个 bean,@Bean告诉了Spring这是某个类的示例,当我需要用它的时候还给我。
- @Bean 注解比 Component 注解的自定义性更强,而且很多地方我们只能通过 @Bean 注解来注册bean。比如当我们引用第三方库中的类需要装配到 Spring容器时,则只能通过 @Bean来实现。
12.将一个类声明为Spring的 bean 的注解有哪些? 我们一般使用 @Autowired 注解自动装配 bean,要想把类标识成可用于 @Autowired注解自动装配的 bean 的类,采用以下注解可实现:
- @Component :通用的注解,可标注任意类为 Spring 组件。如果一个Bean不知道属于拿个层,可以使用@Component 注解标注。
- @Repository : 对应持久层即 Dao 层,主要用于数据库相关操作。
- @Service : 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao层。
- @Controller : 对应 Spring MVC 控制层,主要用户接受用户请求并调用 Service 层返回数据给前端页面。
|