Spring框架是一个开放源代码J2EE应用程序框架,由Rod Johnson发起,是针对bean的生命周期进行管理的轻量级容器(lightweight container)。 Spring解决了开发者在J2EE开发中遇到的许多常见的问题,提供了功能强大IOC、AOP及Web MVC等功能。Spring可以单独应用于构筑应用程序,也可以和Struts、Webwork、Tapestry等众多Web框架组合使用,并且可以与Swing等桌面应用程序AP组合。因此, Spring不仅仅能应用于JEE应用程序之中,也可以应用于桌面应用程序以及小应用程序之中。Spring框架主要由七部分组成,分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC。 —— 百度百科

对Spring的理解

Spring Framework - 图1 对Spring 这个词的理解/对Spring框架的理解
Spring 可以是Spring公司,也可以说是Spring框架,一般开发人员口头上说的Spring指的就是Spring框架,即Spring Framework
Spring框架包含有很多内容,主要由7个部分组成:

Spring Core
Spring AOP
Spring ORM
Spring DAO
Spring Context
Spring Web
Spring Web MVC

这些都是Spring框架中具体的内容,这些具体的内容都是设计思想的产物,如Spring核心思想IoC、面向切面编程、ORM设计思想、DAO设计思想、MVC设计思想、、、

在写代码实现业务逻辑时,你最好是先有项目的架构思想、思想落地(设计产物)后才开始你的代码(产品)/

对Spring IoC的理解

IoC - Inversion of Control - 控制反转 | DI - Dependency Injection - 依赖注入

  1. IoC是一种设计思想
  2. Spring中IoC思想描述

    即控制反转思想的描述,先决条件是A类依赖B类(A控制其内部B类实例的生成),现在通过一个管理者(Spring容器)管理一个(或多个)B类实例,A类中包含的B类实例的产生不在由A类直接控制,而是通过管理者。

  3. IoC思想的目的:解耦

  4. Spring中的IoC实施方案 - Spring Bean\Spring Bean容器\Bean的注入
  5. IoC和DI是什么关系呢?由于控制反转概念比较含糊,不好理解和描述,所以2004年大师级人物Martin Fowler又给出了一个新的名字

对Spring 容器及Spring 上下文的理解

Spring容器是Spring的核心,从代码层面,Spring容器其实就是所有实现了ApplicationContext接口的类的实例的总称(我们也常把上下文说成是容器)

org.springframework.context.ApplicationContext接口(Spring 应用上下文接口)用于完成容器的配置,初始化,管理bean

Spring容器的类型

容器并不唯一,Spring容器大概分为两种类型:一种是不常用的BeanFactory,这是最简单的容器,只能提供基本的DI功能;还有一种就是继承了BeanFactory后派生而来的应用上下文,其抽象接口也就是我们上面提到的的ApplicationContext,它能提供更多企业级的服务,例如解析配置文本信息等等,这也是应用上下文实例对象最常见的应用场景

BeanFactory

接口BeanFactory(org.springframework.beans.BeanFactory),其职责是:处理Bean的初始化,定位,配置应用程序中的对象以及建立这些对象的依赖。Bean对象的依赖是通过元数据来描述。通过BeanFactoryAware类实现。比较常用的子接口为XMLBeanFactory。

ApplicationContext

接口ApplicationContext来自于org.springframework.context.ApplicationContext,继承BeanFactory,除了支持BeanFactory的功能外,还能支持企业应用的其它功能,如:事务管理,国际化支持,以及AOP集成等等。通过类ApplicationContextAware类实现。比较常用的子接口为:AbstactApplicationContext。

Spring容器的初始化过程(Bean的生成过程)

Spring核心-容器初始化过程.png

所有bean的实例化,获取,销毁等都是由Spring容器完成的。

对Spring Bean的理解

对于开发者来说,开发者使用Spring框架主要是做两件事:①开发Bean;②配置Bean(管理交给容器做了),注入Bean

Bean 生命周期


Spring Framework - 图3
Spring Framework - 图4

Bean 作用域

singleton 单例模式。默认。在整个Spring IoC容器中,singleton作用域的Bean将只生成一个实例
prototype 原型模式。每次通过容器的getBean()方法获取prototype作用域的Bean时,都将产生一个新的Bean实例
request 对于一次HTTP请求,request作用域的Bean将只生成一个实例,这意味着,在同一次HTTP请求内,程序每次请求该Bean,得到的总是同一个实例。只有在Web应用中使用Spring时,该作用域才真正有效
session 该作用域将 bean 的定义限制为 HTTP 会话。 只在web-aware Spring ApplicationContext的上下文中有效
global session 每个全局的HTTP Session对应一个Bean实例。在典型的情况下,仅在使用portlet context的时候有效,同样只在Web应用中有效

Bean Spring 配置文件

Bean 创建方式

构造器实例化

静态工厂实例化

动态工厂实例化

Bean 注入方式

构造器注入


set方法注入


静态工厂衍生注入

实例工厂衍生注入

注解衍生注入

对Spring AOP的理解

AOP - Aspect Oriented Programming - 面向切面编程
面向过程 -> 面向切面

相关专业概念

Aspect(切面) Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice
Joint point(连接点) 表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point
Pointcut(切点) 表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方
Advice(通知增强) Advice 定义了在 Pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码
Target Object(目标对象) 织入 Advice 的目标对象
AOP 动态代理 在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理
Weaving(织入) 将 Aspect 和其他对象连接起来, 并创建 Adviced object 的过程

作用

代码分离:将具体业务代码和业务无关代码分离开,解耦、减少代码重复开发工作、代码更加清晰、提高可维护性

AOP原理

实现AOP的技术,主要分为两大类:

  1. 采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;
  2. 采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码。

    动态代理

AOP与注解

对Spring MVC的理解

参考:

  1. Spring Framework https://spring.io/projects/spring-framework
  2. 技术博客-Spring容器 https://blog.csdn.net/lqzxpp/article/details/87068003
  3. 技术博客-Spring容器 https://blog.csdn.net/szwandcj/article/details/50762990
  4. 技术博客-Spring容器 https://blog.csdn.net/u014199143/article/details/80692127
  5. 技术博客-Spring容器 https://blog.csdn.net/qq_39632561/article/details/83070140
  6. 技术博客-Spring Bean https://www.cnblogs.com/zrtqsk/p/3735273.html
  7. 技术博客-Spring Bean实例化 https://www.cnblogs.com/caoyc/p/5624697.html
  8. 技术博客-Spring Bean注入方式 https://www.cnblogs.com/tuyang1129/p/12873492.html

爬虫:如何找到引用某个网站的所有网站的地址?