认识Spring
Spring是分层的Java SE/EE应用一站式的轻量级开源框架,以IoC(Inverse of Control 控制反转)和AOP(Aspect Oriented Programming,
切面编程)为内核,提供了展现层Spring MVC,持久层Spring JDBC以及业务层事务管理等一站式的企业级应用技术。此外,还整合了开源世界的众多著名的第第三方框架和类库,逐渐成为使用最多的轻量级Java EE企业应用开源框架。
Spring的好处:
方便解耦,简化开发。通过Spring提供的IoC容器,用户可以将对象之间的依赖关系交给Spring控制,避免硬编码所造成的过度程序耦合。有了Spring,用户不必再为单例模式,属性文件解析等这些底层的需求编写代码,可以更专注于 上层的应用。
AOP编程的支持。通过Spring提供的AOP功能,方便进行切面编程,很多不容易用传统OOP实现的功能可以通过AOP轻松应对。
声明式事务的支持。在Spring中,用户可以从单调烦闷的事务管理代码中解脱出来,通过声明的方式灵活的进行事务管理,提高开发效率和质量。
方便程序的测试。可以用非容器依赖的编程方式进行几乎所有的测试工作。在Spring里,测试不再是昂贵的操作,而是随手可做的事情。
方便集成各种优秀框架。Spring提供了对众多优秀开源框架直接或间接的支持。
降低Java EE API的使用难度。Spring对很多难用的Java EE API(如JDBC,JavaMail,远程调用等)提供了一个薄层封装,通过Spring的简易封装,这些Java EE API的使用难度大大降低。
Spring体系结构
整个Spring框架按其所属功能可以划分成5个主要模块。
1.IoC
它将类与类之间的依赖从代码中脱离出来,用配置的方式惊醒依赖关系描述,由IoC容器负责依赖类之间的创建,拼接,管理,获取等工作。BeanFactory接口是Spring框架的核心接口,它实现了容器许多核心的功能。
Context模块构建于核心模块之上,扩展了BeanFactory的功能,添加了il8n国际化,Bean生命周期控制,框架事件体系,资源加载透明化等多项功能。此外,改模块还提供了众多企业级服务的支持,如邮件服务,任务调度,JNDI获取,EJB集成,远程访问等。ApplicationContext是Context模块的核心接口。
表达式语言模块是提供同意表达式语言(Unified EL)的一个扩展,该表达式语言用于查询和管理运行期的对象,支持设置/获取对象属性,调用对象方法,操作数组和集合等。此外,该模块还提供了逻辑表达式运算,变量定义等功能,可以方便地通过表达式串和Spring IoC容器进行交互。
2.AOP
AOP是继OOP之后,对编程涉及思想影响极大的技术之一。AOP是进行横切逻辑编程的思想,它开拓了考虑问题的思路。在AOP模块里,Spring提供了满足AOP Alliance(AOP联盟)的规范实现,还整合了AspectJ这种AOP语言及的框架。在Spring里实现AOP编程有众多选择。Java5.0引入了java.lang.instrument,允许在JVM启动时启用一个代理类,通过该代理类在运行期修改类的字节码,改变一个类的功能,从而实现AOP的功能。
3.数据访问和集成
仍和应用程序的核心问题都是对数据的访问和操作。Spring站在DAO的抽象层面,建立了一套面向DAO层的统一的异常体系,同时将各种数据访问的检查型异常转换成非检查型异常,为整合各种持久层框架提供基础。其次,Spring通过模板化技术对各种数据访问技术进行了薄层封装,将模式化的代码隐藏起来,使数据访问的程序得到大幅简化。这样,Spring就建立棋类和数据形式及访问技术无关的统一的DAO层,借助AOP技术,Spring提供了声明式事务的功能。
4.Web及远程操作
该模块建立在Application Context模块之上,提供了Web应用的各种工具类,如通过Listener或Servlet初始化Spring容器,将Spring容器注册到Web容器之中,该模块还提供了多项面向Web的功能,如透明化文件上传,Velocity,FreeMaker,XSLT的支持。此外,Spring可以整合Strust,WebWork等MVC框架
5.Web及远程访问
Spring自己提供了一个完整的类似于Struts的MVC框架--Spring MVC。当然Spring对Struts,WebWork等MVC框架也提供整合支持。
6.WebSocket
WebSocket提供了一个在Web应用中高效,双向的通信,需要考虑到客户端和服务器之间的高频和低时延消息的交换。
Spring4.0对Java版本的要求及新特性
Spring4.0基于Java6.0,全面支持Java8.0。运行Spring4.0必须使用Java6.0以上版本,推荐使用Java8.0及以上版本,如果要编译Spring4.0,则必须使用Java8.0。
全面支持Java8.0
Spring框架本身是由Java8.0编译器编译的,编译时使用的是生成Java 6字节码的编译命令选项,因此可以使用Java6.0,7.0或8.0来运行Spring 4.0的应用。
Java8.0编译器编译过的代码需要在Java8.0或以上的Java虚拟机上运行,由于在Spring框架中大量应用了反射机制和Asm,Cglib等函数库,必须确保这些函数库能理解Java8.0生成的新.class文件。因此,Spring将Asm,Cglib等函数库通过jarjar嵌入Spring框架中,这样就可以同时支持Java6.0,7.0和8.0的字节码而不会产生运行时错误。
Java8.0的Lambda表达式和LocalDate,LocalTime,LocalDateTime,重复注解等新特性都被在Spring4.0中提供相应支持,Java8的java.util.Optional类可以在Spring注入时使用,以表示不一定会被注入的元素,在Spring MVC框架中使用Optional来修饰参数,表示请求中该项参数是可选的。
核心容器的增强
Spring4.0对核心容器进行了增强,支持泛型依赖注入,对CgLib代理不再要求必须有空参构造器。在基于Java的配置里添加了@Description;提供@Conditional注解来实现Bean的条件过滤;提供@Lazy注解解决Bean延时依赖注入;支持Bean被注入List或者Array时可以通过@Order注解或基于Ordered接口进行排序。如果使用Spring的注解支持,则可以使用自定义注解来组合多个注解,方便对外公开特定的属性。
支持Groovy定义Bean,基于Servlet3.0开发,支持WebSocket,测试的增强,提供了对JCache注解的支持,添加了对动态语言支持,添加了多线程并发处理支持,对JDK的Future进行了封装,简化了现场回调处理;增强了持久化处理,全面支持Hibernate ORM5.0,不再支持Hibernate3.6以前版本,并去除了对iBatis的直接支持。
Spring子项目:
获取Spring
社区下载:http://spring.io/projects
Maven下载:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.smart</groupId>
<artifactId>chapter2</artifactId>
<version>1.0</version>
<name>Spring4.x第二章实例</name>
<description>Spring4.x第二章实例</description>
<packaging>war</packaging>
<dependencies>
<!-- spring 依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>${commons-dbcp.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>${servlet.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>${testng.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!-- jetty插件 -->
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.25</version>
<configuration>
<connectors>
<connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
<port>8000</port>
<maxIdleTime>60000</maxIdleTime>
</connector>
</connectors>
<contextPath>/bbs</contextPath>
<scanIntervalSeconds>0</scanIntervalSeconds>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.17</version>
<configuration>
<parallel>methods</parallel>
<threadCount>10</threadCount>
</configuration>
</plugin>
</plugins>
</build>
<properties>
<file.encoding>UTF-8</file.encoding>
<spring.version>4.2.2.RELEASE</spring.version>
<mysql.version>8.0.12</mysql.version>
<servlet.version>3.0-alpha-1</servlet.version>
<aspectj.version>1.8.1</aspectj.version>
<commons-codec.version>1.9</commons-codec.version>
<commons-dbcp.version>1.4</commons-dbcp.version>
<hibernate.validator.version>5.0.2.Final</hibernate.validator.version>
<jetty.version>8.1.8.v20121106</jetty.version>
<slf4j.version>1.7.5</slf4j.version>
<testng.version>6.8.7</testng.version>
</properties>
</project>
获取文档支持:
https://spring.io/docs/reference提供所有Spring项目的在线文档
也可以下载pdf文档方便离线阅读:
截取至红色方框部分访问就可以看到各种提供的文档了,如果没有离线文档可以查看其他版本的spring文档目录,实在没有记住这个网址就是了,个人觉得浏览器阅读反而美观方便一点