1.Spring是什么?
Spring是一个轻量级的IoC和AOP容器框架。是为Java应用程序提供基础性服务的一套框架,目的是为了简化企业应用程序的开发,使开发者只需要关注业务需求。
常见的配置方式有两种:
- 基于XML文件的配置方式
- 基于注解的配置方式
主要由以下七个模块组成:
- 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的优点?
方便解耦,简化开发
- Spring就是一个大工厂,可以将所有对象的创建和依赖关系的维护,交给Spring管理。
AOP编程的支持
- Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能。
声明式事务的支持
- 只需要通过配置就可以完成对事务的管理,而无需手动编程。
方便程序的测试
- Spring对Junit4支持,可以通过注解方便的测试Spring程序。
方便集成各种优秀框架
- Spring内部提供了对各种优秀框架的直接支持(如:Struts、Hibernate、MyBatis等)。
降低JavaEE API的使用难度
- Spring对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低。
3.谈谈你对Spring IoC的理解?
- IoC就是控制反转,是一种设计思想。是指转移创建对象的控制权,就是原本在程序中需要手动创建对象的控制权现在交由Spring框架来管理。并由容器根据配置文件去创建实例和管理各个实例之间的依赖关系,也利于功能的复用。
- IoC容器是Spring用来实现IoC的载体,IoC容器实际上就是个Map,Map中存放的是各种对象。
- DI依赖注入,和控制反转是同一个概念的不同角度的描述,即 应用程序在运行时依赖IoC容器来动态注入对象需要的外部资源。
- 将对象之间的相互依赖关系交由IoC容器来管理,并由IoC容器完成对象的注入。这样可以很大程度上简化开发,把应用从复杂得依赖关系中解放出来。
- IoC容器就像一个工厂,当我们要创建一个对象的时候,只需要配置好配置文件或者注解即可,完全不用考虑对象时怎么创建出来的。
- 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较多时,程序启动较慢。