Spring面试题

一 . 为什么要使用 spring?

Spring 是轻量的,开源开发框架。
spring 提供 ioc 技术,容器会帮你管理依赖的对象,从而不需要自己创建和管理依赖对象了,更轻松的实现了程序的解耦。
spring 提供了事务支持,使得事务操作变的更加方便。
spring 提供了面向切片编程,这样可以更方便的处理某一类的问题。
更方便的框架集成,spring 可以很方便的集成其他框架,比如 MyBatis、hibernate 等。

二 . 控制反转 Spring IoC?

1.IOC是什么?
传统的java开发模式中,当需要一个对象时, 我们会自己使用new或者getInstance等直接或者间接调用构造方法创建一个对象。 而在spring开发模式中, spring容器使用了I厂模式为我们创建了所需要的对象,不需要我们自己创建了,直接调用spring提供的对象就可以了,这是控制反转(IOC)的思想。
依赖注入(DI), spring 使用javaBean对象的set方法或者带参数的构造方法为我们在创建所需对象时将其属性自动设置所需要的值的过程,就是依赖注入的思想。

Spring IOC 负责创建对象,管理对象。通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期。

2.IOC的优点是什么?
IOC 或 依赖注入把应用的代码量降到最低。它使应用容易测试,单元测试不再需要单例和 JNDI 查找机制。最小的代价和最小的侵入性使松散耦合得以实现。IOC容器支持加载服务时的饿汉式初始化和懒加载。

3.spring 常用的注入方式有哪些?
setter 属性注入
构造方法注入
注解方式注入

三 . spring 有哪些主要模块?

spring core:框架的最基础部分,提供 ioc 和依赖注入特性。
spring context:构建于 core 封装包基础上的 context 封装包,提供了一种框架式的对象访问方法。
spring dao:Data Access Object 提供了JDBC的抽象层。
spring aop:提供了面向切面的编程实现,让你可以自定义拦截器、切点等。
spring Web:提供了针对 Web 开发的集成特性,例如文件上传,利用 servlet listeners 进行 ioc 容器初始化和针对 Web 的 ApplicationContext。
spring Web mvc:spring 中的 mvc 封装包提供了 Web 应用的 Model-View-Controller(MVC)的实现。

三 . Spring面向切面编程(AOP)

1. 解释一下什么是 aop?
aop 是面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
简单来说就是:将相同的业务逻辑(或者说是多个对象某些相同的方面)提取形成切面,将通知织入到方法连接点前后,底层使用的是动态代理
调用时间监控,日志记录,session开闭,事务管理,登录验证

2. Aspect 切面
AOP核心就是切面,它将多个类的通用行为封装成可重用的模块,该模块含有一组API提供横切功能。比如,一个日志模块可以被称作日志的AOP切面。根据需求的不同,一个应用程序可以有若干切面。在Spring AOP中,切面通过带有@Aspect注解的类实现。
Aspect由PointCut和Advice组成

4. 连接点 (PointCut)
连接点代表一个应用程序的某个位置,在这个位置我们可以插入一个AOP切面,它实际上是个应用程序执行Spring AOP的位置。
PointCut的作用,就是提供一组规则,来匹配JoinPoint,给满足规则的JoinPoint添加Advice。

5. 通知(Advice)
通知是个在方法执行前或执行后要做的动作,实际上是程序执行时要通过SpringAOP框架触发的代码段。
Spring切面可以应用五种类型的通知:
before:前置通知,在一个方法执行前被调用。
after: 在方法执行之后调用的通知,无论方法执行是否成功。
after-returning: 仅当方法成功完成后执行的通知。
after-throwing: 在方法抛出异常退出时执行的通知。
around: 环绕通知,在方法执行之前和之后调用的通知。

6. 切点(JoinPoint)
切入点是一个或一组连接点,通知将在这些位置执行。可以通过表达式或匹配的方式指明切入点。

7. 引入
引入允许我们在已存在的类中增加新的方法和属性。

8. 目标对象(Target )
被一个或者多个切面所通知的对象。它通常是一个代理对象。也指被通知(advised)对象。

9. 代理
代理是通知目标对象后创建的对象。从客户端的角度看,代理对象和目标对象是一样的。

10. 织入(Weaving)。什么是织入应用的不同点?
织入是将切面和到其他应用类型或对象连接或创建一个被通知对象的过程。
织入可以在编译时,加载时,或运行时完成。

11. 解释基于注解的切面实现
在这种情况下(基于@AspectJ的实现),涉及到的切面声明的风格与带有java5标注的普通java类一致。

12.AOP有哪些实现方式
实现AOP的技术,主要分为两类:
静态代理:指使用AOP框架停工的命令进行编译,从而在编译阶段就可以生成AOP代理类,因此也称为AOP代理类,因此也称为编译时增强

编译时编织(特殊编译器实现)
类加载时编织(特殊的类加载器实现)

动态代理在运行时在内存中临时生成AOP动态代理类,因此也被称为运行时增强,目前Spring中使用了两种代理库
(1)JDK动态代理
(2)CGLIB

13. SpringAOP中的动态代理主要两种方式

(1)JDK动态代理
JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口,JDK动态代理的核心是InvocationHandler接口和Proxy类
原理:是动态生成字节码与反射机制的结合。实现InvocationHandler,并实现其中的invoke方法,根据传入的实例生成对应类的代理类

(2)CGLIB动态代理
如果目标没有实现接口,那么SpringAOP会选择使用CGLIB来动态代理目标类,当然Spring也支持配置强制使用CGLIB动态代理
1.加入Cglib库
2.在配置文件中加入配置,强制使用cglib
<aop:aspect-autoproxy-target-class=“ture” />

CGLIB是一个代码生成的类库,可以再运行时动态的生成某个类的子类,注意,CGLIB是通过集成的方式做的动态代理,因此如果某个类被标记为final,那么它无法使用CGLIB做动态代理

四 . Spring事务

事务是逻辑处理原子性的保证手段,通过使用事务控制,可以极大的避免出现逻辑处理失败导致的脏数据等问题

1.spring 的事务隔离
spring 有五大隔离级别,默认值为 isolation_default(使用数据库的设置),其他四个隔离级别和数据库的隔离级别一致:
isolation_default : 这是默认的隔离级别,用底层数据库的设置隔离级别,数据库设置的是什么我就用什么;
未提交读(read uncommited) : 脏读,不可重复读,虚读都有可能发生;
已提交读 (read commited): 避免脏读。但是不可重复读和虚读有可能发生;
可重复读 (repeatable read) : 避免脏读和不可重复读.但是虚读有可能发生;
串行化的 (serializable) : 代价最高最可靠的隔离级别,该隔离级别能防止脏读、不可重复读、幻读;
Mysql 默认:可重复读
Oracle 默认:读已提交

脏读: 如果你正在读数据库内容,而我现在修改了数据库内容还没有提交,接着我修改后的内容没有提交的情况下被你读到了,就叫脏读.
具体点:数据库有某一个数据A值为25,有事务1要将A改成30,A的值变成30,但事务1并未提交。
与此同时,事务2对A进行读取,读到的是30。若事务1,修改失败,发生了回滚,那么此时数据库中A的值并未发生变化,仍然为25,但事务2读取到的值确实30。

不可重复读: 比如你正在读数据库内容,而我update数据库后提交了,你又读了一次数据库内容,这时出现两个内容不同的结果,这叫不可重复读.

幻读: 比如你正在读数据库内容,而我insert数据库后提交了,你又读了一次数据库内容,这时你看到内容出现了多一条数据,这叫幻读.

五 . Spring Bean

1. 什么是Spring beans?
Spring beans 是那些形成Spring应用的主干的java对象。它们被Spring IOC 容器初始化,装配,和管理。这些beans通过容器中配 置的元数据创建。比如,以XML文件中 的形式定义。
Spring 框架定义的beans都是单例 beans。

2. Spring支持的几种bean的作用域。
Spring框架支持以下五种bean的作用域:
singleton : 单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例。
prototype:原型模式, 每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例。
request:对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,即每次HTTP请求将会产生不同的Bean实例。只有在Web应用中使用Spring时,该作用域才有效
session:对于每次HTTP Session,使用session定义的Bean豆浆产生一个新实例。同样只有在Web应用中使用Spring时,该作用域才有效
global-session: 每个全局的HTTP Session,使用session定义的Bean都将产生一个新实例。典型情况下,仅在使用portlet context的时候有效。同样只有在Web应用中使用Spring时,该作用域才有效
  其中比较常用的是singleton和prototype两种作用域。对于singleton作用域的Bean,每次请求该Bean都将获得相同的实例。容器负责跟踪Bean实例的状态,负责维护Bean实例的生命周期行为;如果一个Bean被设置成prototype作用域,程序每次请求该id的Bean,Spring都会新建一个Bean实例,然后返回给程序。在这种情况下,Spring容器仅仅使用new 关键字创建Bean实例,一旦创建成功,容器不在跟踪实例,也不会维护Bean实例的状态。
  如果不指定Bean的作用域,Spring默认使用singleton作用域。Java在创建Java实例时,需要进行内存申请;销毁实例时,需要完成垃圾回收,这些工作都会导致系统开销的增加。因此,prototype作用域Bean的创建、销毁代价比较大。而singleton作用域的Bean实例一旦创建成功,可以重复使用。因此,除非必要,否则尽量避免将Bean被设置成prototype作用域。

3. 简单介绍一下Spring bean的生命周期
bean定义:在配置文件里面用来进行定义。
bean初始化:有两种方式初始化:
1.在配置文件中通过指定init-method属性来完成
2.实现 org.springframwork.beans.factory.InitializingBean接口
bean调用:有三种方式可以得到bean实例,并进行调用
bean销毁:销毁有两种方式
1).使用配置文件指定的destroy-method属性
2).实现 org.springframwork.bean.factory.DisposeableBean接口

六. Spring常见注解

1.将普通类加入容器形成Bean的注解

@Repository : 组件代表数据访问层(Dao)时,你可以给它加上@Repository注解
@Service : 组件用于业务层时,使用@Service注解
@Controller : 组件属于控制层时,则使用@Controller注解
@Component :组件不能进行很好地归类时,那我们可以使用@Component注解
@Bean : Bean注解主要用于方法上,有点类似于工厂方法,当使用了@Bean注解,我们可以连续使用多种定义bean时用到的注解.

2.从容器中取Bean(装配bean)时常用的注解
@Autowired : 可用于为类的属性、构造器、方法进行注值

3.spring MVC模块注解
@Controller : 将一个类加上@Controller注解后,表明该类会作为与前端作交互的控制层组件
@RequestMapping : 这个注解用于将url映射到整个处理类或者特定的处理请求的方法
@RequestParam : 用于绑定request请求参数到指定的方法
@PathVariable : 该注解用于方法修饰方法参数,会将修饰的方法参数变为可供使用的uri变量(可用于动态绑定)

4. Spring AOP模块注解
spring aop模块的注解主要有@Aspect、@Pointcut、@Before、@Around、@After、
@AfterReturning、@AfterThrowing

@Aspect : 标明该类为切面类,并启用AspectJ注解,注:在使用时要同@Component一起使用,否则不会被扫描到加入容器
@Pointcut :定义切入点
@Around :定义环绕通知,在目标方法执行前后嵌入相关业务逻辑
@Before :定义前置通知,在目标方法执行前执行
@After :定义后置通知,在目标方法执行后执行,不论是目标方法执行正常后退出,还是抛出异常后退出,均会被执行
@AfterReturning :目标方法执行正常退出后执行
@AfterThrowing :目标方法执行抛出异常后执行

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值