目录
Spring
1.Spring是什么?
2.Spring的IoC理解:
3.Spring的AOP理解:
4.Spring通知(Advice)有哪些类型?
5.BeanFactory和ApplicationContext有什么区别?
6.Spring Bean的生命周期?
7.Spring中bean的作用域
8.Spring框架中的Bean是线程安全的么?如果线程不安全,那么如何处理?
9.Spring基于xml注入bean的几种方式:
10.Spring如何解决循环依赖问题:
11.Spring的自动装配
12.Spring事务的实现方式和实现原理:
13.Spring 框架中都用到了哪些设计模式?
14.Spring框架中有哪些不同类型的事件?
15.ioc的缺点
16.Spring由哪些模块组成?
17.详细讲解一下核心容器(spring context应用上下文) 模块
18.ApplicationContext通常的实现是什么?
19.什么是Spring的依赖注入?
20.依赖注入的基本原则
21.有哪些不同类型的依赖注入实现方式?
22.什么是Spring beans?
23.一个 Spring Bean 定义 包含什么?
24.如何给Spring 容器提供配置元数据?Spring有几种配置方式
25.Spring配置文件包含了哪些信息
26.Spring基于xml注入bean的几种方式
27.你怎样定义类的作用域?
28.Spring框架中的单例bean是线程安全的吗?
29.自动装配有哪些局限性?
30.什么是基于Java的Spring注解配置? 给一些注解的例子
怎样开启注解装配?
31.@Component, @Controller, @Repository, @Service 有何区别?
32.@Required 注解有什么作用
33.@Autowired 注解有什么作用
34.@Autowired和@Resource之间的区别
35.@Qualifier 注解有什么作用
36.@RequestMapping 注解有什么用?
37.AOP 有哪些实现方式?Spring AOP and AspectJ AOP 有什么区别?
38.JDK动态代理和CGLIB动态代理的区别
39.如何理解 Spring 中的代理?
40.解释一下Spring AOP里面的几个名词
41. @Component 和 @Bean 的区别是什么?
42.将一个类声明为Spring的 bean 的注解有哪些?
Spring
1.Spring是什么?
Spring是一个轻量级的IoC和AOP容器框架。目的是用于简化企业应用程序的开发
2.Spring的IoC理解:
IOC就是控制反转,指创建对象的控制权转移给Spring框架进行管理,并由Spring根据配置文件去创建实例和管理各个实例之间的依赖关系,对象与对象之间松散耦合,也利于功能的复用。
最直观的表达就是,以前创建对象的主动权和时机都是由自己把控的,IOC让对象的创建不用去new了,可以由spring自动生产,使用java的反射机制,根据配置文件在运行时动态的去创建对象以及管理对象,并调用对象的方法的。
Spring的IOC有三种注入方式 :构造器注入、setter方法注入、根据注解注入。
3.Spring的AOP理解:
AOP,一般称为面向切面,用于将那些与业务无关,但却对多个对象产生影响的公共行为,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,提高系统的可维护性。可用于权限认证、日志、事务处理。
AOP实现的关键在于 代理模式,AOP代理主要分为静态代理和动态代理。静态代理的代表为AspectJ;动态代理则以Spring AOP为代表。
AspectJ是静态代理,AOP框架会在编译阶段生成AOP代理类,并将AspectJ(切面)织入到Java字节码中,运行的时候就是增强之后的AOP对象。
Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改字节码,而是每次运行时在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。
4.Spring通知(Advice)有哪些类型?
(1)前置通知:连接点之前执行的通知。
(2)后置通知:当连接点退出的时候执行的通知
(3)环绕通知:包围一个连接点的通知,
(4)返回后通知:在连接点正常完成后执行的通知(如果连接点抛出异常,则不执行)
(5)抛出异常后通知:在方法抛出异常退出时执行的通知
5.BeanFactory和ApplicationContext有什么区别?
BeanFactory和ApplicationContext是Spring的两大核心接口,都可以当做Spring的容器。
其中ApplicationContext是BeanFactory的子接口。
BeanFactory是Spring里面最底层的接口,是IoC的核心,定义了IoC的基本功能,包含了各种Bean的定义、加载、实例化,生命周期管理。ApplicationContext接口作为BeanFactory的子类,除了提供BeanFactory所具有的功能外,还提供了更完整的框架功能
BeanFactroy采用的是延迟加载形式来注入Bean的,只有在使用到某个Bean时,才对该Bean进行加载实例化。
ApplicationContext,它是在容器启动时,一次性创建了所有的Bean。
6.Spring Bean的生命周期?
实例化--> 属性赋值--> 初始化 --> 销毁
7.Spring中bean的作用域
(1)singleton:默认作用域,单例bean,每个容器中只有一个bean的实例。
(2)prototype:为每一个bean请求创建一个实例。
(3)request:为每一个request请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。
(4)session:同一个session会话共享一个实例,不同会话使用不同的实例。
(5)global-session:全局作用域,所有会话共享一个实例。
8.Spring框架中的Bean是线程安全的么?如果线程不安全,那么如何处理?
Spring容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器中的Bean本身不具备线程安全的特性,但是具体情况还是要结合Bean的作用域来讨论。
1)对于prototype作用域的Bean,每次都创建一个新对象,因此不会有线程安全问题。
(2)对于singleton作用域的Bean,所有的线程都共享一个单例实例的Bean,因此是存在线程安全问题的。但是如果单例Bean是一个无状态Bean,也就是线程中的操作不会对Bean的成员执行查询以外的操作,那么这个单例Bean是线程安全的。比如Controller类、Service类和Dao等,这些Bean大多是无状态的,只关注于方法本身。
9.Spring基于xml注入bean的几种方式:
- set()方法注入;
- 构造器注入:①通过index设置参数的位置;②通过type设置参数类型;
- 静态工厂注入;
- 实例工厂;
10.Spring如何解决循环依赖问题:
循环依赖问题在Spring中主要有三种情况:
- (1)通过构造方法进行依赖注入时产生的循环依赖问题。
- (2)通过setter方法进行依赖注入且是在原型模式下产生的循环依赖问题。
- (3)通过setter方法进行依赖注入且是在单例模式下产生的循环依赖问题。
只有第(3)种方式的循环依赖问题被解决了,其他两种方式在遇到循环依赖问题时都会产生异常。这是因为:
- 第一种构造方法注入的情况下,在new对象的时候就会堵塞住了,其实也就是”先有鸡还是先有蛋“的历史难题。
- 第二种setter方法(多例)的情况下,每一次getBean()时,都会产生一个新的Bean,如此反复下去就会有无穷无尽的Bean产生了,最终就会导致OOM问题的出现。
Spring在单例模式下的setter方法依赖注入引起的循环依赖问题,主要是通过三级缓存来解决的解决的核心原理就是:在对象实例化之后,依赖注入之前,Spring提前暴露的Bean实例的引用在第三级缓存中进行存储。
11.Spring的自动装配
在spring中,使用autowire来配置自动装载模式
(1)在Spring框架xml配置中共有5种自动装配:
no:默认的方式是不进行自动装配的,通过手工设置ref属性来进行装配bean。
byName:通过bean的名称进行自动装配,如果一个bean的 property 与另一bean 的name 相同,就进行自动装配。
byType:通过参数的数据类型进行自动装配。
constructor:利用构造函数进行装配,并且构造函数的参数通过byType进行装配。
autodetect:自动探测,如果有构造方法,通过 construct的方式自动装配,否则使用 byType的方式自动装配。
(2)基于注解的自动装配方式:
使用@Autowired、@Resource注解来自动装配指定的bean。
12.Spring事务的实现方式和实现原理:
Spring事务的本质其实就是数据库对事务的支持
Spring只提供统一事务管理接口,具体实现都是由各数据库自己实现
(1)Spring事务的种类:
spring支持编程式事务管理和声明式事务管理两种方式:
- 编程式事务,在代码中硬编码。(不推荐使用)
- 声明式事务,在配置文件中配置(推荐使用)
声明式事务又分为两种:
- 基于XML的声明式事务
- 基于注解的声明式事务
(2)spring的事务传播机制:
spring事务的传播机制说的是,当多个事务同时存在的时候,spring如何处理这些事务的行为。事务传播机制实际上是使用简单的ThreadLocal实现的
13.Spring 框架中都用到了哪些设计模式?
(1)工厂模式:Spring使用工厂模式,通过BeanFactory和ApplicationContext来创建对象
(2)单例模式:Bean默认为单例模式
(3)策略模式:例如Resource的实现类,针对不同的资源文件,实现了不同方式的资源获取策略
(4)代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术
(5)模板方法:可以将相同部分的代码放在父类中,而将不同的代码放入不同的子类中,用来解决代码重复的问题。比如RestTemplate, JmsTemplate, JpaTemplate
(6)适配器模式:Spring AOP的增强或通知(Advice)使用到了适配器模式,Spring MVC中也是用到了适配器模式适配Controller
(7)观察者模式:Spring事件驱动模型就是观察者模式的一个经典应用。
(8)桥接模式:可以根据客户的需求能够动态切换不同的数据源。比如我们的项目需要连接多个数据库,客户在每次访问中根据需要会去访问不同的数据库
14.Spring框架中有哪些不同类型的事件?
(1)上下文更新事件:在调用ConfigurableApplicationContext 接口中的refresh()方法时被触发。
(2)上下文开始事件:调用ConfigurableApplicationContext的Start()方法时触发该事件。
(3)上下文停止事件:当容器调用ConfigurableApplicationContext的Stop()方法停止容器时触发该事件。
(4)上下文关闭事件:当ApplicationContext被关闭时触发该事件。
(5)请求处理事件:在Web应用中,当一个http请求(request)结束触发该事件。
15.ioc的缺点
软件系统中由于引入了第三方IOC容器,生成对象的步骤变得有些复杂,本来是两者之间的事情,又凭空多出一道手续
由于IOC容器生成对象是通过反射方式,在运行效率上有一定的损耗。
具体到IOC框架产品(比如:Spring)来讲,需要进行大量的配制工作
16.Spring由哪些模块组成?
核心容器 、 AOP、设备支持 、数据访问与集成 、 Web、 消息 、 Test
17.详细讲解一下核心容器(spring context应用上下文) 模块
这是基本的Spring模块,提供spring 框架的基础功能,BeanFactory 是 任何以spring为基础的应用的核心。
Bean 工厂是工厂模式的一个实现,提供了控制反转功能,用来把配置和依赖从真正的应用代码中分离。它根据XML文件中的定义加载beans。该容器从XML 文件读取配置元数据并用它去创建一个应用。
18.ApplicationContext通常的实现是什么?
FileSystemXmlApplicationContext :此容器从一个XML文件中加载beans的定义,XML Bean 配置文件的全路径名必须提供给它的构造函数。
ClassPathXmlApplicationContext:此容器也从一个XML文件中加载beans的定义,这里,你需要正确设置classpath因为这个容器将在classpath里找bean配置。
WebXmlApplicationContext:此容器加载一个XML文件,此文件定义了一个WEB应用的所有bean。
19.什么是Spring的依赖注入?
依赖注入:相对于IoC而言,依赖注入(DI)更加准确地描述了IoC的设计理念。
即组件之间的依赖关系由容器在应用系统运行期来决定,也就是由容器动态地将某种依赖关系的目标对象实例注入到应用系统。
20.依赖注入的基本原则
应用组件不应该负责查找资源或者其他依赖的协作对象。
配置对象的工作应该由IoC容器负责
21.有哪些不同类型的依赖注入实现方式?
接口注入,Setter方法注入和构造器注入三种方式
接口注入由于在灵活性和易用性比较差,现在从Spring4开始已被废弃。
Setter方法注入:容器通过调用无参构造器实例化bean之后,调用该bean的setter方法,即实现了基于setter的依赖注入。
构造器依赖注入:通过容器触发一个类的构造器来实现的
22.什么是Spring beans?
Spring beans 是那些形成Spring应用的主干的java对象。
它们被Spring IOC容器初始化,装配,和管理。这些beans通过容器中配置的元数据创建。比如,以XML文件中 的形式定义。
23.一个 Spring Bean 定义 包含什么?
包含容器必知的所有配置元数据,包括如何创建一个bean,它的生命周期详情及它的依赖。
24.如何给Spring 容器提供配置元数据?Spring有几种配置方式
这里有三种重要的方法给Spring 容器提供配置元数据。
- XML配置文件。
- 基于注解的配置。
- 基于java的配置。
25.Spring配置文件包含了哪些信息
Spring配置文件是个XML 文件,这个文件包含了类信息,描述了如何配置它们,以及如何相互调用。
26.Spring基于xml注入bean的几种方式
-
Set方法注入;
-
构造器注入:①通过index设置参数的位置;②通过type设置参数类型;
-
静态工厂注入;
-
实例工厂;
27.你怎样定义类的作用域?
Set方法注入;
构造器注入:①通过index设置参数的位置;②通过type设置参数类型;
静态工厂注入;
实例工厂;
它可以通过bean 定义中的scope属性来定义。
28.Spring框架中的单例bean是线程安全的吗?
不是,Spring框架中的单例bean不是线程安全的。
spring 中的 bean 默认是单例模式,spring 框架并没有对单例 bean 进行多线程的封装处理。
29.自动装配有哪些局限性?
自动装配的局限性是:
重写:你仍需用 和 配置来定义依赖,意味着总要重写自动装配。
基本数据类型:你不能自动装配简单的属性,如基本数据类型,String字符串,和类。
模糊特性:自动装配不如显式装配精确,如果有可能,建议使用显式装配。
30.什么是基于Java的Spring注解配置? 给一些注解的例子
@Configuration(配置) 注解:标记类可以当做一个bean的定义,被Spring IOC容器使用。
@Bean注解:它表示此方法将要返回一个对象,作为一个bean注册进Spring应用上下文。
怎样开启注解装配?
注解装配在默认情况下是不开启的,为了使用注解装配,我们必须在Spring配置文件中配置
31.@Component, @Controller, @Repository, @Service 有何区别?
@Component(组件):这将 java 类标记为 bean。用来管理组件
@Controller:这将一个类标记为 Spring Web MVC 控制器
@Service:此注解是组件注解的特化。可以在服务层类中使用 @Service 而不是 @Component,
@Repository(仓库):这个注解是具有类似用途和功能的 @Component 注解的特化。它将 DAO 导入 IoC 容器,并使未经检查的异常有资格转换为 Spring DataAccessException。
32.@Required 注解有什么作用
这个注解表明bean的属性必须在配置的时候设置
33.@Autowired 注解有什么作用
@Autowired 注解提供了更细粒度的控制,包括在何处以及如何完成自动装配。
34.@Autowired和@Resource之间的区别
@Autowired可用于:构造函数、成员变量、Setter方法
@Autowired和@Resource之间的区别
@Autowired默认是按照类型装配注入的,默认情况下它要求依赖对象必须存在
@Resource默认是按照名称来装配注入的
35.@Qualifier 注解有什么作用
当您创建多个相同类型的 bean 并希望仅使用属性装配其中一个 bean 时,您可以使用@Qualifier 注解和 @Autowired 通过指定应该装配哪个确切的 bean 来消除歧义。
36.@RequestMapping 注解有什么用?
@RequestMapping 注解用于将 请求方法映射到将处理相应请求的控制器。此注释可应用于两个级别:
- 类级别:映射请求的 URL
- 方法级别:映射 URL 以及 HTTP 请求方法
37.AOP 有哪些实现方式?Spring AOP and AspectJ AOP 有什么区别?
AOP实现的关键在于 代理模式,AOP代理主要分为静态代理和动态代理。静态代理的代表为AspectJ;动态代理则以Spring AOP为代表。
(1)AspectJ是静态代理的增强,所谓静态代理,会在编译阶段将AspectJ(切面)织入到Java字节码中,运行的时候就是增强之后的AOP对象。
(2)Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改字节码,而是每次运行时在内存中临时为方法生成一个AOP对象
38.JDK动态代理和CGLIB动态代理的区别
Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理:
JDK动态代理只提供接口的代理。核心InvocationHandler接口和Proxy类,InvocationHandler 通过invoke()方法反射来调用目标类中的代码,动态地将横切逻辑和业务编织在一起;接着,Proxy利用 InvocationHandler动态创建接口的的实例, 生成目标类的代理对象。
如果代理类没有实现 InvocationHandler 接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIB(Code Generation Library),可以在运行时动态的生成指定类的一个子类对象,并覆盖其中特定方法并添加增强代码,从而实现AOP。CGLIB是通过继承的方式做的动态代理
静态代理与动态代理区别在于生成AOP代理对象的时机不同,相对来说AspectJ的静态代理方式具有更好的性能,但是AspectJ需要特定的编译器进行处理,而Spring AOP则无需特定的编译器处理。
39.如何理解 Spring 中的代理?
将 Advice 应用于目标对象后创建的对象称为代理。
Advice + Target Object = Proxy
40.解释一下Spring AOP里面的几个名词
1)切面(Aspect):切面是通知和切点的结合。 在Spring AOP中,切面可以使用通用类或者在普通类中以 @AspectJ 注解来实现。
(2)连接点(Join point):在Spring AOP中,一个连接点代表一个方法的执行。
(3)通知(Advice):在AOP术语中,切面的工作被称为通知。
(4)切入点(Pointcut):切点的定义会匹配通知所要织入的一个或多个连接点。
(5)引入(Introduction):引入允许我们向现有类添加新方法或属性。
(6)目标对象(Target Object): 被一个或者多个切面所通知的对象。它通常是一个代理对象。
(7)织入(Weaving):织入是把切面应用到目标对象并创建新的代理对象的过程。
41. @Component 和 @Bean 的区别是什么?
1.作用对象不同: @Component 注解作用于类,而@Bean注解作用于方法。
2.@Component通常是通过类路径扫描以及自动装配到Spring容器中。@Bean 注解通常是我们在标有该注解的方法中定义产生这个 bean
3.@Bean 注解比 Component 注解的自定义性更强
42.将一个类声明为Spring的 bean 的注解有哪些?
我们一般使用 @Autowired 注解自动装配 bean,要想把类标识成可用于 @Autowired 注解自动装配的 bean 的类,采用以下注解可实现:
@Component :通用的注解,可标注任意类为 Spring 组件。如果一个Bean不知道属于哪个层,可以使用@Component 注解标注。
@Repository : 对应持久层即 Dao 层,主要用于数据库相关操作。
@Service : 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao层。
@Controller : 对应 Spring MVC 控制层,主要用户接受用户请求并调用 Service 层返回数据给前端页面。



