一般问题
1、不同版本的Spring Framework有哪些主要功能?
2、什么是Spring Framework?
Spring是一个开源应用框架,旨在降低应用程序开发的复杂度。它是轻量级、松散耦合的。它具有分层体系结构,允许用户选择组件,同时还为J2EE应用程序开发提供了一个有凝聚力的框架。它可以集成其他框架,如 Structs、Hibernate、EJB 等,所以又称为框架的框架。
3、列举Spring Framework的优点。
由于Spring Frameworks 的分层架构,用户可以自由选择自己需要的组件。Spring Framework支持POJO(Plain Old Java Object) 编程,从而具备持续集成和可测试性。由于依赖注入和控制反转,JDBC得以简化。它是开源免费的。
4、Spring Framework有哪些不同的功能?
轻量级-Spring 在代码量和透明度方面都很轻便。
IOC-控制反转AOP-面向切面编程可以将应用业务逻辑和系统服务分离,以实现高内聚。
容器-Spring 负责创建和管理对象(Bean)的生命周期和配置。
MVC-对web应用提供了高度可配置性,其他框架的集成也十分方便。
事务管理 - 提供了用于事务管理的通用抽象层。Spring的事务支持也可用于容器较少的环境。
JDBC异常-Spring的JDBC抽象层提供了一个异常层次结构,简化了错误处理策略。
5、Spring Framework中有多少个模块,它们分别是什么?
6、什么是Spring配置文件?
Spring配置文件是XML文件。该文件主要包含类信息。它描述了这些类是如何配置以及相互引入的。但是,XML配置文件冗长且更加干净。如果没有正确规划和编写,那么在大项目中管理变得非常困难。
7、Spring应用程序有哪些不同组件?
Spring应用一般有以下组件:
接口-定义功能。
Bean 类-它包含属性,setter和getter方法,函数等。
Spring面向切面编程(AOP) -提供面向切面编程的功能。
Bean配置文件-包含类的信息以及如何配置它们。
用户程序-它使用接口。
8、使用Spring有哪些方式?
使用Spring有以下方式:
作为一个成熟的Spring Web应用程序。
作为第三方Web框架,使用Spring Frameworks中间层。
用于远程使用。
作为企业级Java Bean,它可以包装现有的POJO(Plain Old Java Objects)。
依赖注入(Ioc)
1、什么是Spring IOC容器?
Spring框架的核心是Spring容器。容器创建对象,将它们装配在一起,配置它们并管理它们的完整生命周期。Spring容器使用依赖注入来管理组成应用程序的组件。容器通过读取提供的配置元数据来接收对象进行实例化,配置和组装的指令。该元数据可以通过XML,Java注解或Java代码提供。
2、什么是依赖注入?
在依赖注入中,您不必创建对象,但必须描述如何创建它们。您不是直接在代码中将组件和服务连接在一起,而是描述配置文件中哪些组件需要哪些服务。由IoC容器将它们装配在一起。
3、可以通过多少种方式完成依赖注入?
通常,依赖注入方式可以通过三种方式实现:
构造函数注入
setter注入
接口注入
在Spring Framework 中,仅使用构造函数和setter注入。
4、区分构造函数注入和setter注入。
5、spring中有多少种IOC容器?
BeanFactory:
BeanFactory就像一个包含bean集合的工厂类。它会在客户端要求时实例化bean。
ApplicationContext:
ApplicationContext 接口扩展了BeanFactory接口。它在BeanFactory基础上提供了一些额外的功能。
6、区分BeanFactory和ApplicationContext。
7、列举IoC的一些好处。
8、Spring IoC的实现机制
实现机制:Spring中的IoC的实现原理就是工厂模式加反射机制。
interface Fruit {
public abstract void eat();
}
class Apple implements Fruit {
public void eat(){
System.out.println("Apple");
}
}
class Orange implements Fruit {
public void eat(){
System.out.println("Orange");
}
}
class Factory {
public static Fruit getInstance(String ClassName) {
Fruit f=null;
try {
f=(Fruit)Class.forName(ClassName).newInstance();
}
catch (Exception e) {
e.printStackTrace();
}
return f;
}
}
class Client {
public static void main(String[] a) {
Fruit f=Factory.getInstance("io.github.dunwu.spring.Apple");
if(f!=null){
f.eat();
}
}
}
Beans
1、什么是spring bean?
2、spring提供了哪些配置方式?
基于xml配置:
bean所需的依赖项和服务在 XML 格式的配置文件中指定。这些配置文件通常包含许多bean定义和特定于应用程序的配置选项。它们通常以bean标签开头。例如:
<beans> <context:annotation-config/> <!-- bean definitions go here --> </beans>
基于Java API配置:
Spring 的 Java配置是通过使用@Bean和@Configuration 来实现。
1、 @Bean注解扮演与元素相同的角色。
2、 @Configuration类允许通过简单地调用同一个类中的其他@Bean方法来定义bean间依赖关系。
@Configuration
public class StudentConfig {
@Bean
public StudentBean myStudent() {
return new StudentBean();
}
}
3、spring支持几种 bean scope 作用域?
Spring bean 支持5种 scope:
Singleton:
每个Spring IoC容器仅有一个单实例
Prototype:
每次请求都会产生一个新的实例。
Request:
每一次HTTP请求都会产生一个新的实例,并且该bean仅在当前 HTTP 请求内有效。
Session:每一次 HTTP请求都会产生一个新的 bean,同时该 bean仅在当前HTTP session内有效。Global-session:类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义。Portlet规范定义了全局Session的概念,它被所有构成某个portlet web应用的各种不同的portlet所共享。在 globalsession作用域中定义的bean被限定于全局portlet Session的生命周期范围内。
如果你在web中使用global session作用域来标识bean,那么web会自动当成session类型来使用。
仅当用户使用支持Web的 ApplicationContext 时,最后三个才可用。
4、spring bean容器的生命周期是什么样的?
spring bean容器的生命周期流程如下:
1、Spring容器根据配置中的bean定义中实例化bean。
2、Spring使用依赖注入填充所有属性,如bean中所定义的配置。
3、如果bean实现BeanNameAware 接口,则工厂通过传递bean的ID来调用setBeanName()。
4、如果bean实现BeanFactoryAware接口,工厂通过传递自身的实例来调用setBeanFactory()。
5、如果存在与bean关联的任何BeanPostProcessors,则调用preProcessBeforeInitialization() 方法。
6、如果为bean指定了init方法( 的init-method属性),那么将调用它。
7、最后,如果存在与bean关联的任何BeanPostProcessors,则将调用postProcessAfterInitialization() 方法。
8、如果bean实现DisposableBean接口,当spring容器关闭时,会调用destory()。
9、如果为bean指定了destroy方法( 的destroy-method属性),那么将调用它。
5、什么是spring的内部bean?
只有将bean用作另一个bean的属性时,才能将bean声明为内部bean。为了定义bean,Spring的基于XML的配置元数据在 或 中提供了 元素的使用。内部bean总是匿名的,它们总是作为原型。
例如,假设我们有一个Student类,其中引用了Person 类。这里我们将只创建一个Person类实例并在Student中使用它。
6、什么是spring装配?
当bean在Spring容器中组合在一起时,它被称为装配或bean装配。Spring容器需要知道需要什么bean以及容器应该如何使用依赖注入来将bean绑定在一起,同时装配bean。
7、自动装配有哪些方式?
Spring容器能够自动装配bean。也就是说,可以通过检查BeanFactory的内容让Spring自动解析bean的协作者。
自动装配的不同模式:
no:
这是默认设置,表示没有自动装配。应使用显式bean引用进行装配。
byName:
它根据bean的名称注入对象依赖项。它匹配并装配其属性与XML文件中由相同名称定义的bean。
byType:
它根据类型注入对象依赖项。如果属性的类型与XML文件中的一个bean名称匹配,则匹配并装配属性。构造函数-它通过调用类的构造函数来注入依赖项。它有大量的参数。
autodetect:
首先容器尝试通过构造函数使用autowire装配,如果不能,则尝试通过byType自动装配。
8、自动装配有什么局限?
覆盖的可能性 :
您始终可以使用 和 设置指定依赖项,这将覆盖自动装配。
基本元数据类型 :
简单属性(如原数据类型,字符串和类)无法自动装配。
令人困惑的性质:总是喜欢使用明确的装配,因为自动装配不太精确。
注解
1、什么是基于注解的容器配置?
不使用XML来描述 bean 装配,开发人员通过在相关的类,方法或字段声明上使用注解将配置移动到组件类本身。它可以作为 XML设置的替代方案。
例如:Spring的Java配置是通过使用@Bean和@Configuration来实现。 @Bean注解扮演与元素相同的角色。@Configuration类允许通过简单地调用同一个类中的其他@Bean方法来定义bean间依赖关系。
2、如何在spring中启动注解装配?
默认情况下,Spring容器中未打开注解装配。因此,要使用基于注解装配,我们必须通过配置<context:annotation-config/> 元素在Spring配置文件中启用它。
3、@Component, @Controller, @Repository、@Service有何区别?
@Component :
这将java类标记为bean。它是任何Spring管理组件的通用构造型。spring的组件扫描机制现在可以将其拾取并将其拉入应用程序环境中。
@Controller :
这将一个类标记为Spring Web MVC控制器。标有它的Bean会自动导入到IoC容器中。
@Service :
此注解是组件注解的特化。它不会对@Component注解提供任何其他行为。您可以在服务层类中使用@Service 而不是@Component,因为它以更好的方式指定了意图。
@Repository :
这个注解是具有类似用途和功能的@Component注解的特化。它为DAO提供了额外的好处。它将DAO导入 IoC容器,并使未经检查的异常有资格转换为Spring DataAccessException。
4、@Required注解有什么用?
@Required 应用于bean属性setter方法。此注解仅指示必须在配置时使用bean 定义中的显式属性值或使用自动装配填充受影响的bean属性。如果尚未填充受影响的bean属性,则容器将抛出eanInitializationException。
public class Employee {
private String name;
@Required
public void setName(String name){
this.name=name;
}
public string getName(){
return name;
}
}
5、@Autowired注解有什么用?
@Autowired可以更准确地控制应该在何处以及如何进行自动装配。此注解用于在setter方法,构造函数,具有任意名称或多个参数的属性或方法上自动装配bean。默认情况下,它是类型驱动的注入。
public class Employee {
private String name;
@Autowired
public void setName(String name) {
this.name=name;
}
public string getName(){
return name;
}
}
6、@Qualifier注解有什么用?
当您创建多个相同类型的bean并希望仅使用属性装配其中一个bean时,您可以使用@Qualifier 注解和@Autowired通过指定应该装配哪个确切的bean来消除歧义。
例如,这里我们分别有两个类,Employee和EmpAccount。在EmpAccount中,使用@Qualifier指定了必须装配id为emp1的bean。
public class Employee {
private String name;
@Autowired
public void setName(String name) {
this.name=name;
}
public string getName() {
return name;
}
}
public class EmpAccount {
private Employee emp;
@Autowired
@Qualifier(emp1)
public void showName() {
System.out.println(“Employee name : ”+emp.getName);
}
}
7、@RequestMapping注解有什么用?@Service有何区别?
@RequestMapping 注解用于将特定HTTP请求方法映射到将处理相应请求的控制器中的特定类/方法。此注释可应用于两个级别:
类级别:映射请求的URL方法级别:映射URL以及HTTP请求方法
数据访问
1、spring DAO有什么用?
Spring DAO使得JDBC,Hibernate或JDO这样的数据访问技术更容易以一种统一的方式工作。这使得用户容易在持久性技术之间切换。
它还允许您在编写代码时,无需考虑捕获每种技术不同的异常。
2、列举Spring DAO抛出的异常。
3、spring JDBC API中存在哪些类?
4、使用Spring访问Hibernate的方法有哪些?
我们可以通过两种方式使用Spring访问Hibernate:
1、 使用Hibernate模板和回调进行控制反转
2、 扩展HibernateDAOSupport并应用AOP拦截器节点
5、列举spring支持的事务管理类型
Spring支持两种类型的事务管理:
1、 程序化事务管理:在此过程中,在编程的帮助下管理事务。它为您提供极大的灵活性,但维护起来非常困难。
2、 声明式事务管理:在此,事务管理与业务代码分离。仅使用注解或基于 XML的配置来管理事务。
6、spring支持哪些ORM框架
Hibernate
Mybatis
JPA
JDO
OJB
AOP
1、什么是AOP
AOP(Aspect-Oriented Programming), 即 面向切面编程, 它与OOP( Object-Oriented Programming, 面向对象编程) 相辅相成, 提供了与OOP不同的抽象软件结构的视角,在OOP中, 我们以类(class)作为我们的基本单元, 而AOP中的基本单元是Aspect(切面)
2、什么是Aspect?
aspect由pointcount和advice组成, 它既包含了横切逻辑的定义, 也包括了连接点的定义Spring AOP就是负责实施切面的框架, 它将切面所定义的横切逻辑编织到切面所指定的连接点中AOP的工作重心在于如何将增强编织目标对象的连接点上, 这里包含两个工作:
1、如何通过pointcut和advice定位到特定的joinpoint上
2、如何在advice中编写切面代码。
以简单地认为, 使用@Aspect注解的类就是切面。
3、什么是切点(JoinPoint)
程序运行中的一些时间点, 例如一个方法的执行, 或者是一个异常的处理在Spring AOP中, join point总是方法的执行点。
4、什么是通知(Advice)?
特定JoinPoint处的Aspect所采取的动作称为Advice。Spring AOP 使用一个 Advice作为拦截器,在JoinPoint “周围”维护一系列的拦截器。
5、有哪些类型的通知(Advice)?
6、指出在spring aop中concern和cross-cuttingconcern的不同之处。
concern:
是我们想要在应用程序的特定模块中定义的行为。它可以定义为我们想要实现的功能 。
cross-cutting concern:
是一个适用于整个应用的行为,这会影响整个应用程序。例 如,日志记录,安全性和数据传输是应用程序几乎每个模块都需要关注的问题,因此它们是跨领域的问题
7、AOP有哪些实现方式?
实现AOP的技术,主要分为两大类 :
静态代理:AspectJ
动态代理:JDK动态代理、CGLIB
指使用AOP框架提供的命令进行编译,从而在编译阶段就可生成AOP代理类,因此也称为编译时增强
8、Spring AOP and AspectJ AOP有什么区别?
Spring AOP基于动态代理方式实现;AspectJ基于静态代理方式实现。
SpringAOP仅支持方法级别的PointCut;提供了完全的 AOP支持,它还支持属性级别的PointCut。
9、如何理解Spring中的代理?
将Advice应用于目标对象后创建的对象称为代理。在客户端对象的情况下,目标对象和代理对象是相同的。
Advice + Target Object = Proxy
10、什么是编织(Weaving)?
为了创建一个advice对象而链接一个aspect和其它应用类型或对象,称为编织(Weaving)。在Spring AOP中,编织在运行时执行。请参考下图:
MVC
1、Spring MVC框架有什么用?
Spring Web MVC框架提供 模型-视图-控制器 架构和随时可用的组件,用于开发灵活且松散耦合的Web应用程序。MVC模式有助于分离应用程序的不同方面,如输入逻辑,业务逻辑和UI逻辑,同时在所有这些元素之间提供松散耦合。
2、描述一下DispatcherServlet的工作流程
DispatcherServlet 的工作流程可以用一幅图来说明:
1、向服务器发送HTTP请求,请求被前端控制器DispatcherServlet捕获。
2、 DispatcherServlet根据-servlet.xml 中的配置对请求的URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回。
3、 DispatcherServlet根据获得的Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(…)方法)。
4、提取Request中的模型数据,填充Handler入参,开始执行Handler( Controller)。在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
5、Handler(Controller)执行完成后,向DispatcherServlet返回一个ModelAndView对象;
6、根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给
DispatcherServlet。
7、 ViewResolver 结合Model和View,来渲染视图。
8、视图负责将渲染结果返回给客户端。
3、介绍一下WebApplicationContext
WebApplicationContext是专门为web应用准备的,他允许从相对于web根目录的路劲中装载配置文件完成初始化工作,从WebApplicationContext中可以获得ServletContext的引用,整个Web应用上下文对象将作为属性放置在ServletContext中,以便web应用可以访问spring上下文,spring中提供WebApplicationContextUtils的getWebApplicationContext(ServletContext src)方法来获得WebApplicationContext对象
BeanFactory–BeanFactory实现举例。
Bean工厂是工厂模式的一个实现,提供了控制反转功能,用来把应用的配置和依赖从正真的应用代码中分离。
最常用的BeanFactory实现是XmlBeanFactory类。
6、XMLBeanFactory
最常用的就是org.springframework.beans.factory.xml.XmlBeanFactory ,它根据XML文件中的定义加载beans。该容器从XML文件读取配置元数据并用它去创建一个完全配置的系统或应用。
ApplicationContext通常的实现是什么?
FileSystemXmlApplicationContext :
此容器从一个XML文件中加载beans的定义,XML Bean配置文件的全路径名必须提供给它的构造函数。
ClassPathXmlApplicationContext:
此容器也从一个XML文件中加载beans的定义,这里,你需要正确设置classpath因为这个容器将在classpath里找 bean 配置。
WebXmlApplicationContext:
此容器加载一个XML文件,此文件定义了一个WEB应用的所有bean。
Bean工厂和Application contexts有什么区别?
Application contexts提供一种方法处理文本消息,一个通常的做法是加载文件资源(比如镜像),它们可以向注册为监听器的 bean发布事件。
另外,在容器或容器内的对象上执行的那些不得不由bean工厂以程序化方式处理的操作,可以在Application contexts中以声明的方式处理。Application contexts实现了MessageSource接口,该接口的实现以可插拔的方式提供获取本地化消息的方法。