Sping第一篇
一、Spring概述
Spring是当前主流的JavaWeb开发框架,它是为了解决企业应用开发的复杂性问题而产生的。对于一个Java开发者来说,掌握Spring框架的使用,已是其必备的技能之一。
二、Spring简介
Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。
Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
- 目的:解决企业应用开发的复杂性。
- 功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能。
- 范围:任何Java应用。
它是一个容器框架,用来装javabean (java对象), 中间层框架 (万能胶)可以起一个连接作用,比如说把Struts和hibernate粘合在一 起运用。简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
在实际开发中,通常服务器端在采用三层体系架构,分别为表示层(Web)、业务逻辑层(Service)、持久层(Dao),Spring对每一 层都提供了技术支持。 - 表示层:在表示层提供了与Struts等框架的整合。
- 业务逻辑层:在业务逻辑层可以管理事务、记录日志等。
- 持久层:在持久层可以整合Hibernate、 JdbcTemplate等技术。
三、Spring框架优点
- 使用Spring的IOC容器,将对象之间的依赖关系交给Spring,降低组件之间的耦合性,让我们更专注于应用逻辑。
- 可以提供众多服务,事务管理,WS等。
- AOP的很好支持,方便面向切面编程。
- 对主流的框架提供了很好的集成支持,如hibernate,Struts2,JPA等 。
- SpringDI机制降低了业务对象替换的复杂性。
- Spring属于低侵入,代码污染极低。
- Spring的高度可开放性,并 不强制依赖于Spring,开发者可以自由选Spring部分或全部。
四、Spring框架的体系结构
Spring框架采用的是分层架构,它一系列的功能要素被分成20个模块。
4.1 核心模块(CoreContainer)
Spring核心模块包含有Core、Beans、Context和Expression Language四个小模块。其中,Core和Beans是整个Spring框架基础部分,也是Spring的核心依赖注入oC与DI的最基本实现,Spring的其他模块大多依赖这两个功能。
- spring-core:其他模块的基础核心,包含Spring框架的核心工具类,Spring其他模块都要使用该包里面的类。
- spring-beans:Spring定 义bean的支持,负责访问配置文件、创建和管理bean,支持依赖注入和控制反转的相关操作。传说中的bean工厂类就在这个jar包中。
- spring-context:spring运行时容器,在Core和Beans的基础上,提供对Spring的上下文支持,ApplicationContext是该包的关键,通过它,可以方便快捷的取出依赖注入的Bean。
- spring-expression:spring表达式语言,帮助Spring在运行时查询和操作对象。支持设置 / 获取对象的属性值,方法的调用。
4.2 AOP模块
- spring-aop:对于代理AOP的支持。
- spring- Aspects:对于Aspect的AOP支持。
4.3 Web模块
- spring-web:提供基础的web功能,在Web项目中提供Spring的容器。
- spring-webmvc:提供基于Servlet的SpringMVC。
- Spring-WebSocket:提供WebSocket功能。
- spring-webmvc- portlet:提供portlet的支持。
4.4 数据库模块
- spring-jdbc:提供jdbc访问数据库的支持,包含了Srping对数据库访问操作进行封装的所有类,它提供了一个JDBC的抽象层,从而实现对其他厂商的支持。
- spring-tx:提供对事物的支持。
- spring-orm:提供对象关系-映射的支持,使得Spring可 以方便的整合其他第三方ORM库如JAP、Mybatis、 Hibernate等。
- spring-oxm:提供对象xml映射支持。
- spring-jms:提供对java消息服务的支持。
4.5 Spring的下载及目录结构
Spring开发所需的jar包分为两个部分:Spring框架包和第三方依赖包。
4.5.1 Spring框架包
下载地址:https://repo.spring.io/simple/libs-release-local/org/springframework/spring/
在libs目录中有四个Spring的基础包,分别对应Spring核心容器的四个模块。
- spring-core-4.3.6.RELEASE.jar
包含Spring框架的核心工具类,Spring其 它组件都要用到这个包里的类。 - spring-beans-4.3.6.RELEASE.jar
所有应用都要用到的JAR包,它包含访问配置文件、创建和管理Bean以及进行控制反转或者依赖注入操作相关的所有类。 - spring-context- 4.3.6.RELEASE.jar
提供了在基础IoC功能上的扩展服务,还提供了许多企业级服务的支持。 - spring-expression-4.3.6.RELEASE.jar
定义了Spring的表达式语言。
4.5.2 第三方依赖包
在使用Spring开发时,除了要使用自带的JAR包外,Spring的 核心容器还需要依赖commons.logging的JAR包。
下载地址:http://commons.apache.org/proper/commons-logging/download_logging.cgi
五、Spring的核心容器
Spring容器会负责控制程序之间的关系,而不是由程序代码直接控制。Spring为我们提供了两种核心容器,分别为BeanFactory和ApplicationContext。
5.1 BeanFactory(不常用)
创建BeanFactory实例时,需要提供Spring所管理容器的详细配置信息,这些信息通常采用XML文件形式来管理,其加载配置信息的语法如下:
5.2 ApplicationContext
ApplicationContext是BeanFactory的子接口,是另-种常用的Spring核心容器。它由org.springframework context.ApplicationContext接口定义,不仅包含了BeanFactory的所有功能,还添加了对国际化、资源访问、事件传播等方面的支持。创建ApplicationContext接 口实例,通常采用两种方法,具体如下:
5.2.1 ClassPathXmlApplicationContext
5.2.2 FileSystemXmlApplicationContext(不常用)
在Java项目中,会通过ClassPathXmlApplicationContext类来实例化
ApplicationContext容器。而在Web项目中,ApplicationContext容 器的实例化工作会交由Web服务器来完成。
Web服务器实例化ApplicationContext容器时,通常会使用ContextL oaderListener来实现,此种方式只需要在web.xml中添加如下代码:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:spring/applicationContext.xml
</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
创建Spring容器后,就可以获取Spring容器中的Bean。Spring获取 Bean的实例通常采用以下两种方法:
- Object getBean(String name)
根据容器中Bean的id或name来获取指定的Bean,获取之后需要进行强制类型转换。 - < T >T getBean(Class< T > requiredType)
根据类的类型来获取Bean的实例。由于此方法为泛型方法,因此在获取Bean之后不需要进行强制类型转换。
六、小提示
BeanFactory 和 ApplicationContext 两种容器都是通过XML文件配置和加载Bean的。二者的主要区别在于,如果Bean的一个属性没有注入,使用BeanFactory加载后,在第一-次调用getBean()方法时会抛出异常,而ApplicationContext则在初始化时自检,这样有利于检查所依赖的属性是否注入。因此,在实际开发中,通常优先使用ApplicationContext,而只有在系统资源较少时,才考虑使用BeanFactory。
七、总结
以上内容是我目前正在学习Spring做的笔记,在此过程中也有理解以及记录得不到位。如有错误之处,欢迎大家指正,随着知识的存储,以后会对内容进行补充和完善。 转载请申明原文地址,希望大家支持,谢谢