1.Spring的两大核心特征是什么?
Spring的两大核心特性就是IOC和AOP,IOC(Inversion of Control),即“控制反转”;AOP(Aspect-Oriented Programming),即“面向切面编程”。
2.Spring的属性注入有哪些方式?
- 构造方法注入:既可以使用xml方式也可以使用annotation方式实现。
- set方法注入:既可以使用xml方式也可以使用annotation方式实现。
- 工厂注入
3.说说Spring AOP的实现原理
AOP实现和核心原理是动态代理机制。Spring AOP的动态代理主要由两种方式实现,JDK动态代理和cglib动态代理。
JDK动态代理与CGLIB动态代理的区别:
- JDK动态代理只能对实现了接口的类生成代理,而不能使用抽象类,例如:mybatis的mapper文件是代理。使用反射完成。使用了动态生成字节码技术。
- CGLIB是针对类实现代理,接口和抽象类都可以使用,使用字节码处理框架ASM,对代理对象类的class文件加载进来,通过修改字节码生成子类。
4.Spring中的bean的作用域有哪些?
- singleton:单例,默认的作用域。
- prototype:原型,每次使用(注入或调用getBean()方法都会new一个新的对象,一旦被使用或者注入,spring就不再只有Bean的引用,清楚bean并释放资源是调用者的职责;
- request:请求作用域,针对每一次HTTP请求都会产生一个新的bean,仅适用于WebApplicationContext环境。
- session:会话作用域,每次一次新的会话都会产生一个新的对象。
- globalSession:global session为整个HTTP请求中,在作用域方面就是application;
5.说说Spring中bean的生命周期?

Bean的完整生命周期经历了各种方法调用,这些方法可以划分为以下几类:
- Bean自身的方法:这个包括了Bean本身调用的方法和通过配置文件中的init-method和destroy-method指定的方法。
- Bean级生命周期接口方法:这个包括了BeanNameAware、BeanFactoryAware、InitializingBean和DiposableBean这些接口的方法。
- 容器级生命周期接口方法:这个包括了InstantiationAwareBeanPostProcessor 和 BeanPostProcessor 这两个接口实现,一般称它们的实现类为“后处理器”。
- 工厂后处理器接口方法:这个包括了AspectJWeavingEnabler, ConfigurationClassPostProcessor, CustomAutowireConfigurer等等非常有用的工厂后处理器接口的方法。工厂后处理器也是容器级的。在应用上下文装配配置文件之后立即调用。
6.说说bean的id与name属性的区别。
- id取值要求严格些,必须满足XML的命名规范,并且id必须是唯一的,配置文件中不允许出现两个id相同的bean。
- name取值比较随意,甚至可以用数字开头。在配置文件中允许出现两个name相同的,在用getBean()返回实例时,后面一个Bean被返回。
- 如果没有id,name,则用类的全名作为name。
7.什么是循环依赖?如何解决循环依赖?
循环依赖:就是一个或多个对象实例之间存在直接或间接的依赖关系,这种依赖关系构成了构成一个环形调用。
有以下三种循环依赖情形:
1)自我依赖

2)两个对象之间的直接依赖

3)多个对象之间的间接依赖

Spring通过三级缓存来解决循环依赖问题。
- 一级缓存为:singletonObjects,里面存放了实例化好并且完成初始化的单例对象。
- 二级缓存为:earlySingletonObjects,里面存放的是提前曝光的单例对象,这个Bean实例化了,但是还没有完成属性初始化。
- 三级缓存为:singletonFactories,用来存放bean工厂的缓存,主要用来解决代理对象的循环依赖问题。
简单一句话,Spring通过三级缓存,提前暴露对象,通过AOP解决循环依赖。
8.@Resource与@Autowired的区别?
- 来源不同:@Autowired是Spring的注解,而@Resource是JAVAEE的注解;
- 依赖查找的顺序不同:@Autowired先根据类型再根据名称查找,而@Resource先根据名称再根据类型查找;
- 支持的参数不同:@Autowired只支持设置1个参数(required),而@Resource支持设置7个参数(name,type等等);
- 依赖注入的用法支持不同:@Autowired既支持构造方法注入,又支持属性注入和setter注入,而 @Resource只支持属性注入和setter注入;
- 编译器IDEA的提示不同:当注入Mapper对象时,使用@Autowired注解编译器会提示错误,而使用 @Resource注解则不会提示错误。
9.Spring框架中用到了哪些设计模式?
- 简单工厂模式: 例如,Spring中的FactoryBean就是典型的工厂方法模式。
- 单例模式:例如:bean 的作用域 scope="singleton"
- 迭代器模式:Spring中的CompositeIterator实现了Iterator接口。
- 代理模式:Spring中经典的AOP,就是使用动态代理实现的,分别为JDK和CGlib动态代理。
- 适配器模式:Spring中的AOP中AdvisorAdapter类。
- 观察者模式:Spring事件监听器ApplicationListener,该接口继承了EventListener接口。
- 模板模式:Spring中的JdbcTemplate就是非常经典的模板模式的应用。
- 责任链模式:DispatcherServlet中的doDispatch() 方法中获取与请求匹配的处理器 HandlerExecutionChain,this.getHandler() 方法的处理使用到了责任链模式。
10.Spring如何管理事务?
Spring支持两种方式的事务管理:
- 编程式事务管理:通过 TransactionTemplate或者TransactionManager手动管理事务,实际应用中很少使用。
- 声明式事务管理:基于@Transactional的全注解方式实现声明式事务管理。强烈推荐使用,代码侵入性少,内部通过AOP实现。