1.Spring面试题
文档中的知识点:
1.bean标签范围配置:singleton,prototype,request,session,global-session
2.bean实例化的三种方式:
(1)(1)使用无参构造方法实例化 (2)工厂静态方法实例化 (3)工厂实例方法实例化
3.bean的依赖注入方式:
(1)构造方法 (2)setter方法 / setter方法:P命名空间注入
4.bean的依赖注入的数据类型:普通数据类型,引用数据类型,集合数据类型
5.applicationContext的实现类:ClassPathXmlApplicationContext,FileSystemXmlApplicationContext,AnnotationConfigApplicationContext
Spring注解开发:
1.Spring原始注解:Spring原始注解主要是替代的配置
@Component:使用在类上用于实例化bean
@Controller:web层类上 @Service:service层类上 @Repository:dao层类上
@Autowired:使用在字段上根据类型依赖注入 @Qualifier:结合@Autowired一起使用,用于根据名称进行依赖注入 @Resource:相当于@Autowired+@Qualifier,按照名 称进行注入
@Value:注入普通属性(用于注入基本数据类型和String数据类型的属性)
@Scope:标注bean的作用范围
@PostConstruct:使用在方法上,标注该方法是bean的初始化方法 @PreDestroy:使用在方法上,标注该方法是bean的销毁方法
Spring AOP:
1.Spring AOP的底层实现:AOP的底层是通过Spring提供的动态代理技术实现的
2.Spring采用动态代理织入,而AspectJ采用编译器织入和类装载期织入
3.AOP底层实现:基于jdk的动态代理 和 基于Cglib的动态代理
4.基于xml的AOP开发和基于注解的AOP开发
1.Spring 的优点?
(1)spring的DI机制将对象之间的依赖关系交由框架处理,降低了组件之间的耦合性;
(2)Spring提供了AOP技术,支持将一些通用任务,如事务、安全、日志、权限等进行集中式管理,从而提供更好的复用。
(3)spring对于主流的应用框架提供了集成支持。
2、Spring的IoC理解:
(1)什么是IOC:
IOC,控制反转,就是将对象的控制权交给Spring框架,由 Spring 来负责控制对象的生命周期(比如创建、销毁)和对象间的依赖关系。
(2)什么是DI:依赖注入和控制反转是一个意思,依赖注入是IOC的具体实现
IOC的一个重点就是在程序运行时,动态的向某个对象提供它所需要的其他对象,这一点是通过DI(Dependency Injection,依赖注入)来实现的。即应用程序在运行时依赖 IoC 容器来动态注入对象所需要的外部依赖。而 Spring 的 DI 具体就是通过 反射 实现注入的,反射允许程序在运行的时候动态的生成对象、改变对象的属性、执行对象的方法
(3)IoC的原理:
Spring 的 IoC 的实现原理就是工厂模式加反射机制
3、Spring通知(Advice)有哪些类型?
Advice的类型:(5种类型)
(1)前置通知(Before Advice):在连接点(Join point)之前执行的通知。
(2)后置通知(After Advice):当连接点退出的时候执行的通知(不论是正常返回还是异常退出)。
(3)环绕通知(Around Advice):包围一个连接点的通知,这是最强大的一种通知类型。 环绕通知可以在方法调用前后完成自定义的行为。它也可以选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。
(4)返回后通知(AfterReturning Advice):在连接点正常完成后执行的通知(如果连接点抛出异常,则不执行)
(5)抛出异常后通知(AfterThrowing advice):在方法抛出异常退出时执行的通知
4、 Spring中bean的作用域:
(1)singleton:默认作用域,单例bean,每个容器中只有一个bean的实例。
(2)prototype:多例,为每一个bean请求创建一个实例。
(3)request:为每一个request请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。
(4)session:与request范围类似,同一个session会话共享一个实例,不同会话使用不同的实例。
(5)global-session:全局作用域,所有会话共享一个实例。如果想要声明让所有会话共享的存储变量的话,那么这个全局变量需要存储在global-session中。
5、Spring基于xml注入bean的几种方式:(把bean注入Spring容器)
常见的、目前确定的是构造方法注入,setter方法注入
- 构造器注入:①通过index设置参数的位置;②通过type设置参数类型;
- setter()方法注入;
- 静态工厂方法注入;
- 实例工厂方法注入;
6、Spring 框架中都用到了哪些设计模式?
Spring设计模式的详细使用案例可以阅读这篇文章:Spring中所使用的设计模式_张维鹏的博客-CSDN博客_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)桥接模式:可以根据客户的需求能够动态切换不同的数据源。比如我们的项目需要连接多个数据库,客户在每次访问中根据需要会去访问不同的数据库
7.Spring框架的核心:IoC容器和AOP模块。通过IoC容器管理POJO对象以及他们之间的耦合关系;通过AOP以动态非侵入的方式增强服务。
IoC让相互协作的组件保持松散的耦合,而AOP允许你把遍布于应用各层的功能分离出来形成可重用的功能组件。
8.Spring有哪些应用场景?
场景一: 记录日志
场景二: 监控方法运行时间 (监控性能)
场景三: 权限控制
场景四: 缓存优化 (第一次调用查询数据库,将查询结果放入内存对象, 第二次调用, 直接从内存对象返回,不需要查询数据库 )
场景五: 事务管理 (调用方法前开启事务, 调用方法后提交关闭事务 )
说明:
jdk动态代理是接口的重写(适用于实现接口的类,spring aop的默认实现)
cglib动态代理是类的继承
提示:aop本质是动态对方法增强,避免代码入侵,优雅的实现横向扩展,是对oop的补充
9.Spring由哪些模块组成?
每个模块的功能:
Core,Context,AOP,DAO,Web,MVC,ORM
- 核心容器(Spring Core):提供了Spring 框架的核心功能。BeanFactory 是 Spring 核心容器的主要组件。它提供控制反转将应用程序的配置和依赖性规范与实际的应用程序代码分开,这是整个Spring的基础。
- Spring Context:提供配置文件,向 Spring 框架提供上下文信息。它构建再BeanFactory 之上,另外增加了国际化,资源访问等功能。
- Spring AOP:Spring 提供了面向切面编程的功能,因为Spring 的核心是基于控制反转的,Spring的依赖注入为AOP提供支持。
- Spring DAO:提供了一个简单有效的JDBC应用。
- Spring ORM:对其他一些ORM框架提供支持,如:JDO,Hibernate和iBatis等。
- Spring Web: 提供了简化的处理多部分请求以及将请求参数绑定到域对象的任务。
- Spring MVC:提供了MVC模式。
10.详细讲解一下核心容器(spring context应用上下文) 模块
这是基本的Spring模块,提供spring 框架的基础功能,BeanFactory 是 任何以spring为基础的应用的核心。Spring 框架建立在此模块之上,它使Spring成为一个容器。
Bean 工厂是工厂模式的一个实现,提供了控制反转功能,用来把应用的配置和依赖从真正的应用代码中分离。最常用的就是org.springframework.beans.factory.xml.XmlBeanFactory ,它根据XML文件中的定义加载beans。该容器从XML 文件读取配置元数据并用它去创建一个完全配置的系统或应用。
11.Spring框架中有哪些不同类型的事件
Spring 提供了以下5种标准的事件:
(1)上下文更新事件(ContextRefreshedEvent):在调用ConfigurableApplicationContext 接口中的refresh()方法时被触发。
(2)上下文开始事件(ContextStartedEvent):当容器调用ConfigurableApplicationContext的Start()方法开始/重新开始容器时触发该事件。
(3)上下文停止事件(ContextStoppedEvent):当容器调用ConfigurableApplicationContext的Stop()方法停止容器时触发该事件。
(4)上下文关闭事件(ContextClosedEvent):当ApplicationContext被关闭时触发该事件。容器被关闭时,其管理的所有单例Bean都被销毁。
(5)请求处理事件(RequestHandledEvent):在Web应用中,当一个http请求(request)结束触发该事件。
如果一个bean实现了ApplicationListener接口,当一个ApplicationEvent 被发布以后,bean会自动被通知。
12.使用 Spring 有哪些方式?
使用 Spring 有以下方式:
作为一个成熟的 Spring Web 应用程序。
作为第三方 Web 框架,使用 Spring Frameworks 中间层。
用于远程使用。
作为企业级 Java Bean,它可以包装现有的 POJO(Plain Old Java Objects)
13.什么是Spring IOC 容器?
Spring IoC负责创建对象、管理对象(通过依赖注入(DI)、装配对象、配置对象,并且管理这些对象的整个生命周期。
14.控制反转(IoC)有什么作用
将对象的控制权交给Spring,降低了对象之间的耦合度
15.Spring IoC 的实现原理
16.Spring 的 IoC支持哪些功能
Spring 的 IoC 设计支持以下功能:
依赖注入 依赖检查 自动装配 支持集合 指定初始化方法和销毁方法 支持回调某些方法(但是需要实现 Spring 接口,略有侵入) 其中,最重要的就是依赖注入,从 XML 的配置上说,即 ref 标签。对应 Spring RuntimeBeanReference 对象。
对于 IoC 来说,最重要的就是容器。容器管理着 Bean 的生命周期,控制着 Bean 的依赖注入。
17.ApplicationContext和BeanFactory都能获取到spring上下文对象(spring框架),他们二者有什么区别?
区别一:他们属于不同的包
区别二:BeanFactory 和ApplicationContext都是属于Spring 下的顶级接口,其中 BeanFactory 提供了基础的访问容器的能⼒,ApplicationContext 属于BeanFactory 的子类,BeanFactory 所有的功能ApplicationContext 也是拥有,除此之外ApplicationContext还有用其他BeanFactory没有的功能,例如:对国际化的支持,支持资源的访问,支持事件的传播等。
区别三:对于执行性能来说,ApplicationContext是一次性加载并初始化所有的 bean的,所以它的启动过程可能比较慢,但是后续的执行比较快;而BeanFactory 是需要哪个类才去加载那个类,因此BeanFactory占用的系统资源更少,启动更快,但后续的执行可能会慢一些。
18.applicationContext通常的实现是什么?
ClassPathXmlApplicationContext: 此容器也从一个XML文件中加载beans的定义,这里,你需要正确设置classpath因为这个容器将在classpath里找bean配置。
FileSystemXmlApplicationContext : 此容器从一个XML文件中加载beans的定义,XML Bean 配置文件的全路径名必须提供给它的构造函数。
AnnotationConfigApplicationContext
19.什么是Spring的依赖注入?
依赖注入:是指程序运行过程中,如果需要创建一个对象,无须代在码中new创建,而是依赖外部的注入
20.依赖注入的基本原则是什么?
21.依赖注入有什么优势
22.有哪些不同类型的依赖注入实现方式?
依赖注入有三种方式:
1:接口注入:指的就是在接口中定义要注入的信息,并通过接口完成注入。
2:set注入:指的就是在接受注入的类中定义一个set方法,并在参数中定义需要注入的元素。
3:构造注入:指的就是接受注入的类中定义一个构造方法,并在参数中定义需要注入的元素。
一般用的最多的是setter()方法注入的方式
23.构造器依赖注入和 Setter方法注入的区别
24.什么是Spring beans?
Spring beans 是那些形成Spring应用的主干的java对象。它们被Spring IOC容器初始化,装配,和管理。这些beans通过容器中配置的元数据创建。比如,以XML文件中<bean/>的形式定义。
Spring框架定义的beans都是单件beans。在beantag中有个属性”singleton”,如果它被赋为TRUE,bean就是单件,否则就是一个prototype bean。默认是TRUE,所以所有在Spring框架中的beans缺省都是单件。
25.一个Spring Bean 定义包含什么?
一个Spring Bean的定义包含容器必知的所有配置元数据,包括如何创建一个bean,它的生命周期详情及它的依赖。
。。。。。。。。
26.如何给Spring 容器提供配置元数据?Spring有几种配置方式
27.Spring配置文件包含了哪些信息
28.Spring基于xml注入bean的几种方式
29.你怎样定义类的作用域?
30.解释Spring支持的几种bean的作用域
31. Spring框架中的单例bean是线程安全的吗?
32. Spring如何处理线程并发问题?
33. 解释Spring框架中bean的生命周期
34. 哪些是重要的bean生命周期方法? 你能重载它们吗?
35. 什么是Spring的内部bean?什么是Spring inner beans?
36. 在 Spring中如何注入一个java集合?
37. 什么是bean装配?
38. 什么是bean的自动装配?
39. 解释不同方式的自动装配,spring 自动装配 bean 有哪些方式?
40. 使用@Autowired注解自动装配的过程是怎样的?
41. 自动装配有哪些局限性?
42. 你可以在Spring中注入一个null 和一个空字符串吗?
Spring注解
1. 什么是基于Java的Spring注解配置? 给一些注解的例子
2. 怎样开启注解装配?
3. @Component, @Controller, @Repository, @Service 有何区别?
4. @Required 注解有什么作用
5. @Autowired 注解有什么作用
6. @Autowired和@Resource之间的区别
7. @Qualifier 注解有什么作用
8. @RequestMapping 注解有什么用?
Spring数据访问
1. 解释对象/关系映射集成模块
要理解这个首先我们要明白一点:
编程语言--》面向对象,基本元素是对象
数据库---》基本元素是一条条数据
所以如果说想要将一个对象insert到数据库要把对象的值提取出来在一条条insert到数据库中,非常不方便。
对象/关系 映射就可以将对象的数据关系和数据库进行匹配,可以理解为程序中的一个对象对应数据库中的一张表,这样操作数据库也是面向对象的,像操作对象一样。添加数据时在service层直接向数据库添加对象,在操作数据库时根据对象和数据库表之间的对应关系进行增删改查操作。
2. 在Spring框架中如何更有效地使用JDBC?
使用 SpringJDBC 框架,资源管理和错误处理的代价都会被减轻。所以开发者只需写 statements 和 queries 从数据存取数据,JDBC 也可以在 Spring 框架提供的模板类的帮助下更有效地被使用,这个模板叫 JdbcTemplate
3. 解释JDBC抽象和DAO模块
通过使用 JDBC 抽象和 DAO 模块,保证数据库代码的简洁,并能避免数据库资源 错误关闭导致的问题,它在各种不同的数据库的错误信息之上,提供了一个统一 的异常访问层。它还利用 Spring 的 AOP 模块给 Spring 应用中的对象提供事务 管理服务。
4. spring DAO 有什么用?
Spring DAO(数据访问对象) 使得 JDBC,Hibernate 或 JDO 这样的数据访问技术更容易以一种统一的方式工作。这使得用户容易在持久性技术之间切换。它还允许您在编写代码时,无需考虑捕获每种技术不同的异常。
5. spring JDBC API 中存在哪些类?
JdbcTemplate
SimpleJdbcTemplate
NamedParameterJdbcTemplate
SimpleJdbcInsert
SimpleJdbcCall
6. JdbcTemplate是什么
Spring 框架对 JDBC 进行封装,使用 JdbcTemplate 方便实现对数据库操作
7. 使用Spring通过什么方式访问Hibernate?使用 Spring 访问 Hibernate 的方法有哪些?
我们可以通过两种方式使用 Spring 访问 Hibernate:
1、 使用 Hibernate 模板和回调进行控制反转
2、 扩展 HibernateDAOSupport 并应用 AOP 拦截器节点
8. 如何通过HibernateDaoSupport将Spring和Hibernate结合起来?
9. Spring支持的事务管理类型, spring 事务实现方式有哪些?
10. Spring事务的实现方式和实现原理
11. 说一下Spring的事务传播行为
12. 说一下 spring 的事务隔离?
13. Spring框架的事务管理有哪些优点?
14. 你更倾向用那种事务管理类型?
Spring面向切面编程(AOP)
1. 什么是AOP
面向切面编程,将业务模块的共有逻辑横向抽取出来,方便复用
2. Spring AOP and AspectJ AOP 有什么区别?AOP 有哪些实现方式?
3. JDK动态代理和CGLIB动态代理的区别
4. 如何理解 Spring 中的代理?
5. 解释一下Spring AOP里面的几个名词
6. Spring在运行时通知对象
7. Spring只支持方法级别的连接点
8. 在Spring AOP 中,关注点和横切关注的区别是什么?在 spring aop 中 concern 和 cross-cutting concern 的不同之处
9. Spring通知有哪些类型?
10. 什么是切面 Aspect?
11. 解释基于XML Schema方式的切面实现
12. 解释基于注解的切面实现
13. 有几种不同类型的自动代理?