很久不弄java了, 发现现在服务端是spring的天下, 而且还号称是这货替代了万恶的ejb, 不禁有了兴趣, 研究一下
ps, 这个正在写, 可以等写完了再看.

spring是啥?

这个段落倒是不坑, 看着也挺好玩的. 主要是知乎上面写的很不错, 大家浏览下知乎, 啥都明白了.

依赖注入di

就是不要new某个元素, 因为new, 代表你了解他(不要使用继承也是同样的道理). 而是把他作为参数传进来, 一般有三种依赖注入的方式:

  1. 构造函数传入
  2. Setter传递
  3. 接口传递

这核心思路都是一样的,都是为了实现控制反转

控制反转ioc

就是初始化的地方, 如果用了依赖注入, 那么久实现了控制反转. 但是初始化要new很多东西. 这个咋办? IoC容器就解决了这个问题。

  1. 这个容器可以自动对你的代码进行初始化,你只需要维护一个Configuration(可以是xml可以是一段代码),而不用每次初始化一辆车都要亲手去写那一大段初始化的代码。这是引入IoC Container的第一个好处。
  2. IoC Container的第二个好处是:我们在创建实例的时候不需要了解其中的细节

更进一步 单测

微信公众号: 码农翻身 https://mp.weixin.qq.com/s?__biz=MzAxOTc0NzExNg==&mid=2665513179&idx=1&sn=772226a5be436a0d08197c335ddb52b8#rd

单元测试其实也呼唤依赖注入, 因为, 单测的时候, 我们可以注入一个’假的’.

官方 - DI 的正确使用方式:

  1. Spring 有自己的测试体系,我们可以直接使用
  2. Spring 的事务管理优越在哪里,和 Hibernate 自己的事务管理有啥区别,怎么配置才对。
  3. Spring 为啥提倡非侵入式(non-invasive)设计,又是从哪个版本开始这么干的,起因是什么
  4. Spring 那些注解的使用原理和适用场景是什么,哪些是Spring 自己的注解,哪些是 J2EE DI 的标准注解,使用哪个好,为什么好。
    ………..

上述的一切,Spring 官方提供了 Spring Reference ,大概 500 多页吧。

AOP

AOP用于解耦业务代码和公共服务代码(如日志,安全,事务等)。DI和AOP能够让代码更加简单,具有良好的松耦合特性和可测试性,极大地简化开发

实践一下吧

一看, 竟然有spring boot这种东西, java转性了, 也考虑正常写代码这事了. 不错不错.

spring boot

可以类比为brew, pip, rpm, npm….. 一个包依赖工具. java咋没构建出这个呢? 神奇了. https://docs.spring.io/spring-boot/docs/current/reference/html/getting-started-installing-spring-boot.html#getting-started-manual-cli-installatio

  • 第一步安装
spring --version #可以看到spring的版本
spring --help # 可以看帮助

### 如果用brew 安装, 需要
brew tap pivotal/tap  ### this command is a shortcut: tap user/repo https://github.com/user/homebrew-repo 添加了一个模块的搜索源. 
brew install springboot

### 所以我决定sdk manager安装: http://sdkman.io
curl -s "https://get.sdkman.io" | bash
### zsh应该用下面这句:
curl -s "https://get.sdkman.io" | zsh
### 之后新开窗口, 或者source一下, 否则会找不到sdk的位置.
sdk install springboot #这个就ok了.

### 如果报错sdk找不到, 那么真的就是前面发生了某些问题, 比如网络问题啥的. 这个总会出各种问题, 只能说sdkman这玩意确实不算个好工具. 需要用下面这句
source "$HOME/.sdkman/bin/sdkman-init.sh" 

### 之前我还用brew安装了gradle
brew install gradle
  • 然后,我们可以看看

猝不及防之下, 我掉了一次坑, 除了java真心没谁了.

spring help #这个可以看看help
spring init my-app #建立一个应用叫my-app
spring run my-app #有的文章要你先cd my-app, 这个建议是错的, 要在外边执行, 本质上, spring要知道你需要运行哪个文件(目录也是文件)
open http://localhost:8080  #这个可以打开浏览器看效果了.
### 然后我就看到报错了.......
### 奶奶的, 这是第一个坑....神经病啊, 不论用任何工具, 任何语言, 都不可能这样掉坑里的, java可以.  暂时不理这个坑, 三个段落之后, 会解决这个坑. 我们先解决工具问题, 不要因为工具和配置导致掉坑里.
  • 关于初始化的解释
spring init -dweb,data-jpa,h2,thymeleaf --build gradle readinglist
  • 使用Spring MVC来处理web请求,

  • 使用Thymeleaf来定义web页面,

  • 使用sping data jpa来在数据库持久化和读取数据。

  • 用H2这个嵌入式的数据库。

  • 虽然可以使用groovy语言进行开发,但是还是选择使用java来进行开发

  • 构建工具使用gradle

更简单的入门指引

http://www.tothenew.com/blog/quick-start-with-springboot-using-cli/

按照这个的说法, 弄一个first.groovy文件:

@RestController
class HelloController {
  @RequestMapping("/")
  def hello() {
    return "Hello 哇嘎嘎嘎嘎"
  }
}
spring run first.groovy # 这样就正常了
open http://localhost:8080 # 这样就看到运行结果了
spring run *.groovy  # 这样也行, 多个groovy都可以执行

### 然后我可以打个jar包.
spirng jar xxx.jar first.groovy #这样就打一个jar包, 这个jar包没有外部依赖, 依赖都打包进去了. 我打了, jar包18m.
java -jar xxx.jar # 这样就可以运行这个jar包. 我运行了. 真的可以运行, 一个tomcat的服务. 这样运行和第一句的结果一模一样: spring run first.groovy

介绍下gvm -> sdkman

groovy environment manager 终于有java的包管理工具了.
这货最终发展为sdkman

命令补全

这种地方也能遇坑, 除了java, 也是没谁了.

  • 如果使用homebrew安装, 那么命令行自动补全已经ok了.
  • 如果用sdkman, 那么要手工弄.
  • spring boot cli的安装路径下有两个命令补全脚本, 一个给bash, 一个给zsh. 位置在 ~/.sdkman
# 命令行自动补全:
# 据说可以直接执行: 
. ~/.sdkman/candidates/springboot/current/shell-completion/zsh/_spring
# 然后就报错了.
#据说也可以source, 在~/.zshrc里面添加这句
source /Users/bergman/.sdkman/candidates/springboot/1.5.7.RELEASE/shell-completion/zsh/_spring # 这个地方记得把前面的地址换成你的, ~貌似不行, 需要/这样的绝对地址.
#然后, 我们就可以收获一个同样的报错.

# 草草草草草草哦, 上面包括官方都是这么说的, 这些都是一本正经的说胡话. 妹哦..... 
############################################################下面介绍正确的姿势:
# 1. 第一步
echo $fpath #查看zsh的执行路径. 
# 其中有一个很顺眼: /Users/bergman/.oh-my-zsh/completions
# 然而你发现并没有这个目录, 没关系手工建一个.
# 2. 第二步, 把 ~/.sdkman/candidates/springboot/current/shell-completion/zsh/_spring copy到刚刚建立的目录里面.
# 3. 大功告成 试一下
spring #然后按下tab键.

# 顺便解下惑, brew安装的时候也不是搞什么狗屁source, 而是直接把文件copy到: 
zsh completion has been installed to:
/usr/local/share/zsh/site-functions
# 顺便吐槽下sdkman, 这么简单地功能都不做. 神经病啊.
https://github.com/spring-projects/spring-boot/issues/1342 
https://github.com/zsh-users/zsh-completions/blob/master/zsh-completions-howto.org
# 在这个issue, philwebb明确指出, 不可能有任何的complete是用source解决的, git的也不行, 必然是把script copy到某个$fpath里面才行, 但是, 他奶奶的, 各种spring的指引以及官方文档都说source, 这帮人都他娘的不试一下吗? java就是这个问题, 大家都在闭着眼睛胡说八道.
# 总结一下, 这事第二个坑, 不论任何语言, 任何工具, 都不可能这样掉坑的. java可以, 就是这么神奇. 官网, 实践导引, 各种书籍, 众口一词, 用source. 神经啊.....
spring shell #这个可以进入到spring的shell操作界面, 感觉和mysql, git啥的差不多. 也没使劲用, 如果遇坑, 建议绕过去. 不过用了这个, 就没有补全问题了, 这里面肯定都是可以自动补全的.
spring install #可以安装扩展, 没装过, 不知道是否有坑, 不建议尝试.

回到第一个坑 init究竟干啥

spring init --build=gradle --java-version=1.8 --dependencies=websocket --packaging=war sample-app.zip
Using service at https://start.spring.io
Content saved to 'sample-app.zip'
# 据说可以写成上面这样.
spring init --build=gradle #先执行这个.
#然后得到一个zip
open . #解压
spring run demo #执行
open http://localhost:8080 #还是得到之前的报错.
//打开样例java, 我直接震惊了
package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}
}
//搞毛啊, 啥都不声明, 这是要上天吗?

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@RestController  //加了这句
@EnableAutoConfiguration //加了这句
public class DemoApplication {
	@RequestMapping("/") //加了这句
	    String home() {
	        return "Hello World!";
	    }

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}
}
//然后这个世界正常了, 搞不清楚, 是不是我不正常. 还是java的世界不正常. 再说一遍, 其他语言的helloworld不会挖这种坑.
//最关键还是, 官方的导引挖这种坑. 这个社区是咋回事? 不懂了.

spring boot cli 样例

https://www.concretepage.com/spring-boot/spring-boot-cli-example
此链接有一个完整的groovy例子.

@Grab('spring-boot-starter-thymeleaf') // 这个声明可以决绝依赖

基础的工具和配置就到这里, 后面的内容就分叉了, 我看看是否沿着一条路往后走.

后续内容

  • groovy是个课题
  • sts spring tool suite, 据说就是eclipse, 好吧, java搞多了, 就会总是据说, 因为太繁杂了.

sdkman

  1. 这货的圾性前面已经展示了, 安装个springboot, 竟然不自动装好complete.
  2. 圾性再现: 他的命令和别人也不一样. search要用ls代替, 关键是, 搜啥都米有, 搞不清楚咋办.

init

spring help init #这个可以看到init的帮助
spring init -l #参数列表, 亲自尝试, 这个又是扯淡.

告一段落, 后续再弄一个文档.