简介:Spring最认同的技术是控制反转的依赖注入(DI)模式。控制反转(IoC)是一个通用的概念,它可以用许多不同的方式去表达,依赖注入仅仅是控制反转的一个具体的例子。

一、Spring有七大功能模块:
1、Spring Core
Core模块是Spring的核心容器,它采用工厂模式实现了IoC模式容器(即依赖注入),提供了Spring框架的基础功能。主要组件是BeanFactory,负责对JavaBean的配置与管理。

2、Context模块
继承BeanFactory类,向框架提供上下文信息。提供了事件处理、国际化、资源装载、透明装载、数据校验等功能,还有其它企业服务功能如JNDI访问、支持EJB、远程调用、集成模板框架、E-mail、定时任务调度等功能。
其它程序可通过Context访问Spring的Bean资源(相当于资源注入)

3、AOP模块
集成了所有AOP功能,通过事务管理可使任何Spring管理的对象AOP化。提供了常用的拦截器,供用户自定义和配置。
Aspect Oriented Programming:面向切面(方面)编程
主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等。

4、DAO模块
提供了JDBC的抽象层,提供了有意义的异常层次结构,简化了数据库厂商的异常错误处理,大幅减少代码量,提供对声明式和编程式事务的支持。

5、ORM映射模块
提供对现有ORM框架的管理和支持,本身并不对ORM进行实现,仅对常见ORM框架进行封装并进行管理。

6、Web模块
建立在Spring Context基础上,提供了Servlet监听器的Context和Web应用的上下文。
对现有的Web框架提供了集成管理,能将Spring的资源注入给这些框架,并在这些框架前后插入拦截器。
简化了处理多部分请求,以及将请求参数绑定到域对象的工作。

7、MVC模块
建立在Spring核心功能上,拥有Spring框架的所有特性,适应多种模板技术,多视图,国际化和验证服务,实现控制逻辑和业务逻辑的清晰分离。是一个全功能的构建Web应用的MVC实现。
通过策略接口,MVC框架变得高度可配置,容纳了大量视图技术,包括JSP,Velocity,Tiles,iText和POI等。


二、Spring包的获取

Spring各版本jar包下载地址及common-logging.jar包下载地址参考:
https://blog.csdn.net/qq_37486501/article/details/79517815 

三、commons-logging.jar与log4j.jar区别及log4j使用:
https://blog.csdn.net/qq_27339781/article/details/80264109 

四、IOC
控制反转模式(也称作依赖性介入)的基本概念是:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器 (在 Spring 框架中是 IOC 容器) 负责将这些联系在一起。

典型的 IOC 场景中:
容器创建了所有对象,并设置必要的属性将它们连接在一起,决定什么时间调用方法,有3种实现模式:
1、服务需要实现专门的接口,通过接口,由对象提供这些服务,可以从对象查询依赖性(例如,需要的附加服务)
2、通过 JavaBean 的属性(例如 setter 方法)分配依赖性
3、依赖性以构造函数的形式提供,不以 JavaBean 属性的形式公开
【Spring 框架的 IOC 容器采用类型 2 和类型3 实现。】
注意:
1、如果JavaBean的某个属性是List集合类型或数组时,需要使用<list>标签为List集合类型或数组的每一个元素赋值。
2、<constructor-arg>标签有两个属性:
index:用于指定构造方法的参数索引,指定当前标签为构造方法的哪个参数赋值
type:指定参数类型以确定需要为构造方法的哪个参数赋值(只有当该属性在构造方法中没有相同类型时可用)

五、AOP
AOP,是一种编程技术,它允许程序员对横切关注点或横切典型的职责分界线的行为(例如日志和事务管理)进行模块化。AOP 的核心构造是方面,它将那些影响多个类的行为封装到可重用的模块中。
在 AOP 方式中,可以反过来将日志服务模块化,并以声明的方式将它们应用到需要日志的组件上。


六、ApplicationContext
扩展了BeanFactory容器,添加了对i18n,生命周期事件的发布监听等功能,提供了企业级IoC容器服务。
该接口有3个实现类:
1、ClassPathXmlApplicationContext类:从当前类路径中检索配置文件并装载它来创建容器实例
2、FileSystemXmlApplicationContext类:同上,但可获取类路径之外的资源
3、WebApplicationContext类:Web应用容器,有两种用法:
a)、Servlet的xml文件中配置ContextLoaderListener监听器
b)、Servlet的xml文件中添加一个Servlet定义要使用的ContextLoaderServlet类

在JavaBean中如果实现了ApplicationContextAware接口,那么容器会调用JavaBean的setApplicationContext()方法将容器本身注入到JavaBean中,使JavaBean包含容器的应用。

七、自动装配

https://blog.51cto.com/maplebb/2299695


八、bean的作用域和生命周期

1、singleton作用域
bean的生命周期与SpringIoC容器是一致的,该bean在容器初始化时被创建,然后将被一直保留到容器中,当容器销毁后,bean也将被销毁。通常情况下,如果不指定bean的作用域,默认将被设置成singleton作用域。
有3种方式设置singleton作用域:
<bean id="test" class="com.maple.Test"/>
<bean id="test" class="com.maple.Test" singleton="true"/>
<bean id="test" class="com.maple.Test" scope="singleton"/>

2、prototype作用域
bean会导致每次对该bean的请求都会创建一个新的bean实例。但当prototype作用域的bean被容器创建完毕,并且将实例对象返回给请求方之后,容器就不再拥有当前返回对象的引用,容器将实例对象的生命周期管理工作交给请求方负责,所以在客户端代码中必须使用bean的后置处理器清除prototype作用域的bean,该后置处理器持有要被清除的bean的引用。
有2种方式设置prototype作用域:
<bean id="test" class="com.maple.Test" singleton="false"/>
<bean id="test" class="com.maple.Test" scope="prototype"/>

说明:对所有有状态的bean都应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。
由于一个典型的dao不会持有任何会话状态,因此dao应该使用singleton作用域。

3、bean的生命周期
分为实例化、初始化、使用、销毁4个阶段。
实例化过程中,容器会按bean的定义来初始化所有属性和依赖关系。具体步骤如下:
(1)如果使用了autowire,则Spring会对bean完成自动装配
(2)通过get()和set()方法配置bean的属性
(3)如果bean实现了BeanNameAware接口,容器会调用bean的setBeanName()方法来传递bean的ID
(4)如果bean实现了BeanFactoryAware接口,容器会调用bean的setBeanFactory()方法将容器本身注入到bean中。
(5)如果容器注册了BeanPostProcessor接口的实现类,将调用该类的postProcessBeforeInitialization()方法,完成bean的预处理方法。
(6)如果bean实现了InitializingBean接口,容器会调用bean的afterPropertiesSet()方法修改bean的属性
(7)如果bean指定了init-method属性,容器会调用该初始化方法
(8)如果容器注册了BeanPostProcessor接口的实现灰,将调用该类的afterProcessAfterInitialization()方法,完成bean的后期处理方法。

关闭容器时,容器会销毁所有bean。但如果bean定制了特殊销毁方法,容器会在销毁该bean之前调用这个方法。具体如下:
(1)如果bean实现了DisposableBean接口,那么容器会在销毁该bean之前调用bean的destroy()方法。
(2)如果bean定义中指定了销毁方法,那么容器会在销毁该bean之前调用该指定方法



附一、项目应用测试中发现对象的依赖关系
XmlBeanFactory源于spring-beans.jar包
ClassPathResource源于spring-core.jar包
运行时:依赖于commons-logging.jar

DispatcherServlet源于spring-webmvc.jar包
AbstractController源于spring-webmvc.jar包,
编译时:依赖于spring-web.jar|spring-context.jar|spring-beans.jar包
运行时:还依赖于spring-core.jar|spring-aop.jar|spring-expression.jar包
运行时:依赖于commons-logging.jar


附二、String5.1版本下的包列表

spring-core.jar
spring-beans.jar
spring-aop.jar


spring-context.jar
spring-context-indexer.jar
spring-context-support.jar


spring-web.jar
spring-webmvc.jar

spring-webflux.jar
spring-websocket.jar


spring-expression.jar
spring-jcl.jar


spring-instrument.jar
spring-aspects.jar


spring-jdbc.jar
spring-orm.jar

spring-jms.jar
spring-messaging.jar
spring-oxm.jar

spring-test.jar
spring-tx.jar