1、Spring是什么?

spring是一个轻量级的基于IOC和AOP的开源容器框架。它的目的的简化企业应用程序的开发,让程序员更专注于业务代码。
spring中大致包含了以下7大模块提供服务
1.spring context 提供框架式的Bean访问方式,以及企业级功能
2.spring core spring核心包。包括了IOC和DI
3.spring AOP AOP的实现
4.spring web 提供了基本的WEB综合特性,提供了对stust2等框架的支持
5.spring mvc 提供model-view-controller,也即使MVC的实现
6.spring DAO 对JDBC操作的封装,并能同一管理JDBC事务
7.spring ORM 提供了对各大ORM框架的支持

2、Spring 的优点?

1.spring对代码的侵入度低,对代码的污染小
2.IOC和DI的实现,使创建对象和管理交给了spring框架,实现了代码的解耦
3.spring提供了AOP技术,让我们能实现一些通用代码,以及对日志,事务,权限的管理。
4.对各大主流的框架提供了支持

3、Spring的IOC理解?

IOC不是一个技术,而是一门思想,即控制反转。
控制什么?反转什么?控制即把对象交给IOC就行管理控制,反转即从我们原来需要自己new对象,到现在把创建对象的权力交给IOC容器。以前我们自己new对象,需要人为的去控制什么时候需要new,什么时候需要销毁对面,这种方式的坏处是与代码的耦合度高,且都需要我们自己控制,加大了代码量。控制反转后,由IOC容器来决定创建和销毁的时间,我们不做关注,在需要的时候直接拿来用即可。
自己new好处是代码执行效率高,坏处是耦合度高。IOC容器的好处是解耦,让开发者更关注于业务。坏处是以为IOC是通过反射的方式创建对象,而反射相比直接new的效率会差一些。
而DI则是和IOC同一个概念的不同角度的描述。假设控制对象A内部需要依赖于其他对象,并不需要我们自己去给它注入依赖,而是由DI来进行依赖注入。
IOC核心实现是通过反射。我们熟悉的BeanFactory及其子类ApplicationContext就是使用的反射创建Bean对象。

4、Spring的AOP理解?

AOP即面向切面。
在传统的OOM思想中,只适用于从上至下的关系,即继承和实现。当需要对多个方法或类在其前后执行一些相同的操作时,OOM就显得无能为了,而AOP则时解决这一问题的技术。
它可以让我们在不同的方法前后执行一些公用的逻辑,比如我们最常用的增删,在执行完成后,AOP会自动的帮我执行commit,失败执行回滚。
AOP中最核心的概念就是代理。而代理又分为静态代理AspectJ和动态代理,我们SPringAOP使用的是动态代理技术,即我们提供一个接口或类,AOP在运行期间会动态去帮我们生成该类的代理类。如果是接口,AOP使用JDK代理,如果不是接口则使用CGLIB技术代理。需要注意的是CGLIB是通过继承实现的,所以被代理的类不能是final修饰的。
AspectJ和AOP的区别在于,AspectJ是编译时增强,而AOP是运行时。AspectJ是基于字节码操作,而AOP是基于代理。相比较来说的话,AspectJ性能更好,AOP使用更方便。
AOP中重要的几个概念:
连接点:即程序运行中所执行的方法,一个连接点就表示一个方法的执行。说白了就是代理类要被执行的那个方法
切面:被抽取出来的公共模块。可以看作是切点和通知的组成,一个切面可以包含多个切点和通知
切点:就是要对哪些连接点进行拦截
通知:在连接点前后要执行的增强逻辑,比如权限校验和日志等。分为前置通知,后置通知,环绕通知,异常通知,返回通知。
目标对象:包含连接点的对象。因为AOP是动态代理,所以目标对象永远是代理对象。说白了就是要拦截的是哪一个类
织入:在目标对象的连接点前后执行通知处理的过程(就是对某个类的某个方法前面执行哪些增强操作)
引人:添加额外的方法或字段到执行的类。这种做法可以使我们在不修改原有代码的情况动态的给他添加方法和属性。代码侵入性小

5、Spring容器的启动流程?

1.初始化spring容器,注册内置的BeanPostProcessor到BeanDefinition中
2.将配置类的BeanDefinition注册到容器中
3.调用refesh()刷新容器

6、BeanFactory和ApplicationContext有什么区别?

BeanFactory是spring的核心,是spring的底层接口,它提供了Bean的加载,实例化,依赖注入,和生命周期管理。而ApplicationContext是在它的基础上的实现,包含了其所有功能,并进行了扩展,提供了国际化,资源文件访问,载入多个上下文等功能。
BeanFactory并不会直接创建Bean对象,而是等到第一次使用的时候才去创建,而ApplicationContext是提供加载好了所有对象,需要的时候直接调用。如果Bean对象很多,并且考虑内存的情况下,BeanFactory更好。
但是BeanFactory需要手动注册,ApplicationContext可以自动注册。BeanFactory有很多功能需要我们通过代码实现,而ApplicationContext可以通过配置实现。BeanFactory更多的面向spring框架的基本设置,而ApplicationContext则是面向开发者,使用也更输入。所以现在一般情况下我们都使用ApplicationContext来获取Bean,而非更加底层的BeanFactory。

7、 Spring中bean的作用域:

1.Singleton: 单例。这也是spring默认的选项。只会创建一个Bean对象
2.Prototype: 多例。为每一个线程创建一个Bean对象
3.Request: 每一次请求创建一个对象,请求结束则销毁
4.Session: 同一个会话共享一个Bean对象,会话结束销毁
5.Global-Session: 全局所有会话共享一个对象

8、Spring框架中的Bean是线程安全的么?如果线程不安全,那么如何处理?

这个要看你使用的是哪一种作用域。如果是Singleton那确实有线程安全的问题。
假设使用的是Singleton,如果是Controller,Service,DAO基本 不会有线程安全问题,因为它们都是无状态Bean,我们只关注方法内部的业务本身,并不会去定义成员变量。如果是其他Bean,为了保证线程安全,首先可以选择切换作用域,切换到Prototype,各自使用各自的实例则不会有问题。如果不,可以使用ThreadLocal,它的特点就是每一个线程虽然指向的是同一个对象,但是为他们各自分配一个变量副本,各自操作自己的变量,也可以避免线程安全的问题。

这里要说到,ThreadLocal和同步机制都是为了避免多个线程情况下变量冲突的问题。只不过他们的实现理念不同。同步机制更多的是“时间换空间”,通过同步方法或同步代码块,使一次只能一个线程操作,这种方式牺牲了执行效率,但是内存占用小。ThreadLocal是“空间换时间”,为每一个线程都独立分配一个变量副本,各自操作自己的则不会有线程安全问题,这种方式牺牲了内存空间来换取快的执行效率。

9、Spring如何解决循环依赖问题?

10、Spring的自动装配?