Spring重点概述

1. 对 Spring 的理解

* 开源框架,为简化企业级应用开发而生。
* Spring 可以是使简单的 JavaBean 实现以前只有 EJB 才能实现的功能。
* Spring 是一个 IOC 和 AOP 容器框架。
Spring 容器的主要核心是:
  • 控制反转(IOC),传统java开发模式中,需一个对象时,会使用 new或getInstance 等直接或间接调用构造方法创建一个对象。
    而spring开发中,spring容器使用工厂模式创建了所需对象,不需自己创建了,直接调用 spring 提供的对象就可,控制反转的思想。
  • 依赖注入(DI),spring使用 javaBean 对象的set 方法或者带参数的构造方法为我们在创建所需对象时将其属性自动设置所需要的值的过程,就是依赖注入的思想。
  • 面向切面编程(AOP),在面向对象编程(oop)思想中,将事物纵向抽成一个个的对象。
    而在面向切面编程中,将一个个对象某些类似的方面横向抽成一个切面,对这个切面进行一些如权限控制、事物管理,记录日志等公用操作处理的过程就是面向切面编程的思想。
    AOP底层是动态代理,如是接口采用JDK动态代理,如是类采用CGLIB方式实现动态代理。

2. Spring 中的设计模式

  • 单例模式——spring 中两种代理方式,若目标对象实现了若干接口,spring 使用 jdk 的 java.lang.reflect.Proxy类代理。
    若目标兑现没有实现任何接口,spring 使用 CGLIB 库生成目标类的子类。
    • 单例模式——在 spring 的配置文件中设置 bean 默认为单例模式。
  • 模板方式模式——解决代码重复的问题。如:RestTemplate,JmsTemplate,JpaTemplate
  • 前端控制器模式——spring提供了前端控制器 DispatherServlet 来对请求进行分发。
  • 试图帮助(view helper)——spring 提供了一系列JSP 标签,高效宏帮助将分散的代码整合在视图中。
  • 依赖注入——贯穿于BeanFactory/ApplacationContext 接口的核心理念。
  • 工厂模式——工厂模式中,在创建对象时不会对客户端暴露创建逻辑,且是通过使用同一个接口来指向新创建的对象。Spring 中使用 beanFactory 来创建对象的实例。

3. Spring 的常用注解

Spring在2.5版本后开始支持注解方式配置依赖注入。可用注解的方式来代替xml中bean的描述。
注解注入将会被容器在XML注入前被处理,所以后者会覆盖掉前者对于同一个属性的处理结果。
注解装配在spring中默认关闭的。需在spring的核心配置文件中配置一下才能使用基于注解的装配模式。

配置方式如下:<context:annotation-config />

常用的注解:
@Required:该注解应用于设值方法
@Autowired:该注解应用于有值设值方法、非设值方法、构造方法和变量。
@Qualifier:该注解和@Autowired 搭配使用,用于消除特定 bean 自动装配的歧义。

4. 简单介绍Spring bean 的生命周期

  1. bean 定义:在配置文件里面用来进行定义。
  2. bean 初始化:有两种方式初始化:
    • 在配置文件中通过指定 init-method 属性来完成
    • 实现 org.springframwork.beans.factory.InitializingBean 接口
  3. bean 调用:有三种方式可以得到 bean 实例,并进行调用
  4. bean 销毁:销毁有两种方式
    • 使用配置文件指定的 destroy-method 属性
    • 实现 org.springframwork.bean.factory.DisposeableBean 接口

5. 结构图

这里写图片描述
1. 核心容器:包括 Core、Beans、Context、EL 模块。
* Core 模块:封装了框架依赖的最底层部分,包括资源访问、类型转换及一些常用工具类。
* Beans 模块:提供了框架基础部分,包括反转控制和依赖注入。其中 Bean Factory 是容器核心,本质是“工厂设计模式”的实现,且无需编程实现“单例设计模式”,单例完全由容器控制,且提倡面向接口编程,而非面向实现编程;所有应用程序对象及对象间关系由框架管理,从而真正从程序逻辑中把维护对象之间的依赖关系提取出来,所有这些依赖关系都由 BeanFactory 来维护。
* Context 模块:以 Core 和 Beans 为基础,集成 Beans 模块功能并添加资源绑定、数据验证、国际化、Java EE 支持、容器生命周期、事件传播等;核心接口是 ApplicationContext。
* EL 模块:提供强大的表达式语言支持,支持访问和修改属性值,方法调用,支持访问及修改数组、容器和索引器,
* 命名变量,支持算数和逻辑运算,支持从 Spring 容器获取 Bean,它也支持列表投影、选择和一般的列表聚合等。
2. AOP、Aspects 模块:
* AOP 模块:Spring AOP 模块提供了符合 AOP Alliance 规范的面向方面的编程(aspect-oriented programming)实现,提供如日志记录、权限控制、性能统计等通用功能和业务逻辑分离的技术,且能动态的把这些功能添加到需要的代码中;各专其职,降低业务逻辑和通用功能的耦合。
* Aspects 模块:提供了对 AspectJ 的集成,AspectJ 提供了比 Spring ASP 更强大的功能。
* 数据访问/集成模块:该模块包括了 JDBC、ORM、OXM、JMS 和事务管理。
* 事务模块:用于 Spring 管理事务,只要是 Spring 管理对象都能得到 Spring 管理事务的好处,无需在代码中进行事务控制,且支持编程和声明性的事务管理。
* JDBC 模块:提供了一个 JBDC 的样例模板,使用这些模板能消除传统冗长的 JDBC 编码还有必须的事务控制,且能享受到 Spring 管理事务的好处。
* ORM 模块:提供与流行的“对象-关系”映射框架的无缝集成,包括 Hibernate、JPA、MyBatis 等。且可以使用 Spring 事务管理,无需额外控制事务。
* OXM 模块:提供了对 Object/XML 映射实现,将 java 对象映射成 XML 数据,或将 XML 数据映射成 java对象,Object/XML 映射实现包括 JAXB、Castor、XMLBeans 和 XStream。
* JMS 模块:用于 JMS(Java Messaging Service),提供一套 “消息生产者、消息消费者”模板用于更加简单的使用 JMS,JMS 用于用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
* Web/Remoting 模块:Web/Remoting 模块包含了 Web、Web-Servlet、Web-Struts、Web-Porlet 模块。
* Web 模块:提供了基础的 web 功能。例如多文件上传、集成 IoC 容器、远程过程访问(RMI、Hessian、Burlap)以及 Web Service 支持,并提供一个 RestTemplate 类来提供方便的 Restful services 访问。
* Web-Servlet 模块:提供了一个 Spring MVC Web 框架实现。Spring MVC 框架提供了基于注解的请求资源注
入、更简单的数据绑定、数据验证等及一套非常易用的 JSP 标签,完全无缝与 Spring 其他技术协作。
* Web-Struts 模块:提供了与 Struts 无缝集成,Struts1.x 和 Struts2.x 都支持
* Test 模块: Spring 支持 Junit 和 TestNG 测试框架,而且还额外提供了一些基于 Spring 的测试功能,如在测试 Web 框架时,模拟 Http 请求的功能。

6. Spring 能做什么?

  • 能根据配置文件创建及组装对象之间的依赖关系。
  • 面向切面编程无耦合的实现日志记录,性能统计,安全控制。
  • 能管理数据库事务。只需获取连接,执行 SQL,其他事物相关都交给 Spring 管理了。
  • 能与第三方数据库访问框架(如 Hibernate、JPA)无缝集成,自己也提供了套 JDBC访问模板,方便数据库访问。
  • 能与第三方 Web(如 Struts、JSF)框架无缝集成,自己也提供了套 Spring MVC框架,方便 web 层搭建。
  • 能方便的与Java EE(如 Java Mail、任务调度)整合,与更多技术整合(比如缓存框架)。

7. Spring 的事务

事务管理可帮助我们保证数据一致性。Spring的事务机制包括声明式事务和编程式事务。
  1. 编程式事务管理:Spring推荐使用TransactionTemplate,实际开发中使用声明式事务较多。

  2. 声明式事务管理:将我们从复杂的事务处理中解脱出来,获取连接,关闭连接、事务提交、回滚、异常处理等这些操作都不用我们处理了,Spring都会帮我们处理。

    • 声明式事务管理使用了AOP面向切面编程实现的,本质是在目标方法执行前后进行拦截。在目标方法执行前加入或创建一个事务,在执行方法执行后,根据实际情况选择提交或是回滚事务。
如何管理的:
  • Spring事务管理主要包括3个接口,共同完成。

    1. PlatformTransactionManager:事务管理器–主要用于平台相关事务的管理

      主要有三个方法:
      commit 事务提交;
      rollback 事务回滚;
      getTransaction 获取事务状态。

    2. TransactionDefinition:事务定义信息–用来定义事务相关的属性,给事务管理器PlatformTransactionManager使用

      这个接口有下面四个主要方法:
      getIsolationLevel:获取隔离级别;
      getPropagationBehavior:获取传播行为;
      getTimeout:获取超时时间;
      isReadOnly:是否只读(保存、更新、删除时属性变为false–可读写,查询时为true–只读)
      事务管理器能够根据这个返回值进行优化,这些事务的配置信息,都可以通过配置文件进行配置。

    3. TransactionStatus:事务具体运行状态–事务管理过程中,每个时间点事务的状态信息。

      如它的几个方法:
      hasSavepoint():返回这个事务内部是否包含一个保存点,
      isCompleted():返回该事务是否已完成,也就是说,是否已经提交或回滚
      isNewTransaction():判断当前事务是否是一个新事务

声明式事务的优缺点:
  • 优点:不需在业务逻辑代码中编写事务相关代码,只需在配置文件配置或使用注解(@Transaction),没有侵入性。

  • 缺点:最细粒度作用于方法上,如像代码块也有事务需求,只能变通下,将代码块变为方法。

区别
  • 编程式事务是自己写事务处理的类,然后调用

  • 声明式事务是在配置文件中配置,一般搭配在框架里面使用!

8. BeanFactory 常用的实现类有哪些?

  • Bean 工厂是工厂模式的一个实现,提供了控制反转功能,用来把应用的配置和依赖从正真的应用代码中分离。
  • 常用BeanFactory实现有DefaultListableBeanFactory,XmlBeanFactory, ApplicationContext 等。
  • XMLBeanFactory,最常用就是 org.springframework.beans.factory.xml.XmlBeanFactory ,它根据 XML文件中的定义加载 beans。该容器从 XML文件读取配置元数据并用它去创建一个完全配置的系统或应用。

9. 解释 Spring JDBC、Spring DAO 和 Spring ORM

  • Spring-DAO 并非 Spring 的一个模块,实际是写 DAO 操作的一些规范。因此,对于访问数据它既没提供接口也没有提供实现更没有提供模板。在写一个 DAO 的时,应使 @Repository 对其进行注解,这样底层技术(JDBC,Hibernate,JPA,等等)的相关异常才能一致性地翻译为相应的 DataAccessException 子类。
  • Spring-JDBC 提供了 Jdbc 模板类,它移除了连接代码专注于 SQL 查询和相关参数。还提供了一个 JdbcDaoSupport,可以对 DAO 进行扩展开发。主要定义了两个属性:一个 DataSource和一个 JdbcTemplate,都可用来实现 DAO 方法。JdbcDaoSupport 还提供了个将 SQL 异常转换为Spring DataAccessExceptions 的异常翻译器。
  • Spring-ORM 是囊括了很多持久层技术(JPA,JDO,Hibernate,iBatis)的总括模块。对这些技术中的每个,都提供了集成类,每种技术在遵循 Spring 配置原则下使用和 Spring 事务管理集成。对 每 种 技 术 , 配 主 要 在 于 将 一 个 DataSource bean 注 入 到 某 种 SessionFactory 或EntityManagerFactory 等 bean 中。纯 JDBC 不需这样一个集成类(JdbcTemplate 除外),因 JDBC 仅依赖于 DataSource。如使用一种 ORM 技术,比如 JPA 或者 Hibernate,那么不需Spring-JDBC 模块了,需要的是这个 Spring-ORM 模块。

10. Spring WEB 模块。

  • 构建在 application context 模块基础上,提供一个适合 web 应用的上下文。也包括支持多种面向 web 的任务,如透明处理多个文件上传请求和程序级请求参数的绑定到业务对象。也有对 Jakarta Struts 的支持。

11. Spring 配置文件作用

  • XML 文件,包含了类信息,描述了如何配置它们,如何相互调用。

12. Spring IOC

  • IOC 控制反转:Spring IOC 负责创建对象,管理对象。通过依赖注入(DI),装配对象,配置对象,且管理这些对象的整个生命周期。
优点
  • IOC 或 依赖注入把应用的代码量降到最低。使应用容易测试,单元测试不再需单例和 JNDI 查找机制。最小的代价和最小的侵入性使松散耦合得以实现。
  • IOC 容器支持加载服务时的饿汉式初始化和懒加载。

13. ApplicationContext 的实现类

  • FileSystemXmlApplicationContext :从一个 XML 文件中加载 beans 的定义,XML Bean 配置文件的全路径名必须提供给它的构造函数。
  • ClassPathXmlApplicationContext:从一个 XML 文件中加载 beans 的定义,需正确设置classpath 因这个容器将在 classpath 里找 bean 配置。
  • WebXmlApplicationContext:加载一个 XML 文件,此文件定义了一个 WEB 应用的所有 bean。

14. BeanFactory与AppliacationContext

  1. BeanFactory

    基础类型的 IOC 容器,提供完成的 IOC 服务支持。如没有特殊指定,默认采用延迟初始化策略。相对来说,容器启动初期速度较快,所需资源有限。

  2. ApplicationContext

    在 BeanFactory 的基础上构建,是较高级的容器实现,除 BeanFactory 的所有支持外,还提供了事件发布、国际化支持等功能。ApplicationContext 管理的对象,在容器启动
    后默认全部初始化并且绑定完成。

15. 依赖注入

  • 平常java开发中,某个类中需依赖其它类的方法,常new一个依赖类再调用类实例的方法,但new的类实例不好统一管理.
  • 依赖注入即依赖类不由程序员实例化,通过 spring容器 new指定实例且将实例注入到需要该对象的类中。
  • 依赖注入的另一种说法是“控制反转”。

    IOC(依赖注入)方式?
    1. Set 注入
    2. 构造器注入
    3. 静态工厂的方法注入
    4. 实例工厂的方法注入
  • 关于依赖注入详解:https://blog.csdn.net/liyifan687/article/details/80051060

16. Spring beans?

  • 形成 Spring 应用的主干的 java 对象。被Spring IOC 容器初始化,装配,管理。这些 beans 通过容器中配置的元数据创建。如以 XML 文件中<bean/> 的形式定义。
  • Spring 框架定义的 beans 都是单例 beans。
一个 Spring Beans 的定义包含
  • 包含容器必知的所有配置元数据,包括如何创建一个 bean,它的生命周期详情及它的依赖。

17. 怎样定义类的作用域

  • 可通过 bean 定义中的 scope 属性来定义。如当 Spring 要在需要的时为每生产个新的 bean 实例, scope 属性被指定为 prototype。
  • 另一方面,一个bean每次使用时必须返回同一个实例,这个 bean 的 scope属性必须设为 singleton。
Spring 支持的几种 bean 的作用域。
  1. singleton : bean 在每个 Spring ioc 容器中只有一个实例。
  2. prototype:一个bean的定义可有多个实例。
  3. request:每次http请求都会创建一bean,仅在基于web的Spring ApplicationContext 情形下有效。
  4. session :在 一 个 HTTP Session 中 , 一个bean 定义对应一实 例。 该作用域仅 在 基 于 web 的Spring ApplicationContext 情形下有效。
  5. global-session:在一个全局的 HTTP Session 中,一个 bean 定义对应一个实例。该作用域仅在基于 web 的Spring ApplicationContext 情形下有效。
  6. 缺省的 Spring bean 的作用域是 Singleton。

18. Spring 框架中的单例 bean 不是线程安全的。

19. Spring 的内部 bean

  • 当一个 bean 仅被用作另一个 bean 的属性时,能被声明为一个内部 bean,
  • 在Spring 的 基于 XML 的 配置元数据中,可在 或 元素内使用 元素,内部 bean 通常是匿名, Scope 一般是 prototype。

20. 如何注入一个 java 集合

  • 类型用于注入一列值,允许有相同的值。
  • 类型用于注入一组值,不允许有相同的值。
  • 类型用于注入一组键值对,键和值都可以为任意类型。
  • 类型用于注入一组键值对,键和值都只能为 String 类型。

21. bean 的自动装配

  • 无须在 Spring 配置文件中描述 javaBean 间的依赖关系(如配置<property>、<constructor-arg>)。IOC 容器会自动建立 javabean 之间的关联关系。
有五种自动装配的方式,用来指导自动装配方式来进行依赖注入。
  1. no:默认的方式是不进行自动装配,通过显式设置 ref 属性来进行装配。
  2. byName:通过参数名自动装配,配置文件中发现 bean 的 autowire 属性被设置成 byname,之后容器试图匹配、装配和该 bean 的属性具有相同名字的 bean。
  3. byType::通过参数类型自动装配,配置文件中发现 bean 的 autowire 属性被设置成 byType,之后容器试图匹配、装配和该 bean 的属性具有相同类型的 bean。如有多个 bean 符合条件,抛出错误。
  4. constructor:类似于 byType, 但要提供给构造器参数,如没有确定的带参数的构造器参数类型,将抛出异常。
  5. autodetect:首先使用 constructor 来自动装配,如无法工作,则用 byType 方式。

22. 基于 Java 的Spring 注解配置

  • 基于 Java 的配置,允许在少量的 Java 注解的帮助下,进行大部分 Spring 配置而非通过 XML 文件。
  • @Configuration 注解,用来标记类可当做一个 bean 的定义,被 Spring IOC 容器使用。
  • @Bean 注解,它表示此方法将要返回一个对象,作为一个 bean 注册进 Spring 应用上下文。

23. 基于注解的容器配置

  • 相对于 XML 文件,注解型的配置依赖于通过字节码元数据装配组件,而非尖括号的声明。通过在相应的类,方法或属性上使用注解的方式,直接组件类中进行配置,而不是使用 xml 表述 bean 的装配关系。
  • 注 解 装 配 在 默 认 情 况 下 不 开 启, 须 在 Spring 配 置 文 件 中 配置 元素。

24. Spring 框架中更有效地使用 JDBC

  • 使用 SpringJDBC 框架,资源管理和错误处理的代价会被减轻。只需写 statements 和 queries 存取数据,JDBC可在模板类(JdbcTemplate )帮助下更有效地被使用。
  • JdbcTemplate 类提供了很多便利方法解决诸如把数据库数据转变成基本数据类型或对象,执行写好的或可调用的数据库操作语句,提供自定义的数据错误处理。

25. Spring 访问 Hibernate

两种方式
* 控制反转 HibernateTemplate 和 Callback。
* 继承 HibernateDAOSupport 提供一个 AOP 拦截器。

26. Spring 支持的 ORM 框架

  • Hibernate、iBatis、JPA (Java Persistence API)、TopLink、JDO (Java Data Objects)、OJB

27. spring AOP、

  • (Aspect Oriented Programming)面向切面编程,OOP(Object Oriented Programming,面向对象编程)的补充完善。OOP引入封装、继承、多态等概念来建立对象层次结构,模拟公共行为的一个集合。不过OOP允许定义纵向的关系,并不适合定义横向的关系,如日志功能。

    日志代码往往横向地散布在所有对象层次中,与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性、异常处理和透明的持续性也如此,这种散布在各处的无关的代码被称为横切(cross cutting),OOP 中,它导致大量代码重复,不利于各模块重用。

  • AOP 相反,利用”横切”技术剖解开封装的对象内部,将影响了多个类的公共行为装到一个可重用模块,命名为”Aspect”,切面。就是那些与业务无关,却为业务模块共同调用的逻辑或责任封装起来,减少重复代码,降低模块间耦合,有利于未来操作性维护性。

    AOP 把软件系统分为两个部分:核心关注点和横切关注点。

  • 业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,经常发生在核心关注点的多处,而各处基本相似,如权限认证、日志、事物。AOP 的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。
  • AOP 核心就是切面,将多个类的通用行为封装成可重用的模块,模块含有一组 API 提供横切功能。如,一个日志模块可以被称作日志的 AOP 切面。根据需求不同,一个应用程序可有若干切面。切面通过带有@Aspect 注解的类实现。

28. 在 Spring AOP 中,关注点和横切关注的区别

  • 关注点是应用中一个模块的行为,关注点可能会被定义成实现的一个功能。
  • 横切关注点是一个关注点,此关注点是整个应用都会使用的功能,并影响整个应用,如日志,安全和数据传输,几乎应用的每个模块都需要的功能。因此这些都属于横切关注点。

29. 连接点

  • 被拦截到的点。因 Spring 只支持方法类型的连接点,在 Spring 中连接点指的就是被拦截到的方法,实际上连接点还可是字段或者构造器。

30. Spring 的通知

  • 通知是个在方法执行前或执行后要做的动作,实际上是程序执行时要通过 SpringAOP 框架触发的代码段。
Spring 切面可应用五种类型的通知:
  1. before:前置通知,在一个方法执行前被调用。
  2. after: 在方法执行之后调用的通知,无论方法执行是否成功。
  3. after-returning: 仅当方法成功完成后执行的通知。
  4. after-throwing: 在方法抛出异常退出时执行的通知。
  5. around: 在方法执行之前和之后调用的通知。

31. 切点

  • 切入点是一个或一组连接点,通知将在这些位置执行。可通过表达式或匹配的方式指明切入点。

32. 目标对象

  • 被一个或者多个切面所通知的对象。它通常是一个代理对象。也指被通知(advised)对象。

33. 代理

  • 代理是通知目标对象后创建的对象。从客户端的角度看,代理对象和目标对象是一样的。

34. 织入

  • 织入是将切面和到其他应用类型或对象连接或创建一个被通知对象的过程。
  • 织入可以在编译时,加载时,或运行时完成。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值