[原创]Spring教程01--Spring开始篇_Hellow

作者: weir_will | 来源:发表于2018-01-20 16:42 被阅读198次

    开始之前

    在写这篇文章的时候;自己其实很犹豫;因为这个Spring的教程网上的教程也有很多。但是个人希望自己可以在底层尽量的详细的总结一下;关于Spring的教程个人目标主要是底层的学习;可能这个是一个艰难的开始;期间可能有些错误,希望大家一同讨论。

    概叙

    Spring的简介:

    Spring FrameWork目前已经发布Spring5.0了;Spring框架是一个全功能栈(full-stack)的应用程序框架。

    Spring 的特点:

    • 轻量级:相较于EJB容器,Spring采用的IoC容器非常的轻量级,基础版本的Spring框架大约只有2MB。Spring可以让开发者们仅仅使用POJO(Plain Old Java Object,相对于EJB)就能够开发出企业级的应用。这样做的好处是,你不需要使用臃肿庞大的 EJB容器(应用服务器),你只需要轻量的servlet容器(如Tomcat)。尤其在一些开发当中,很稀缺内存和CPU资源时,采用Spring比EJB无论是开发还是部署应用都更节约资源。
    • 控制反转(IOC):Spring使用控制反转技术实现了松耦合。依赖被注入到对象,而不是创建或寻找依赖对象。
      面向切面编程(AOP): Spring支持面向切面编程,同时把应用的业务逻辑与系统的服务分离开来。
    • MVC框架:Spring MVC是一个非常好的MVC框架,可以替换其他web框架诸如Struts。
      集成性:Spring非常容易和其他的流行框架一起集成开发,这些框架包括:ORM框架,logging框架,JEE, Quartz,以及Struts等表现层框架。
    • 事务管理:Spring强大的事务管理功能,能够处理本地事务(一个数据库)或是全局事务(多个数据,采用JTA)。
      模块分离:Spring框架是由模块构成的。虽然已经有太多的包和类了,但它们都按照模块分好类了,你只需要考虑你会用到的模块,而不用理其他的模块。
    • 异常处理:由于Java的JDBC,Hibernate等API中有很多方法抛出的是checked exception,而很多开发者并不能很好的处理异常。Spring提供了统一的API将这些checked exception的异常转换成Spring的unchecked exception。
    • 单元测试:Spring写出来的代码非常容易做单元测试,可以采用依赖注射(Dependency Injection)将测试的数据注射到程序中。

    Spring的历史

    直接文章发布已经更新到SpringFramwork5.0;如果你想看其他版本的特性推荐《Spring历史版本变迁和如今的生态帝国》参考博文

    • JDK更新
      Spring Framework 5.0 原来是计划在 Java 9 之上发行的;现在,框架的最低要求是 Java 8。
    • 核心框架修正
      基于Java 8 所引入的新特性进行了修订:
    • 基于 Java 8 的反射增强, Spring Framework 5.0 中的方法参数可以更加高效的进行访问。
    • 核心的 Spring 接口现在提供基于Java 8 的默认方法构建的选择性声明。
    • @Nullable 和 @NotNull 注解来显示表明可为空的参数和以及返回值。这样就够在编译的时候处理空值而不是在运行时抛出 NullPointerExceptions

    基于日志记录方面:

    • Spring Framework 5.0 带来了 Commons Logging 桥接模块的封装, 它被叫做 spring-jcl 而不是标准的 Commons Logging。当然,无需任何额外的桥接,新版本也会对 Log4j 2.x, SLF4J, JUL ( java.util.logging) 进行自动检测。
    • 核心容器更新

    Spring Framework 5.0 现在支持候选组件索引作为类路径扫描的替代方案。该功能已经在类路径扫描器中添加,以简化添加候选组件标识的步骤。
    可以在 Spring 的 Jira上了解更多关于组件索引的相关信息

    • 含Kotlin在内的函数式编程

    引入了对 JetBrains Kotlin 语言的支持。Kotlin 是一种支持函数式编程编程风格的面向对象语言。Kotlin 运行在 JVM 之上,但运行环境并不限于 JVM。

    笔者对于Kotlin语言不是很熟悉;不做过多的评价。

    • 响应式编程模型

    Spring 发行版本的一个激动人心的特性就是新的响应式堆栈 WEB 框架。这个堆栈完全的响应式且非阻塞,适合于事件循环风格的处理,可以进行少量线程的扩展。

    后续针对这个做个专题的探讨;Spring WebFlux

    • 测试改进

    Spring Framework 5.0 完全支持 JUnit 5 Jupiter,所以可以使用 JUnit 5 来编写测试以及扩展。此外还提供了一个编程以及扩展模型,Jupiter 子项目提供了一个测试引擎来在 Spring 上运行基于 Jupiter 的测试。
    另外,Spring Framework 5 还提供了在 Spring TestContext Framework 中进行并行测试的扩展。
    针对响应式编程模型, spring-test 现在还引入了支持 Spring WebFlux 的 WebTestClient 集成测试的支持,类似于 MockMvc,并不需要一个运行着的服务端。使用一个模拟的请求或者响应, WebTestClient 就可以直接绑定到 WebFlux 服务端设施

    • 库支持

    Spring Framework 5.0目前支持以下升级库的版本 :

    • Spring Framework 5.0目前支持以下升级库的版本 :
    • Jackson 2.6+
    • EhCache 2.10+ / 3.0 GA
    • Hibernate 5.0+
    • JDBC 4.0+
    • XmlUnit 2.x+
    • OkHttp 3.x+
    • Netty 4.1+
    • 中止支持

    在 API 层面,Spring Framework 5.0 不再支持以下包:

    • beans.factory.access
    • jdbc.support.nativejdbc
    • spring-aspects 模块的 mock.staticmock
    • web.view.tiles2M.(最低要求 Tiles 3)
    • orm.hibernate3 和 orm.hibernate4.

    目前 Hibernate 5 是支持的框架。

    • Portlet.
    • Velocity.
    • JasperReports.
    • XMLBeans.
    • JDO.
    • Guava.
      如果你正在使用任何上面的包,建议你将 Spring Framework 版本维持在 4.3.x。

    快速开始

    Spring官方其实推荐使用SpringBoot构建Spring框架程序,但是这里重点关注Spring的框架的内容;所以这里使用Spring框架搭建;后期有机会搭建SpringBoot的教程和资料。

    开发环境

    • eclipse或者IDEA
    • JDK8(推荐)/7
    • Spring Framwork5

    开始

    1. 构建Maven的工程;工程目录如下:

    2. 使用注解方式的Helloworld:

    pom.xml文件:

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
    </dependencies>
    

    hello/MessageService.java

    package hello.annotation;
    
    public interface MessageService {
        String getMessage();
    }
    

    hello/MessagePrinter.java

    package hello.annotation;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    @Component
    public class MessagePrinter {
    
        final private MessageService service;
    
        @Autowired
        public MessagePrinter(MessageService service) {
            this.service = service;
        }
    
        public void printMessage() {
            System.out.println(this.service.getMessage());
        }
    }
    

    hello/Application.java

    package hello.annotation;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.annotation.*;
    
    @Configuration
    @ComponentScan
    public class Application {
    
        @Bean
        MessageService mockMessageService() {
            return new MessageService() {
                public String getMessage() {
                  return "Hello World!";
                }
            };
        }
    
      public static void main(String[] args) {
          ApplicationContext context = 
              new AnnotationConfigApplicationContext(Application.class);
          MessagePrinter printer = context.getBean(MessagePrinter.class);
          printer.printMessage();
      }
    }
    
    1. 使用xml文件配置:
      applicationContext.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    
       <bean id="MessageService" class="hello.xml.MessageService">
           <property name="message" value="Hello World!"/>
       </bean>
    </beans>
    

    MessageService.java

    package hello.xml;
    
    public class MessageService {
        private String message;
    
        public String getMessage() {
            return message;
        }
    
        public void setMessage(String message) {
            this.message = message;
        }
    
    }
    

    Application.java

    package hello.xml;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class Application {
        public static void main(String[] args) {
            ApplicationContext application = new ClassPathXmlApplicationContext("applicationContext.xml");
            MessageService messageService = application.getBean(MessageService.class);
            System.out.println(messageService.getMessage());
        }
    }
    
    

    4.运行结果:

    运行结果

    简要讲解:

    1. 根据配置文件获知配置类初始化ApplicationContet容器
    2. 根据配置注入Bean对象(MessageService)
    3. 容器实例化动态创建Bean对象
      其实上述的;底层使用工厂的创建模式;Spring容器统一创建管理Java的Bean对象;关于这个具体的分析后续具体讲解。

    参考资料:


    相关文章

      网友评论

        本文标题:[原创]Spring教程01--Spring开始篇_Hellow

        本文链接:https://www.haomeiwen.com/subject/dzutaxtx.html