1.什么是spring?
Spring是一个轻量级Java开发框架,目的是为了解决企业级应用场景业务逻辑层和其他各层的耦合问题。他是一个轻量级的开源框架,可以使开发人员专注于应用程序开发。他依赖两个核心功能依赖注入和面向切面编程。为了降低Java开发复杂性,Spring采用了四种关键策略:基于POJO的轻量级和最小侵入性编程、通过依赖注入和面向接口实现轻松耦合、基于切面和惯例进行声明式编程、通过切末和模版减少样板式代码。
2.Spring框架的设计目标,设计理念,和核心是什么
Spring设计目标:Spring为开发者提供一个一站式轻量级应用开发平台;
Spring设计理念:在JavaEE开发中,支持POJO和JavaBean开发方式,使应用面向接口开发,充分支持OO(面向对象)设计方法;Spring通过IoC容器实现 对象耦合关系的管理,并实现依赖反转,将对象之间的依赖关系交给IoC容器, 实现解耦;
Spring框架的核心:IoC容器和AOP模块。通过IoC容器管理POJO对象以及他 们之间的耦合关系;通过AOP以动态非侵入的方式增强服务。 IoC让相互协作的组件保持松散的耦合,而AOP编程允许你把遍布于应用各层的功能分离出来形成可重用的功能组件。
3.Spring的优缺点是什么?
优点
1.方便解耦,简化开发
Spring就是一个大工厂,可以将所有对象的创建和依赖关系的维护,交给 Spring管理。
2.AOP编程的支持
Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能。
3.声明式事务的支持
只需要通过配置就可以完成对事务的管理,而无需手动编程。
4.方便程序的测试
Spring对Junit4支持,可以通过注解方便的测试Spring程序。
5.方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架的直接支持(如:Struts、Hibernate、MyBatis等)。
6.降低JavaEE API的使用难度
Spring对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低。
缺点
- 1.Spring明明一个很轻量级的框架,却给人感觉大而全
- 2.Spring依赖反射,反射影响性能
-
4.Spring有哪些应用场景
应用场景:JavaEE企业应用开发,包括SSH、SSM等
Spring价值: Spring是非侵入式的框架,目标是使应用程序代码对框架依赖最小化;
- Spring提供一个一致的编程模型,使应用直接使用POJO开发,与运行环境隔离开来;
Spring推动应用设计风格向面向对象和面向接口开发转变,提高了代码的重用性和可测试性;
5.Spring由哪些模块组成?

Spring包含7个核心模块:Spring core、Spring AOP、Spring context、Spring DAO、Spring ORM、Spring Web、Spring MVC
1.Spring core:核心容器
核心容器提供spring框架的基本功能。Spring以bean的方式组织和管理Java应用中的各个组件及其关系。Spring使用BeanFactory来产生和管理Bean,它是工厂模式的实现。BeanFactory使用控制反转(IoC)模式将应用的配置和依赖性规范与实际的应用程序代码分开。BeanFactory使用依赖注入的方式提供给组件依赖。主要实现控制反转IoC和依赖注入DI、Bean配置以及加载。
- 2.Spring AOP:Spring面向切面编程
通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了Spring框架中。所以,可以很容易地使 Spring框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。AOP把一个业务流程分成几部分,例如权限检查、业务处理、日志记录,每个部分单独处理,然后把它们组装成完整的业务流程。每个部分被称为切面或关注点。
AOP的实现原理为动态代理技术,一共有两种代理模式:
- ProxyFactoryBean代理工厂对象
Spring内置代理类,引入一个中间层,能够创建不同类型的对象,利用它可以实现任何形式的AOP。
- TransactionProxyFactoryBean事务代理工厂对象
常用在数据库编程上,Spring利用TransactionProxyFactoryBean对事务进行管理,在指定方法前利用AOP连接数据库并开启事务,然后在指定方法返回后利用AOP提交事务并断开数据库。
- 3.Spring context:Spring上下文
Spring上下文是一个配置文件,向Spring框架提供上下文信息。Spring上下文包括企业服务,如JNDI、EJB、电子邮件、国际化、校验和调度功能。提供框架式Bean访问方式,其他程序可以通过Context访问Spring的Bean资源。
- 4.Spring DAO
DAO模块主要目的是将持久层相关问题与一般的的业务规则和工作流隔离开来。Spring 中的DAO提供一致的方式访问数据库,不管采用何种持久化技术,Spring都提供一致的编程模型。Spring还对不同的持久层技术提供一致的DAO方式的异常层次结构。Spring的DAO模块对JDBC进行了再封装,隐藏了Connection、Statement、ResultSet等JDBC API,使DAO模块直接继承JdbcDaoSupport类。
- 5.Spring ORM(Object Relation Mapper)对象关系映射模块
Spring 与所有的主要的ORM框架都集成的很好,包括hibernate、JDO实现、TopLink和IBatis SQL Map等。Spring为所有的这些框架提供了模板之类的辅助类,达成了一致的编程风格。
Spring的ORM模块对ORM框架如Hibernate等进行了封装,Spring能够管理、维护Hibernate,使用时可直接继承HibernateDaoSupport类,该类内置一个HibernateTemplate。Hibernate的配置也转移到Spring配置文件中。
(注:ORM是通过使用描述对象和数据库之间映射的元数据,ORM框架采用元数据来描述对象–关系映射细节,元数据一般采用xml格式,并且存放在专门的对象–映射文件中)
- 6.Spring Web模块
Web模块建立在应用程序上下文模块之上,为基于Web的应用程序提供了上下文。Web层使用Web层框架,可选的,可以是Spring自己的MVC框架,或者提供的Web框架,如Struts、Webwork、tapestry和jsf。
Web模块用于整合Web框架,将Web框架也纳入Spring的管理之中。如Spring提供继承方式与代理方式整合Struts,继承方式不需要更改任何配置文件,只把Action继承自ActionSupport即可,但会对Spring产生依赖。代理方式需要在struts-config.xml中配置,由Spring全盘代理,因此可以使用Spring的各种资源、拦截器等。
- 7.Spring MVC
MVC框架是一个全功能的构建Web应用程序的MVC实现。通过策略接口,MVC框架变成为高度可配置的。Spring的MVC框架提供清晰的角色划分:控制器、验证器、命令对象、表单对象和模型对象、分发器、处理器映射和视图解析器。Spring支持多种视图技术。
Spring MVC 的工作流程:
(1) 客户端发送请求,请求到达 DispatcherServlet 主控制器。
(2) DispatcherServlet 控制器调用 HandlerMapping 处理。
(3) HandlerMapping 负责维护请求和 Controller 组件对应关系。 HandlerMapping 根据请求调用对应的 Controller 组件处理。
(4) 执行 Controller 组件的业务处理,需要访问数据库,可以调用 DAO 等组件。
(5)Controller 业务方法处理完毕后,会返回一个 ModelAndView 对象。该组件封装了模型数据和视图标识。
(6)Servlet 主控制器调用 ViewResolver 组件,根据 ModelAndView 信息处理。定位视图资源,生成视图响应信息。
(7)控制器将响应信息给用户输出。
6.Spring 框架中都用到了哪些设计模式?
- 工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例;
- 单例模式:Bean默认为单例模式。
- 代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;
- 模板方法:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。
观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,如Spring中 listener的实现–ApplicationListener
7.Spring框架中有哪些不同类型的事件
Spring 提供了以下5种标准的事件:
上下文更新事件(ContextRefreshedEvent):在调用 ConfigurableApplicationContext 接口中的refresh()方法时被触发。
- 上下文开始事件(ContextStartedEvent):当容器调用 ConfigurableApplicationContext的Start()方法开始/重新开始容器时触 发该事件。
- 上下文停止事件(ContextStoppedEvent):当容器调用 ConfigurableApplicationContext的Stop()方法停止容器时触发该事件。
- 上下文关闭事件(ContextClosedEvent):当ApplicationContext被 关闭时触发该事件。容器被关闭时,其管理的所有单例Bean都被销毁。
- 请求处理事件(RequestHandledEvent):在Web应用中,当一个 http请求(request)结束触发该事件。如果一个bean实现了 ApplicationListener接口,当一个ApplicationEvent 被发布以后,bean 会自动被通知。
