目录
1.Spring的简介
Spring是一个轻量级架构【包括8大模块】
Spring 是一款用于简化企业级Java应用开发的分层开源框架,它有着请打的额扩展、融合能力,善于将各种单层框架完美的柔和在一起,并建立一个完整体系,同一、高校地构造可提供企业级服务的应用系统。
Spring是一个分层非常清晰并且依赖关系、职责定位非常明确的轻量级架构,主要分为8大模块:
数据处理块、Web块、AOP模块、Aspects模块、Instrumentation模块、Messaging模块、CoreContainer模块和Test模块,Spring依靠这些基本模块,实现了一个令人愉悦的融合了现有的解决方案的零侵入的轻量级框架。
2.Spring框架的组成图
3.模块详解
3.1Web模块
【该模块由Web、WebSocket、Servlet和Portlet等模块组成】
a.Web模块提供了面向Web开发的集成功能;
b.WebSocket模块提供了面向WebSocket开发的集成功能;
c.Servlet模块(也被称为Spring MVC模块)包含Spring的Model-View-Controller(模型-视图-控制器)和REST Web Services实现的Web应用程序。Spring MVC框架是 Domain Model代码和Web Form代码实现了完全分离,并且集成了Spring Framework的所欲功能;
d.Portlet模块:是基于Web和 Servlet模块的MVC实现。Portlet和Servlet的最大区别就是对请求的处理分为Action阶段和Render阶段。在处理一次HTTP请求时,在Action阶段处理业务逻辑响应并且当前逻辑处理会被执行多次,这样就保证了业务系统在处理同一个业务逻辑时能够进行定制性响应页面模版渲染。
3.2数据处理模块(Data Access)
【该模块由JDBC、Transactions、ORM、OXM、和JMS等模块组成】
a.JDBC模块提供了不需要编写冗长的JDBC代码和解析数据库厂商特有的错误代码的JDBC-抽象层;
b.Transactions模块支持编程和声明式事务管理;
c.ORM模块提供了流行的Object-Relational Mapping(对象-关系映射)API集成层,包含JPA、JDO和Hibernate等ORM框架,Spring对ORM的支持和封装主要体现在三方面:一致的异常处理体系结构,对第三方ORM框架抛出的专有异常进行了包装;一致的DAO抽象的支持,为每个框架都提供了模板类来简化和封装常用操作,例如:JDBCSupport、HibernateTemplate等;Spring的事务管理机制,为所有数据访问都提供了一致的事务管理;
d.OXM模块提供抽象层,用于支持Object/XML mapping(对象/XML映射)的实现,例如JAXB、Castor、XMLBeans、JIBX和XStream等。
e.JMS模块包含生产和消费信息的功能
3.3AOP模块
该模块是Spring的代理模块,也是Spring的核心模块,它巧妙地利用了JVM动态代理和CGLIB动态代理面向过程编程,来实现业务领侵入、低耦合的效果。为了确保Spring与其他AOP框架的互用性,Spring AOP模块支持基于AOP联盟定义的API,也就是Aspects模块,与SpringIOC模块相辅相成。其中,我们熟知且常用的事务管理就是利用Spring AOP模块实现的。 Spring AOP模块及Spring梁海的架构设计及扩展性,使得Spring可以融合基本上所有的模块及其他框架,成为真正的集大成者。
3.4Aspects 模块
该模块提供了与 AspectJ(一个功能请打并且成熟的面向切面编程的框架)集成,它扩展了java 语言,定义了AOP语法,持有一个专门的编译器来生成遵守Java字节编码规范的Class文件,使用字节码生成技术来实现代理。
3.5Instrumentation模块
该模块是S平日你个对其它容器的继承及对类加载器的扩展实现,其子模块Spring-instrument-tomcat实现了Tomcat Instrumentation代理功能。
3.6Messaging模块
该模块是从S平日你个集成项目中抽象出来的,类似于基于注解的Spring MVC编程模块,包含一系列消息与方法的映射注解
3.7Core Container模块
该模块是Springde 根基,由Beans、Core、Context、SpEL四个子模块组成,这四个子模块如下所述。
a.Beans 模块和Core模块提供框架的基础部分,包含IoC(控制反转)和DI(依赖注入)功能,使用BeanFactory基本概念来实现容器对Bean的管理,是所有Spring应用的核心。Spring本身的运行都是由这种Bean的核心模型进行加载和执行的,是Spring其他模块的核心支撑,是运行的根本保证。
b.Context(包含Spring-Context和Spring-Context-Support两个子模块)模块建立在Core模块和Beans模块的焦点。Spring-Context-Support模块支持集成第三方常用库到Spring应用上下文中;
c.SpEL模块提供了强大的表达式语言来查询和操作运行时的对象;
3.8Test模块
该模块支持通过组合JUnit或TestNG来进行单元测试和集成测试,并且提供了Mock Object(模仿对象)方式进行测试。在该模块中定义了注释,例如@ContextConfiguration、@WebAPPConfiguration、@ContextHierarchy、@ActiveProfiles,可以被用作元注释来创建自定义注解并避免整个测试套件的重复构造。
4.Spring的优点
(1)降低了J2EE的使用难度,并且方便集成各种框架;
(2)推荐大量使用向对象的设计思想,是以Java源码的经典框架;
(3)面向接口编程,而不是面向类编程,不断地利用Java的多态特性及良好的面向对象设计思想,来降低程序的复杂度及耦合度;
(4)提供了测试框架,并且支持继承其他测试框架,是测试更容易,对测试程序的编写也更简单、高效;
5.Spring核心思想
基本定义:
(1)IoC:控制反转:控制权从应用程序转移到框架;
(2)IoC容器:实现IoC思想的容器;
(3)DI(依赖注入):依赖注入用一个单独的对象(装配器)来装配对象之间的依赖关系
6.Spring 框架的特点
(1)轻量级;
(2)控制反转:实现松耦合---->依赖被注入到对象,而不是创建或寻找依赖对象;
(3)面向切面编程;
(4)容器:Spring包含并管理应用程序对象的配置及生命周期;
(5)MVC框架;
(6)事务管理:Spring对下至本地业务上至全局业务提供了统一的事务管理接口;
(7)异常处理:Spring提供一个方便的API将特定技术的异常(由JDBC,Hibernate,或JDO抛出)转化为一致的Unchecked异常
7.Spring IoC容器构建(构建方式有3种)
(1)基于XML配置的方式【可以开启注解配置,通过注解配置Bean和装配工作】
(2)基于Goovy脚本的方式(一般不用)
(3)基于Java Config的配置注解方式【主要通过Configuration和Bean注解】
8.Bean的实例化
(1)静态工厂方法实例化;
(2)实例工厂方法实例化;
(3)构造方法实例化;
9.Bean的依赖装配
(1)构造方法参数装配(4种方式)
在Spring中,可以使用“通过构造方法自动装配”,实际伤害是按照构造函数的参数类型以及构造方法的参数顺序自动装配。即就是如果一个bean的数据类型与其他bean的构造器参数的数据类型是相同的,那么将自动装配,如果装配过程中构造方法的参数具有歧义的时候,就需要我们指定类型,位置或中参数名的方式来告知Spring如何装配。
a)Bean 的引用;
b)根据参数类型;
c)根据参数位置;
d)根据参数名称【使用场景比较少,具有特殊限制,需要开启编译时参数名称保留,JDK1.8之前采用@ConstructorProperties注解,JDK1.8之后可以在编译的是偶添加-Parameters来确保编译之后保留参数名】;
(2)Setter方法装配
容器在抵用无参数构造方法或者工厂方法实例化Bean之后,调用Setter方法完成属性的装配
10.依赖和配置详解【3种方式】
(1)直接赋值;
针对基本类型和String类型,可以平四肢properties元素的value属性用来指定属性或者构造方法参数赋值;
(2)idref和ref元素;
在Spring中,idref和ref属性都可以用在constructor-arg元素和property元素完成装配;
idref和ref的区别:
a.idref装配的目标bean的id而不是目标bean的实例,同时使用idref容器在部署的时候还会验证这个名称的bean是否真实存在。其实idref就跟value一样,知识将某个字符串装配到属性或者构造函数中,指不过装配的是某个Bean装配的id属性值;
b.ref则是将目标bean定义的实例装配到属性或构造函数中;
(3)内部bean【一个<bean/>元素定义在<property/>和<constructor-arg>元素中】
7.其它
Colleollection
使用<list/>,<set/>,<map/>,<props>元素可以设置Java集合类型(比如:List,Set,Map,Properties)的属性和参数,在使用集合元素时如Map的key和value,集合的value可以使用【bean/ref/idref/list/set/map/props/value/null】
延迟初始化:Spring容器启动时默认将所有的Bean都初始化完成,设置延迟初始化时告诉容器在第一次使用bean时完成初作,而不是启动时【类似于ArrayList的懒加载策略】
11.Bean的作用域
Bean的作用域主要是描述一个bean实例在SpringIOC容器的存在状态
序号 | 作用域 | 描述 | 应用场景 | 备注 |
1. | singleton | 该作用域下的bean在IoC容器中只存在一个实例,所有对象对其的引用都返回同一个 | 无状态的Bean | Spring默认选择该作用域 |
2. | prototype | 每次对该作用域下的Bean的请求都会创建新的实例 | 有状态的bean | |
3. | request | 每次HTTP请求会创建新的bean实例 | 一次http的请求和响应的共享bean | 限定在SpringMVC |
4. | session | 在一个http Session中,定义一个bean实例 | 用户会话的共享bean(eg:记录一个用户的登录信息) | 限定SpringMVC中使用 |
5. | global session | 类似于http session,但吸纳与portlet web应用可用 | 所有构成某个portlet web 应用的各种不同的portlet所共享 | 限定portlet web应用,在编写一个标准的基于Servet的web应用,并且定义了一个或多个具有global session作用域的bean,http session作用域,并且不会引起任何错误 |
6. | application session | 在一个http servlet Context中,定义一个Bean实例 | web应用的上下文信息(记录一个用用的共享信息) | 限定SpringMVC中使用 |
12.基于注解配置
无论是通过XML还是注解配置,它们都是表达bean定义的载体,其本质都是为Spring容器提供bean定义的信息
Spring 容器启动成功的三大要素:
(1)bean定义信息;
(2)bean实现类;
(3)Spring本身;
12.1使用注解定义bean
@Component标识的类会被Spring容器识别,自动转为杯容器管理的bean
基于注解配置需要在XML配置文件中添加:<context:component-scan/>来告诉Spring容器开启注解bean的扫描
@Repository:用户DAO实现了进行标识
@Service:用于Service实现类进行标识
@Controller:用于Controller实现类进行标识
12.2 使用注解装配
9.2.1@Autowired自动装配
@Autowired默认是按照类型(byType)匹配的方式在容器中查找匹配的Bean,当且仅有一个匹配的bean时,Spring将其注入@Autowired标注的变量中。
9.2.2@Qualifier注入指定bean
9.2.3 @Scope ,@PostConstruct(bean初始化之后调用)@PreDestroy(bean销毁之前调用)