文章目录
一. 问题背景
复习完了spring后,对一些面试时问的spring常见问题总结一下。
此笔记仅供自己参考,如有错误请指正
二. Spring常见问题
2.1 Spring是什么
它是一个轻量式的IOC容器和AOP容器开源框架。其目的是为了简化企业级应用程序开发,使开发人员只需关注业务需求。常见的配置方式有3种:基于xml的配置;基于注解的配置;基于Java的配置
其主要的模块有以下几个:
- Spring Core:核心模块,提供IOC服务
- Spring Context:提供框架式的Bean访问方式,以及企业功能(JNDI,定时任务等)
- Spring AOP:AOP服务
- Spring DAO:对JDBC的抽象,简化了数据访问异常的处理
- Spring ORM:对现有ORM框架的支持(ORM:对象关系映射,即将Java对象映射到数据库中)
- Spring Web:提供了面向web的基本特性,如多方上传文件
- Spring MVC:提供面向Web应用的Model-View-Controller实现
2.2 Spring的优良特性
- 非侵入式:基于Spring开发的应用程序中的对象可以不依赖Spring的API,即Java对象不需要继承Spring或者实现Spring的接口,不需要改变原有代码的结构。
- 依赖注入:Dependency Injection,简称DI。它是IOC(Inversion Of Control,反转控制)最经典的实现
- 面向切面编程:Aspect Oriented Programming,简称AOP
- 容器:Spring是一个容器,因为它包含并管理应用对象的生命周期
- 组件化:Spring实现了使用简单组件配置组成一个复杂的应用。在Spring中可以使用java注解和xml组合这些对象
2.3 Spring的IOC理解
应用程序中的组件获取资源时,传统的方式是组件主动去容器中获取所需的资源,这种模式下,开发人员往往需要知道在具体的容器中特定资源的获取方式,大大增加了学习成本,同时降低了开发效率。
IOC,Inversion Of Control,反转控制。反转控制的思想颠覆了传统的方式:反转了资源的获取方向——改由容器主动将资源推荐给需要的组件,开发人员不需要知道容器是如何创建对象的,只需要提供接收资源的方式即可。降低了学习成本,提高了开发效率。这种行为也称为被动的查找形式。
2.4 Spring的DI理解
DI,Dependency Injection,依赖注入。依赖注入是指组件以一些预定义好的方式(比如setter方法、构造器)接收来自容器的资源注入。
IOC与DI的关系:IOC是一种思想,反转控制的思想;而DI是IOC的一种具体实现
2.5 Spring的AOP理解
AOP,Aspect Oriented Programming,面向切面编程。它是OOP(面向对象编程)的扩充。AOP主要的编程对象是切面,切面是由若干个横切关注点组成的。而横切关注点是从各个方法中抽取出来的同一类非核心业务。总之,切面模块化横切关注点。在应用AOP编程时,我们仍然需要定义公共功能,此外还可以明确定义这个功能应用到哪里,以什么方式应用,并且不必修改受影响的类。
2.6 IOC容器在Spring中的实现
-
在通过IOC容器读取Bean的实例之前,首先需要将IOC容器实例化。
-
Spring提供了2种IOC容器的实现方式:
(1)BeanFactory:IOC容器的基本实现,面向Spring内部,不提供给开发人员使用。BeanFactory可以理解成定义了各种Bean的工厂。它包含了各种Bean的定义,以便收到客户端请求后将对应的Bean实例化。BeanFactory还包含了Bean生命周期的控制,调用客户端的初始化方法(init-methods)和销毁方法(destruction-methods)
(2)ApplicationContext:它是BeanFactory的子接口,提供了更多高级特性,提供给开发人员使用。几乎所有场合都是使用ApplicationContext而不是底层的BeanFactory。
2.7 BeanFactory和ApplicationContext的区别
上面IOC容器在Spring中的实现涉及到了BeanFactory和ApplicationContext。两者的区别如下:
BeanFactory:
- 包含了各种Bean的定义,以便接收客户端请求后将对应的Bean实例化
- 包含Bean生命周期的控制,调用客户端的初始化方法(init-method)以及销毁方法(destruction-method)
ApplicationContext:
除了包含BeanFactory的功能,还提供了许多高级特性,比如:
- 提供支持国际化的文本消息
- 统一的资源文件读取方式
- 在监听器中注册Bean的事件
2.7.1ApplicationContext常见的实现方式
- ClassPathXmlApplicationContext:读取类路径下的对应配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("xxx.xml");
- FileSystemXmlApplicationContext:读取文件系统路径下的对应配置文件
ApplicationContext context = new FileSystemXmlApplicationContext("xxx.xml");
-
XmlWebApplicationContext:由web应用的XML文件读取上下文
-
AnnotationConfigApplicationContext:基于Java配置启动容器
2.7.2 容器结构
2.8 Spring配置到应用开发中有哪些方式
2.8.1 基于XML的配置
在spring框架中,我们常用xml文件来配置依赖和服务。这些配置文件是由一个<beans>
标签组成,在<beans>
标签里面包含着许多<bean>
标签以及其他配置选项。Spring的XML配置方式是使用被Spring命名空间所支持的一些列组件来实现的,如context,bean,tx,aop,jdbc,mvc。
2.8.2 基于注解的配置
只需要在方法上、类上或者字段声明上使用注解即可。注解注入会被容器在XML注入之前处理,所以后者会覆盖前者对同一属性的处理结果。
注解装配在Spring中默认是关闭的,需要在xml文件中配置如下才能打开:
<beans>
<context:annotation-config/>
</beans>
在<context:annotation-config/>
标签完成后,我们可以使用注解向属性、方法、构造方法中自动装配变量。
常用的注解类型有如下:
- @Required:该注解应用于设置方法(setter方法)
- @Autowired:该注解应用于设置方法、非设置方法、构造方法和变量。@Required有的,@Autowired都有。
- @Qualifier:该注解和@Autowired注解搭配使用,用于当匹配到多个相同类型的Bean时,通过@Qualifier指定Bean的id去配置哪个Bean
2.8.3 基于Java的配置
使用@Configuration和@Bean来实现
- @Configuration:被该注解标注的类是作为Bean定义的资源。即该类包含许多Bean的定义
- @Bean:被该注解标注的方法将会实例化、配置和初始化一个新的对象,这个对象讲由Spring的IOC容器管理。该注解起到的作用与
<bean>
的作用是一样的。
例子:
@Configuration
public class AppConfig{
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}
相当于以下在xml文件中配置:
<beans>
<bean id="myService" class="com.somnus.services.MyServiceImpl"/>
</beans>
上述配置方式的实例化方式如下:利用AnnotationConfigApplicationContext类进行实例化:
public static void main(String[] args) {
ApplicationContext ctx = new
AnnotationConfigApplicationContext(AppConfig.class);
MyService myService = ctx.getBean(MyService.class);
myService.doStuff();