Spring

每天读点Spring(2)--Start

August 12, 2017
Java, Spring, Maven

在本章中,作者开篇就讲到,学习一个新的开发工具最难的就是不知道从哪里入手,尤其是Spring这样有很多选择的框架。但是幸好在这本书中是简单的,下面介绍一些必要的基本知识。 这就是很人性的化的写技术书籍的方式,透露出考虑之周到。 我觉得很多时候,国内的教育体制总是要用比人家多的时间去学会一个东西。很多人看到老外中学成绩都很差,到了大学才开始学习。但是仔细想一下就会发现不太对劲,为什么人家学习的深度比我们还深呢?明明没有我们的基础好,也没有我们花费的时间多啊。 我觉得很大一部分原因是国内的教材有问题。很多教材都是非常的笼统的介绍一个东西是什么,然后就搬上一大堆理论出来证明。但是让人看了很费劲,因为我不一定就具备了看懂这个知识的基础能力,可能我要先去了解一下什么东西再来看这个会效果更好。在我看的很多国外工程师写的文档或者是书中,都有这样的设定,要么会给出在你继续往下看之前你需要去了解的知识清单,要么就直接把需要的知识写在正式内容之前。这是一个非常负责的行为,在人家眼里是很正常的事情,在我们这里可能就是不在我的工作范围中。就像初中上高中的时候,初中老师说这个你们在以后上高中就知道了,高中老师说,你们应该在初中就学过了。有些老师会讲,这些老师的学生就会很轻松的就掌握这部分东西。 不要觉得什么都要别人告诉你很low,学习就是一个这样的过程,你需要别人不断的告诉你一些东西,那些已经被解决的问题不是你主要要解决的问题,而是你要快速掌握的理论。你在学车的时候如果碰到一个什么都不教,直接让你把车开起来上路的师傅,你就会说:“如果我什么都知道还要来学嘛?”,就是这个道理。 国内很多作者纯粹就是急于求成,这些看似不是自己的责任的事情就不做,默认你会。然后把那些确实是核心的问题官方的表述一下,就算是写完了一本技术著作。很不厚道,我作为学生非常鄙视这样的人。 需要具备的知识 # 也不能算是知识,是关于Spring的一些更细节的信息,和设计。 理解Spring的包 # 这部分介绍了Spring是由哪些模块构成,你可以按照自己的需求选择使用那些模块,并介绍了每个模块的基本功能。 在Spring4.0.2发行版中一共有20个包。每个模块的包名格式如下,以aop为例:spring-aop-4.0.2.RELEASE.jar Jar File Description aop 如果你要用到AOP功能,或是你用到的Spring的其他模块用到了这个功能,你就需要把这个包添加进你的项目中 aspects 如果你用到了AspectJ AOP的功能就要包含这个包(Aspectj是Eclipse出的一个AOP的编程框架,Spring 兼容了它) bean 包含了所有用来实现Spring控制bean的类,其中很多类也都支持Spring的bean工程模式,例如解析xml和注解的类 context 这个包给Spring core提供了很多扩展能力,Spring的很多功能都依赖于此,并且实现交互的脚本语言也是集成在其中的 context-support 这个包有扩展了context的功能,例如邮件支持、模板引擎例如Velocity、FreeMaker,此外还有很多作业的执行和调度,例如CommonJ(计时器)和Quartz(作业调度)都打包在这里。 core 这是你必须包含的包,其中的类被用在很多其他的包中,并且有一些全局工具你也可以用在自己的代码中 expression 这个包是支持Spring Expression Language的,是一种强大而简洁的装配Bean的方式 instrument 这个模块包括Java虚拟机的引导(翻译有待确认)?当你在使用AspectJ时需要使用这个包 instrument-tomcat JVM Bootstrapping in the tomcat-server jdbc 数据库链接操作相关 messaging 是基于消息的应用相关的,以及支持STOMP消息文本协议 orm 扩展了JDBC,支持ORM框架,诸如Hibernate、JDO、JPA oxm 支持Object/XML Mapping (OXM) test 提供了强大的单元测试的功能,紧密集成了JUnit tx 支持分布式事物操作 web web功能的核心,支持了文件上传,参数解析等 web-mvc 支持MVC模式的web web-portlet 门户网站服务器部署支持(Not know) websocket 支持Java API for WebSocket(Not know) 随后讲了你可以用maven获取这些,就像你不知道maven一样 ...

每天读点Spring(1)--Introduction

August 11, 2017
Java, Spring

Java如果没有Spring,绝不会这么流行。 Spring将很多Java的设计模式框架化,使得Java的开发效率得到很大的增长。 想系统的学习一下Java,但是又要与工作接轨,所以就选择了Spring这个中间的角色来开始学习。我学习的教材主要是英文版的《Pro Spring 4》,这本书在CSDN上有pdf版本,不是影印版,非常优质。 为什么不用中文的呢,一个是因为中文的书中在Introduction上就写得不好,无法从宏观上去解释这个框架的精髓,这个很致命,想比较外文版的读物,虽然偏长了一些,但是很对概念能够很清晰的表述,对于我这样的技术新人来说很重要。另一个原因是,本身的英语能力没有场景去使用,看看英文的技术专业书籍,有利于英语能力也更有利于以后看英文的代码注释。 每天坚持看一点,是个很难的工作。 What is Spring. # 在第一章中对Spring这个项目本身做了一些介绍。包括这个项目是在Java一片火热的情况下诞生的,并且诞生至今非常的优秀等等。 我觉得最重要的是,作者解释了什么是轻量级这个问题。 所谓轻量级并不是代码量很少也不是代码的框架设计很简单,而是一种传达除了Spring这个框架自己的思考哲学,就是让Java项目变得轻量化起来。 随后介绍了Spring项目的两个最重要的技术基础,IOC(控制反转)或者在文中着重讲述的DI(依赖注入)的说法。在前面的文章中我已经介绍过这个概念,在设计模式上属于工厂模式的一种实现。还有一个就是AOP(面向切面编程),也有人理解为面向方便编程。 除了这两个重要的技术基础以外,介绍了Spring框架本身有非常多的方便的设计,兼容非常多的东西,在数据交互、xml、交互式脚本语言等方面都做了很多的工作,并且引起Java标准基金会的注意,影响了基金会的很多标准的制定等。 介绍就是要这样,从宏观上去提纲挈领的介绍一个事物。

spring-shell

August 10, 2017
Java, Spring

这是一个spring框架提供的编写shell命令的一个工具,能够让你用spring的编程模式编写命令支持在shell运行。 看一下这个工具的框架是怎么样的。documentation地址。 核心组件 # spring shell 的最核心的组件是三个:plugin model、built-in commands and converters。 Plugin Model # 插件模块我理解的就是将你写的命令加载进去。你的每个jar模块都要包含一个文件:META-INF/spring/spring-shell-plugin.xml。这个文件会在shell启动的时候被加载并生成Spring的上下文。 在这个文件里你需要定义你的命令相关的类。当然你也可以用spring的扫描功能去自己扫描一个包,然后自己将相关的类进行加载。 这个文件可以写成这样: <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"> <context:component-scan base-package="org.springframework.shell.samples.helloworld.commands" /> </beans> 这里官方的文档说:所有的类都是用同一个类加载器加载的,所以建议提供一个类加载器进行隔离。 这些命令是Spring组件,使用@Component注解进行划分。例如,HelloWorldCommands类的示例应用程序是这样的 @Component public class HelloWorldCommands implements CommandMarker { // use any Spring annotations for Dependency Injection or other Spring // interfaces as required. @CliCommand(value = "delete-group", help = "delete group") public String deleteGroup(@CliOption(key = {"id"}, mandatory = true, help = "The id of " + "the group") final String id) { ClientResponse response = RestClient. ...

SpringMVC

August 2, 2017
Java, Spring, Web, MVC

本文是我的学习过程,但是我认为学习过程中并不适合写给别人看。所以本文只是一个临时的笔记,待以后进行深入整合。 SpringMVC与Spring的关系是什么? SpringMVC是依托Spring框架开发的一个Web MVC框架,天生与Spring集成,也就是使用了Spring的依赖注入和切面编程。 上一篇中讲解了Web.xml,这是Java Web的基础,也就是Servlet容器的工作方式,那个也作为本文的基础。 SpringMVC整体可以看成是一个Servlet,事实上它就是一个Servlet。我们配置web.xml来启动这个Servlet,然后这个Servlet来负责处理每个请求。每个处理请求的类都是我们遵照SpringMVC的格式来写的类,由SpringMVC这个框架来调用完成整个请求的处理。 与原本粗放的原生Java Web的开发模式相比,做了一个聚合。原本是每个请求你都写一个Servlet去处理,在web.xml中配置好一个请求与处理类的映射关系,由容器来完成调用。然后SpringMVC是分担了容器的压力,将容器的工作交给他来做,它利用Spring框架的依赖注入的特性,以及bean的工厂模式重新实现后端的实际处理流程。 有好处也有坏处,我也不太清楚这样做的具体目的是什么,可能会有性能上的提升,因为毕竟工厂模式等特性的加入会提升一些性能和开发便利。坏处感觉也挺明显,首当其冲就是学习栈又深了,还不是深了一个单位是好几个单位。加入了新的配置等,开发过程的脑力成本又增加了。 多说也没用,也是要以后逐步深入才能参透其中的奥妙。 maven 配置项目 # 命令行使用mvn构建项目很简单。 mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DarchetypeVersion=1.0 -DgroupId=com.demo -DartifactId=demo -Dversion=1.0 生成的目录如下: . ├── pom.xml └── src └── main ├── resources └── webapp ├── index.jsp └── WEB-INF └── web.xml 配置一下项目所需依赖关系pom.xml: <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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.demo</groupId> <artifactId>demo</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>demo Maven Webapp</name> <url>http://maven.apache.org</url> <properties> <jdk.version>1.8</jdk.version> <spring.version>4.3.9.RELEASE</spring.version> <jstl.version>1.2</jstl.version> <servletapi.version>3.1.0</servletapi.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org. ...

spring

July 28, 2017
Java, Spring

这篇文章原本是要完整的讲SpringMVC,现在觉得Spring自己要单独讲一下,SringMVC要单独写个瞎搞教程,混在一起不利于理解,而且写的太乱,所以本问只是介绍一些Spring的特性和一些概念。 Spring 是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。 之前在学习Spring框架的时候主要研究了两个概念,一个是:控制反转(IOC),还有一个是:面向切面编程(AOP)。今天来整理一下。 Spring 模块 # 学习框架或是其他的库,先概览一下这个东西是由什么组成,然后顺着这个设计思路就可以理解其工作方式。 据说Spring的模块化做的很好,每个模块都可以单独存在。下面这附图很直观的描述了其体系结构。 分两层,共7个模块,其他模块工作在Core模块之上。 每个模块的功能如下: 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。 Spring Context:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。 Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向切面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。 Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。 Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。 Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。 Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。 就这一段我copy过来的东西就有很多新鲜的东西。解释一下: 工厂模式和bean 这个东西就很大,简单说,工厂模式是一种设计模式。程序设计,搞到现在终于体会到什么是程序设计了吧。跟工业革命是一个道理,从手工作坊到工厂生产。这种设计模式无非就是要简化你写代码的过程,而这个工厂模式就是用来简化对象创建过程的一个设计模式。 在创建一个复杂对象的时候,往往我们要先建一些辅助对象,然后把辅助对象塞进去才能把对象真正new出来。这就是传统手工生产。 但是工厂模式也不是就那么简单的,这个工厂模式还有一个发展过程 ...