1.Spring是什么?

Spring是一个轻量级的IoC和AOP容器框架。是为Java应用程序提供基础性服务的一套框架,目的是为了简化企业应用程序的开发,使开发者只需要关注业务需求。

常见的配置方式有两种:

  1. 基于XML文件的配置方式
  2. 基于注解的配置方式

主要由以下七个模块组成:

  • Spring Core:核心类库,可以说Spring其他所有的功能都需要依赖这个类库。主要提供IoC服务。
  • Spring AOP:提供了面向切面的编程实现。
  • Spring JDBC:提供了Java连接数据库的实现
  • Spring ORM:对现有的ORM框架的支持,比如Hibernate。
  • Spring Web:为创建Web应用程序提供了支持。
  • SpringMVC:提供了面向WEB应用的Model-View-Controller的实现。
  • Spring Test:提供了对JUnit测试的支持。

2.Spring的优点?

  1. 方便解耦,简化开发

    1. Spring就是一个大工厂,可以将所有对象的创建和依赖关系的维护,交给Spring管理。
  2. AOP编程的支持

    1. Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能。
  3. 声明式事务的支持

    1. 只需要通过配置就可以完成对事务的管理,而无需手动编程。
  4. 方便程序的测试

    1. Spring对Junit4支持,可以通过注解方便的测试Spring程序。
  5. 方便集成各种优秀框架

    1. Spring内部提供了对各种优秀框架的直接支持(如:Struts、Hibernate、MyBatis等)。
  6. 降低JavaEE API的使用难度

    1. Spring对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低。

3.谈谈你对Spring IoC的理解?

  1. IoC就是控制反转,是一种设计思想。是指转移创建对象的控制权,就是原本在程序中需要手动创建对象的控制权现在交由Spring框架来管理。并由容器根据配置文件去创建实例和管理各个实例之间的依赖关系,也利于功能的复用。
  2. IoC容器是Spring用来实现IoC的载体,IoC容器实际上就是个Map,Map中存放的是各种对象。
  3. DI依赖注入,和控制反转是同一个概念的不同角度的描述,即 应用程序在运行时依赖IoC容器来动态注入对象需要的外部资源。
  4. 将对象之间的相互依赖关系交由IoC容器来管理,并由IoC容器完成对象的注入。这样可以很大程度上简化开发,把应用从复杂得依赖关系中解放出来。
  5. IoC容器就像一个工厂,当我们要创建一个对象的时候,只需要配置好配置文件或者注解即可,完全不用考虑对象时怎么创建出来的。
  6. Spring的IoC注入方式有三种:构造器注入、Setter方法注入、根据注解注入。

4.谈谈你对Spring AOP的理解?

AOP理解:

AOP是指面向切面编程,是面向对象的一种补充,能够将那些与业务无关,但是能对多个业务产生影响的共同行为和逻辑抽取并封装为一个可重用的模块,这个模块就被命名为“切面”,便于减少系统中重复的代码,降低了模块间的耦合度,同时提高了系统的可扩展性和可维护性。可用于权限认证、日志和事务处理。

SpringAOP和 AspectJ Aop的区别:

AOP的实现主要在于代理模式,而AOP代理主要分为静态代理和动态代理。静态代理的代表是AspectJ;动态代理的代表是Spring AOP。

  • 静态代理,就是指AOP在编译阶段生成AOP代理类,因此也被称为编译时增强,他会在编译阶段将切面织入到Java字节码中,运行时就是已经增强之后的AOP对象。
  • 动态代理时输入运行时增强,是在每次运行时在内存中临时为方法生成一个AOP对象,这个AOP对象包含目标对象的全部方法,并且在特定的切点上做增强处理,然后回调原对象的方法。
  • 如果切面较少,两者性能差异不大,但是如果切面太多,最好选择AspjectJ,因为它比SpringAOP快很多。

SpringAOP动态代理的两种方式:

JDK动态代理和CGLIB动态代理:

  • JDK动态代理只提供接口的代理,不支持类的代理。
  • 所以要代理的对象如果实现了某个接口,SpringAOP就会使用JDK动态代理去创建代理对象;
  • 对于没有实现接口的对象,会使用CGLIB动态代理去创建代理对象。

5.BeanFactory和ApplicationContext有什么区别?

​ BeanFactory和ApplicationContext是Spring的两大核心接口,都可以当做Spring的容器。

  • 但是BeanFactory 才是 Spring 容器中的顶层接口。
    ApplicationContext 是它的子接口。

  • 其次是创建对象的时间点不一样。

    • ApplicationContext,它是在容器启动时,一次性创建了所有的Bean。这样,在容器启动时,我们就可以发现Spring中存在的配置错误,这样有利于检查所依赖属性是否注入。
    • BeanFactroy采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化。这样,我们就不能发现一些存在的Spring的配置问题。
    • 相对于基本的BeanFactory,ApplicationContext 唯一的不足是占用内存空间。当应用程序配置Bean较多时,程序启动较慢。