精通Spring4.x 第一章 Spring概述

认识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文档目录,实在没有记住这个网址就是了,个人觉得浏览器阅读反而美观方便一点 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值