欢迎关注WX公众号:“程序猿补课班”,分享Java相关技术知识,学习经验,面试经验等。小伙伴快来补课吧!
正文开始
1.使用 Spring 框架的好处是什么?
轻量:Spring 是轻量的,基本的版本大约 2MB
控制反转:Spring 通过控制反转实现了松散耦合,对象们给出它们的依赖而不是创建或查找依赖的对象
面向切面的编程(AOP):Spring 支持面向切面的编程,并且把应用业务逻辑和系统服务分开
容器:Spring 包含并管理应用中对象的生命周期和配置
事务管理:Spring 提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)
异 常 处 理 :Spring 提 供 方 便 的 API 把 具 体 技 术 相 关 的 异 常 ( 比 如 由 JDBC
Hibernate or JDO 抛出的)转化为一致的 unchecked 异常
2.Spring BeanFactory与FactoryBean的区别
1)BeanFactory 是接口,提供了IOC容器最基本的形式,给具体的IOC容器的实现提供了规范,顶层接口。
2)FactoryBean 也是接口,为IOC容器中Bean的实现提供了更加灵活的方式,FactoryBean在IOC容器的基础上给Bean的实现加上了一个简单的工厂模式和装饰模式 ,我们可以在getObject()方法中灵活配置.
区别:FactoryBean是个Bean.在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)来进行管理的。但对FactoryBean而言,这个Bean不是简单的Bean,而是一个能生产或者修饰对象生成的工厂Bean,它的实现与设计模式中的工厂模式和修饰器模式类似 .
3.BeanFactory – BeanFactory 实现举例
Bean 工厂是工厂模式的一个实现,提供了控制反转功能,用来把应用的配置和依赖从正真的应用代码中分离。最常用的 BeanFactory 实现是 XmlBeanFactory 类。
4.什么是 Spring inner beans?
在Spring框架中,无论何时 bean 被使用时,当仅被调用了一个属性。一个明智的做法是将这个bean 声明为内部 bean。内部 bean 可以用 setter 注入“属性”和构造方法注入“构造参数”的方式来实现。
比如,在我们的应用程序中,一个 Customer 类引用了一个 Person 类,我们的要做的是创建一个
Person 的实例,然后在 Customer 内部使用
public class Customer{ private Person person; //Setters and Getters
public class Person{ private String name;
private String address;
private int age; //Setters and Getters}
内部 bean 的声明方式如下:
<bean id="CustomerBean" class="com.somnus.common.Customer">
<property name="person">
<!-- This is inner bean -->
<bean class="com.howtodoinjava.common.Person">
<property name="name" value="lokesh" />
<property name="address" value="India" />
<property name="age" value="34" />
</bean>
</property>
</bean>
5.ApplicationContext 通常的实现是什么?
FileSystemXmlApplicationContext :此容器从一个 XML 文件中加载 beans的定义,XML Bean 配置文件的全路径名必须提供给它的构造函数。
ClassPathXmlApplicationContext:此容器也从一个 XML 文件中加载 beans的定义,这里,你需要正确设置 classpath 因为这个容器将在 classpath 里找bean 配置。
WebXmlApplicationContext:此容器加载一个 XML 文件,此文件定义了一个WEB 应用的所有 bean。
6. 什么是 Spring 的依赖注入?
依赖注入,是 IOC 的一个方面,是个通常的概念,它有多种解释。这概念是说你不用创建对象,而只需要描述它如何被创建。你不在代码里直接组装你的组件和服务,但是要在配置文件里描述哪些组件需要哪些服务,之后一个容器(IOC 容器)负责把他们组装起来。
7.有哪些不同类型的 IOC(依赖注入)方式?
构造器依赖注入:构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。
Setter 方法注入:Setter 方法注入是容器通过调用无参构造器或无参 static 工厂方法实例化 bean 之后,调用该 bean 的 setter 方法,即实现了基于 setter 的依赖注入。
8. 哪种依赖注入方式你建议使用,构造器注入,还是 Setter 方法注入?
你两种依赖方式都可以使用,构造器注入和 Setter 方法注入。最好的解决方案是用构造器参数实现强制依赖,setter 方法实现可选依赖。
9. 什么是 Spring beans?
Spring beans 是那些形成 Spring 应用的主干的 java 对象。它们被 Spring IOC 容器初始化,装配,和管理。这些 beans 通过容器中配置的元数据创建。比如,以 XML文件中 的形式定义。Spring 框架定义的 beans 都是单件 beans。在 bean tag 中有个属性”singleton”,如果它被赋为 TRUE,bean 就是单件,否则就是一个 prototype bean。默认是TRUE,所以所有在 Spring 框架中的 beans 缺省都是单件。点击这里一图 SpringBean 的生命周期。
10. 一个 Spring Bean 定义包含什么?
一个 Spring Bean 的定义包含容器必知的所有配置元数据,包括如何创建一个bean,它的生命周期详情及它的依赖。
11.解释 Spring 框架中 bean 的生命周期
Spring 容器 从 XML 文件中读取 bean 的定义,并实例化 bean。Spring 根据 bean 的定义填充所有的属性。
如 果 bean 实 现 了 BeanNameAware 接 口 , Spring 传 递 bean 的 ID 到
setBeanName 方法。
如 果 Bean 实 现 了 BeanFactoryAware 接 口 , Spring 传 递 beanfactory 给setBeanFactory 方法。
如 果 有 任 何 与 bean 相 关 联 的 BeanPostProcessors , Spring 会 在
postProcesserBeforeInitialization()方法内调用它们。
如果 bean 实现 IntializingBean 了,调用它的 afterPropertySet 方法,如果 bean声明了初始化方法,调用此初始化方法。
如 果 有 BeanPostProcessors 和 bean 关 联 , 这 些 bean 的
postProcessAfterInitialization() 方法将被调用。
如果 bean 实现了 DisposableBean,它将调用 destroy()方法。
点击这里一图 Spring Bean 的生命周期。
如有错漏之处,敬请指正