Spring面试题

1.Spring框架的设计目标、设计理念和核心是什么(对Spring的理解)

Spring设计目标: Spring为开发者提供一个一站式轻量级应用开发平台。

Spring设计理念: Spring通过IoC容器实现对象耦合关系的管理,并实现依赖反转,将对象之间的依赖关系交给IoC容器,不需要自己创建和管理依赖对象,从而实现解耦。AOP面向切面编程通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。还提供了事务支持,使得事务操作变的更加方便。spring也可以很方便的集成其他框架,比如 MyBatis、hibernate 等。

Spring框架的核心: spring框架的两大核心分别是IOC(控制反转)和AOP(面向切面编程)。IOC指的是将我们创建对象的权利交给spring进行管理。所谓的“控制反转”概念就是对对象组件控制权的转移,从程序代码本身转移到了外部容器。对象的创建,属性赋值,初始化,销毁等等都由spring完成,而我们只需要从容器中拿到对象、使用对象就行。
aop指的是面向切面编程。通过动态代理的方式实现对现有功能的拓展。比如我们在记录controller层接口的访问日志时,如果不使用aop的话,就需要在每一个接口处都添加代码,出现大量的冗余代码,十分麻烦。使用aop就可以由spring进行动态代理来实现日志的记录。aop的动态代理分为jdk动态代理和cglib动态代理。jdk动态代理支持实现了接口的类,而cglib动态代理支持没有实现接口的类,spring默认使用jdk动态代理。

2.Spring 框架中都用到了哪些设计模式

  • 工厂模式: BeanFactory就是简单工厂模式的体现,用来创建bean对象的实例。

  • 单例模式: Bean默认为单例模式。

  • 代理模式: Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术。

  • 模板方法: 用来解决代码重复的问题。比如:RestTemplate, JmsTemplate, JpaTemplate。

  • 观察者模式: 定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被动更新,如Spring中listener的实现–ApplicationListener。

  • 包装器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。

  • 适配器模式 : Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配Controller。

3.BeanFactory 和 ApplicationContext有什么区别

BeanFactory和ApplicationContext是Spring的两大核心接口,都可以当做Spring的容器。其中ApplicationContext是BeanFactory的子接口,拥有更多的功能与方法。

加载方式也不同。ApplicationContext是在启动容器创建上下文环境的时候就创建Bean对象(预先加载,迫切加载),这样在容器启动时,我们就可以发现Spring中存在的配置错误,这样有利于检查所依赖属性是否注入,还可以确保当你需要的时候,你就不用等待,因为它们已经创建好了。

而BeanFactory是在使用的时候才进行对象的创建(懒加载),只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化。这样,我们就不能发现一些存在的Spring的配置问题。如果Bean的某一个属性没有注入,BeanFacotry加载后,直至第一次使用调用getBean方法才会抛出异常。

4.解释Spring支持的几种bean的作用域

我们能给这个bean声明一个作用域,它可以通过bean的scope属性来定义。

  • singleton: 单例模式,在spring IoC容器仅存在一个Bean实例,是系统默认值。
  • prototype: 原型模式,每次从容器中获取Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行new Bean()。同时频繁创建和销毁 bean 会带来很大的性能开销。
  • request: 每次HTTP请求都会创建一个新的Bean,该作用域仅在基于web的Spring ApplicationContext环境下有效。
  • session: 同一个HTTP Session共享一个Bean,不同Session使用不同的Bean,该作用域仅在基于web的Spring ApplicationContext环境下有效。
  • global-session: 同一个全局的HTTP Session中共享一个Bean,一般用于Portlet应用环境,该作用域仅在基于web的Spring ApplicationContext环境下有效。

5.Spring框架中的单例bean是线程安全的吗

spring中的bean默认是单例模式,spring 框架并没有对单例 bean 进行多线程的封装处理,所以不是线程安全的。但实际上我们大部分时候 spring bean 是不会保存数据的(比如 dao 类),所以某种程度上来说 bean 也是安全的。

如果 bean 有数据存储功能的话(比如 view model 对象),那就要需要我们自己去保证线程安全了,最简单方法的就是去改变 bean 的作用域,把“singleton”变更为“prototype”,这样的话请求 bean 相当于 new Bean()了,就可以保证线程安全了。

6.Spring如何处理线程并发问题

在一般情况下,只有无状态(不会保存数据)的Bean才可以在多线程环境下共享,在Spring中,绝大部分Bean都可以声明为singleton作用域,Spring对一些Bean中非线程安全状态可以采用ThreadLocal进行处理,解决线程安全问题。

ThreadLocal和线程同步机制都是为了解决多线程中共享变量的访问冲突问题。ThreadLocal是采用了“空间换时间”的方式,为每一个线程提供一个独立的变量副本,所以每⼀个线程都可以独⽴地改变⾃⼰的副本,⽽不会影响其它线程所对应的副本,从而隔离了多个线程对数据的访问冲突,也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的变量封装进ThreadLocal。

7.使用@Autowired注解自动装配bean的过程是怎样的

使用@Autowired注解来自动装配指定的bean,来消除 set/get 方法。在使用@Autowired注解之前需要在Spring配置文件进行配置<context:annotation-config />标签,然后在启动spring IOC时,容器就会自动装载了一个AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowied或@Resource时,就会在IOC容器自动查找需要的bean,并装配给该对象的属性。在使用@Autowired时,首先在容器中查询对应类型的bean:

如果查询结果刚好为一个,就将该bean装配给@Autowired指定的属性;

如果查询的结果不止一个,会抛出异常,需要配合@Qualifier注解根据名称来查找;

如果配合@Qualifier注解根据名称来查找的结果为空,会抛出异常,可以将@Autowire注解的required属性设置为false。

8.@Autowired和@Resource之间的区别

@Autowired和@Resource都可用于:构造函数、Setter方法、成员变量 ,都可以用来装配bean。

@Autowired默认按类型装配(这个注解是属于spring的),@Resource 是JDK1.6支持的注解,默认按照名称进行装配。@Autowired默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用。

@Autowired
@Qualifier("baseDao")
private BaseDao baseDao;

@Resource名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名,按照名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。

@Resource(name="baseDao")
private BaseDao baseDao;

其实@Autowired + @Qualifier(“BWM”) == @Resource(name=“BWM”),如果当一个接口只有一个实现类,使用@Autowired和@Resource没有区别,但是最好用@Autowired。

9.Spring支持的事务管理类型, Spring事务实现方式有哪些?你更倾向用哪种事务管理类型?

  • 编程式事务管理: 通过编程的方式管理事务,灵活性好,但是难维护。

  • 声明式事务管理: 将业务代码和事务管理分离,基于xml 配置文件的方式和注解方式(在类上添加 @Transaction 注解)。

大多数情况下选择声明式事务管理,虽然比编程式事务管理少了一点灵活性,最细只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别,但是声明式事务管理对应用代码的影响最小,更符合一个无侵入的轻量级容器的思想,具有更好的可维护性。

10.Spring框架的事务管理有哪些优点

可以为不同的事务API 如JDBC,Hibernate,JPA等,提供一个不变的编程模式。 为编程式事务管理提供了一套简单的API而不是一些复杂的事务API。还支持声明式事务管理和Spring各种数据访问抽象层很好得集成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值