小马哥 Spring编程思想笔记

 

 

Spring Framework

1. 课前准备

2. Spring 特性总览

  1. 核心特性
    1. IOC 容器(IoC Container)
    2. Spring 事件(Events)
    3. 资源管理(Resources)
    4. 国际化(i18n)
    5. 校验(Validation)
    6. 数据绑定(Data Binding)
    7. 类型转换(Type Conversion)
    8. Spring 表达式(Spring Express Language)
    9. 面向切面编程(AOP)
  2. 数据存储(Data Access)
    1. JDBC
    2. 事务抽象(Transactions)
    3. DAO支持(DAO Support)
    4. O/R映射 (O/R Mapping)
    5. XML 编列(XML Marshalling)
  3. Web 技术
    1. Web Servlet 技术栈
      1. Spring MVC
      2. WebSocket
      3. SockJS
    2. Web Reactive 技术栈
      1. Spring WebFlux
      2. WebClient
      3. WebSocket
  4. 技术整合(Integration)
    1. 远程调用(Remoting)
    2. Java消息服务(JMS)
    3. Java连接架构(JCA)
    4. Java管理扩展(JMX)
    5. Java邮件客户端(Email)
    6. 本地任务(Tasks)
    7. 本地调度(Scheduling)
    8. 缓存抽象(Caching)
    9. Spring测试(Testing)
  5. 测试(Testing)
    1. 模拟对象(Mock Objects)
    2. TestContext 框架(TestContext Framework)
    3. Spring MVC 测试(Spring MVC Test)
    4. Web 测试客户端 (WebTestClient)

3. Spring 版本特性

Spring Framework版本 Java标准版 Java企业版
1.x 1.3+ J2EE 1.3+
2.x 1.4.2+ J2EE 1.3+
3.x 5+ J2EE1.4 和 Java EE 5
4.x 6+ Java EE6 和7
5.x 8+ Java EE7

4. Spring 模块化设计

  1. spring-aop
  2. spring-aspects
  3. spring-context-indexer
  4. spring-context-support
  5. spring-context
  6. spring-core
  7. spring-expression
  8. spring-instrument
  9. spring-jcl
  10. spring-jdbc
  11. spring-jms
  12. spring-messaging
  13. spring-orm
  14. spring-oxm
  15. spring-test
  16. spring-tx
  17. spring-web
  18. spring-webflux
  19. spring-webmvc
  20. spring-websocket

5. Spring 对Java语言特性运用

  1. Java 5语法特性

    语法特性 Spring支持版本 代表实现
    注解(Annotation) 1.2+ @Transactional
    枚举(Enumeration) 1.2+ Propagation
    for-each 语法 3.0+ AbstractApplicationContext
    自动装箱(AutoBoxing) 3.0+  
    泛型(Generic) 3.0+ ApplicationListener
  2. Java 6 语法特性

    语法特性 Spring 支持版本 代表实现
    接口 @Override 4.0+  
  3. Java 7语法特性

    语法特性 Spring 支持版本 代表实现
    Diamond语法 5.0+ DefaultListableBeanFactory
    try-with-resources 语法 5.0+ ResourceBundleMessageSource
  4. Java 8语法特性

    语法特性 Spring 支持版本 代表实现
    Lambda语法 5.0+ PropertyEditorRegistrySupport

6. Spring 对JDK API 实践

  1. 小于(<) Java 5 API

    API类型 Spring 支持版本 代表实现
    反射(Reflection) 1.0+ MethodMatcher
    Java Beans 1.0+ CachedIntrospectionResults
    动态代理(Dynamic Proxy) 1.0+ JdkDynamicAopProxy
  2. Java 5 API

API类型 Spring 支持版本 代表实现
XML处理(DOM,SAX…) 1.0+ XmlBeanDefinitionReader
Java管理扩展(JMX) 1.2+ @ManagedResource
Instrumentation 2.0+ InstrumentationSavingAgent
并发框架(J.C.U) 3.0+ TreadPoolTaskScheduler
格式化(Formatter) 3.0+ DateFormatter
  1. Java 6 API

    API类型 Spring 支持版本 代表实现
    JDBC4.0(JSR221) 1.0+ jdbcTemplate
    Common Annotations(JSR 250) 2.5+ CommonAnnotationBeanPostProcessor
    JAXB2.0(JSR222) 3.0+ Jaxb2Marshaller
    Scripting in JVM(JSR269) 4.2+ StandardScriptFactory
    可插拔注解处理API(JSR269) 5.0+ @Indexed
    Java Compiler API(JSR199) 5.0+ TestCompiler(单元测试)
  2. Java 7 API

    API类型 Spring 支持版本 代表实现
    Fork/Join框架(JSR166) 3.1+ ForkJoinPoolFactoryBean
    NIO2(JSR203) 4.0+ PathResource
  3. Java 8 API

    API类型 Spring 支持版本 代表实现
    Date and Time API(JSR310) 4.0+ DateTimeContext
    可重复Annotations(JSR337) 4.0+ @PropertySources
    Stream API(JSR335) 4.2+ StreamConverter
    ConpletableFuture(J.U.C) 4.2+ CompletableToListenableFutureAdapter

7. Spring 对 Java EE API 整合

  1. Java EE Web技术相关

    JSR规范 Spring 支持版本 代表实现
    Servlet+JSP(JSR035) 1.0+ DispatcherServlet
    JSTL(JSR052) 1.0+ JstlView
    JavaServer Faces(JSR127) 1.1+ FacesContextUtils
    PortLet(JSR168) 2.0-4.2 DispatcherPortlet
    SOPA(JSR067) 2.5+ SoapFaultException
    WebServices(JSR109) 2.5+ CommonAnnotationBeanPostProcessor
    Websocket(JSR356) 4.0+ WebSocketHandler
  2. Java EE 数据存储相关

    JSR规范 Spring 支持版本 代表实现
    JDO(JSR12) 1.0-4.2 JdoTemplate
    JTA(JSR907) 1.0+ JtaTransactionManager
    JPA(EJB3.0 JSR220的成员) 2.0+ JpaTransactionManager
    Java Caching API(JSR107) 3.2+ JCacheCache
  3. Java EE Bean技术相关

    JSR规范 Spring 支持版本 代表实现
    JMS(JSR914) 1.1+ JmsTemplate
    EJB2.0(JSR19) 1.0+ AbstractStatefulSessionBean
    Dependency Injection for Java(JSR 330) 2.5+ AutowiredAnnotationBeanPostProcessor
    Bean Validation(JSR303) 3.0+ LocalValidatorFactoryBean
  4. 资源相关

    1. JSR官方网址: https://jcp.org
    2. 小马哥JSP收藏: https://github.com/mercyblitz/jsr
    3. Spring官方文档根路径: https://docs.spring.io/spring/docs/

8. Spring 编程模型

  1. 面向对象编程
    1. 契约接口: Aware、BeanPostProcessor…
    2. 设计模式: 观察者模式、组合模式、模板模式…
    3. 对象继承: Abstract*类
  2. 面向切面编程
    1. 动态代理: JdkDynamicAopProxy
    2. 字节码提升: ASM、CGLib、AspectJ…
  3. 面向元编程
    1. 注解: 模式注解(@Component、@Service、@Respository)
    2. 配置: Environment抽象、PropertySources、BeanDefinition…
    3. 泛型: GenericTypeResolver、ResolvableType…
  4. 函数驱动
    1. 函数接口: ApplicationEventPublisher
    2. Reactive: Spring WebFlux
  5. 模块驱动
    1. Maven Artifaces
    2. OSGI Bundles
    3. Java 9 Automatic Modules
    4. Spring @Enable*

9. Spring 核心价值

  1. 生态系统
    1. Spring Boot
    2. Spring cloud
    3. Spring Security
    4. Spring Data
    5. 其他
  2. API抽象设计
    1. AOP抽象
    2. 事务抽象
    3. Environment抽象
    4. 生命周期
  3. 编程模型
    1. 面向对象编程
    2. 面向切面编程
    3. 面向元编程
    4. 面向模块编程
    5. 面向函数编程
  4. 设计思想
    1. OOP(Object-Oriented Programming)
    2. IoC/DI
    3. DDD(Domain-Driven Development)
    4. TDD(Test-Driven Development)
    5. EDP(Event-Driven Programing)
    6. FP(Functional Programing)
  5. 设计模式
    1. 专属模式
      1. 前缀模式
        1. Enable模式
        2. Configurable模式
      2. 后缀模式
        1. 处理器模式
          1. Processor
          2. Resolver
          3. Handler
        2. 意识模式
          1. Aware
        3. 配置器模式
          1. Configuror
        4. 选择器模式
          1. org.springframework.context.annotation.ImportSelector
    2. 传统GoF23
      1. 创建模式
        1. 抽象工厂(Abstract Factory)
        2. 构造器(Builder)
        3. 工厂方法(Factory Method)
        4. 原型(Prototype)
        5. 单体(Singleton)
      2. 结构模式
        1. 适配器(Adapter)
        2. 桥连(Bridge)
        3. 组合(Composite)
        4. 装饰器(Decorator)
        5. 门面(Facade)
        6. 轻量级(Flyweight)
        7. 代理(Proxy)
      3. 行为模式
        1. 责任链(Chain of responsibility)
        2. 命令(Command)
        3. 拦截器(Interpreter)
        4. 迭代器(Iterator)
        5. 调解者(Mediator)
        6. 备忘(Memento)
        7. 观察者(Observer)
        8. 状态(State)
        9. 策略(Strategy)
        10. 模板方法(Template Method)
  6. 用户基础
    1. Spring用户
      1. Spring Framework
      2. Spring Boot
      3. Spring Cloud
    2. 传统用户
      1. Java SE
      2. Java EE

10. 面试题精选

  1. 什么是 Spring Framework?

    Spring makes it easy to create Java enterprise applications. It provides everything you need to embrace the Java language in an enterprise environment, with support for Groovy and Kotlin as alternative languages on the JVM, and with the flexibility to create many kinds of architectures depending on an applications’s needs.

    Spring使创建Java企业应用程序变得容易。它提供了在企业环境中使用Java语言所需的一切,支持将Groovy和Kotlin作为JVM上的替代语言,并具有根据应用程序的需要创建多种体系结构的灵活性。

  2. Spring Framework 有哪些核心模块?

    spring-core: Spring基础API模块,如资源管理,泛型处理

    spring-beans: Spring Bean相关,如依赖查找,依赖注入

    spring-aop: Spring AOP处理,如动态代理,AOP字节码提升

    spring-context: 时间 驱动,注解驱动,模块驱动

    spring-expression: Spring表达式语言模块

  3. Spring Framework的优势和不足是什么?

    ???

11. 重新认识IoC

  1. IoC发展简介

  2. IoC主要实现策略

  3. IoC容器的职责

    1. 通用职责
    2. 依赖处理
      1. 依赖查找
      2. 依赖注入
    3. 生命周期管理
      1. 容器
      2. 托管的资源(Java Beans或其他资源)
    4. 配置
      1. 容器
      2. 外部化配置
      3. 托管的资源(Java Beans或其他资源)
  4. IoC容器的实现

    1. Java SE
      1. Java Beans
      2. Java ServiceLoader SPI
      3. JNDI(Java Naming and Directory Interface)
    2. Java EE
      1. EJB(Enterprise Java Beans)
      2. Servlet
    3. 开源
      1. Apache Avalon
      2. PicoContainer
      3. Google Guice
      4. Spring Framework
  5. 传统IoC容器实现

    1. 特性
      1. 依赖查找
      2. 生命周期管理
      3. 配置元信息
      4. 事件
      5. 自定义
      6. 资源管理
      7. 持久化
    2. 规范
      1. JavaBeans
      2. BeanContext
  6. 轻量级IoC容器

  7. 依赖查找VS依赖注入

    优劣对比

    类型 依赖处理 实现便利性 代码侵入性 API依赖性 可读性
    依赖查找 主动获取 相对繁琐 侵入业务逻辑 依赖容器API 良好
    依赖注入 被动提供 相对便利 低侵入性 不依赖容器API 一般
  8. 构造器注入VS Setter注入

  9. 面试题精选

    1. 什么是IoC?

      简单的说 IoC是反转控制,类似于好莱坞原则,主要有依赖查找和依赖注入实现

    2. 依赖查找和依赖注入的区别

      依赖查找是主动或手动的依赖查找方式,通常需要依赖容器或标准API实现.而依赖注入则是手动或者自动依赖绑定的方式,无需依赖特定的容器和API

    3. Spring作为IoC容器有什么优势

      典型的IoC管理,依赖查找和依赖注入

      AOP抽象

      事务抽象

      事件机制

      SPI扩展

      强大的第三方整合

      易测试性

      更好的面向对象

AOP

OOP与AOP区别

  1. 与OOP对比,传统的OOP开发中的代码逻辑是自上而下,在这些自上而下的过程会产生写横切性的问题,而这些横切性的问题又与我们主业务逻辑关系不大,会散落在代码的各个地方,造成难以维护.
  2. AOP的编程思想就是把这些横切性的问题和主业务逻辑进行分离,从而起到解耦的目的.

底层实现原理

AOP 具体用以下哪种代理 取决于条件
(具体条件查看源码org.springframework.aop.framework.DefaultAopProxyFactory#createAopProxy)
Java动态代理
CGLIB