所谓工欲善其事,必先利其器,做java开发也一样,在比较了目前最流行的几个java IDE(eclipse,myeclipse、IDEA)之后,我果断选择IDEA。要知道,写代码的水平可以是一坨屎,但是开发工具一定要用最好的,就像一个人武功很差,又不拿一把像样的兵器在手的话,根本就没法闯荡江湖,分分钟被人砍死了。之前用eclipse,myeclipse的时候,由于和过去用VS的落差太大,弄得我一度想放弃写java代码,直到IDEA的出现,犹如黑暗中的一盏明灯。我是一个效率至上的人,原本可以2s钟撸完的代码,你偏偏要花10s,我就受不了,这不是浪费生命吗?打个比方,同样水平的人搏斗,一个赤手空拳,一个拿把砍刀,谁的胜算大?除非你内功足够强大,强大到不滞于物,草木竹石皆可伤人。所以那种拿记事本撸代码的人,要么就是足够牛,要么就是无形装逼被致命。善假于物也,老鸟和菜鸟很大一个区别就是,老鸟会善用各种好用的辅助开发工具。用这些工具是干嘛的?提升开发效率!产出=时间*效率。时间大家都是8h,你再怎么加班最多24h,而效率往往是可以超越4倍的,也就是说可能你24h也干不过别人8h,因为效率不一样。
srping boot的出现或许可以将java开发人员从996中的魔咒中解脱出来,从而少加班。采用Spring Boot开发实质上也是一个常规的Spring项目开发,只是利用了Spring Boot启动程序和自动配置简化开发过程,提高开发效率。Spring Boot项目开发代码的实现依然是使用Spring mvc+spring+mybatis等,当然能集成几乎所有的开源项目。
java环境配置
下载java JDK,建议1.8以上版本。
我这里下载的是:jdk_8.0.1310.11_64.exe
然后进行安装,我这里的安装目录是C:\Program Files\Java\jdk1.8.0_131,后面会用的。
配置环境变量
新建系统变量JAVA_HOME,值:C:\Program Files\Java\jdk1.8.0_131
编辑环境变量Path,在变量值的最前面添加%JAVA_HOME%\bin;,注意最后要有一个;分隔。
IDEA安装及破解
去官网下载最新版本的IDEA,需要注意的是,官网提供了两个版本一个是社区免费版,一个是旗舰版,我们要下载旗舰版的,因为免费版少了许多功能。
IDEA官网:https://www.jetbrains.com/idea/download/#section=windows
现在最新版是IntelliJ IDEA 2018.2了,我之前下载的是IntelliJ IDEA 2018.1.4 x64,因为我的是win10 64bit系统。
下载完成之后,点击下一步下一步就可以了,但是在最后那一步一定要注意,否则可能破解失败,那就是在最后出现完成界面的时候,一定要把那个是否马上运行前面的勾去掉。
(1)编辑电脑上C:\Windows\System32\drivers\etc下的hosts文件
加入下面一行代码:
0.0.0.0 account.jetbrains.com
保存并关闭。
(2)打开http://idea.lanyus.com/,获取注册码
打开IDEA,
IDEA配置
IDEA安装后之后,我们要来对其进行个性化配置,我觉得最重要的有两点,一个是快捷键的配置,一个是代码显示风格的配置,像我习惯了VS的代码显示风格,那么我们可以对其进行自定义修改。
我制作了一个配置文件,下载地址:https://files.cnblogs.com/files/jiekzou/settings.zip
下载完成之后,解压之后是一个settings.jar文件,然后在IDEA中把配置导入进来即可。
最后的显示效果如下:
关于IDEA的代码格式化快捷键,默认是:Ctrl+Alt+L,这和许多软件的锁屏快捷键冲突,所以我建议将其进行修改,我这里已经修改为和VS代码格式化快捷键一样:Ctrl+K,Ctrl+F。这样两个组合快捷键。
File——Settings
在VS中代码提示大小写是不敏感的,而IDEA默认情况下是敏感的,由于个人习惯,那么我需要将IDEA的代码智能提示也修改为大小写不敏感。
在IDEA中写的代码或者复制进去的代码,其命名空间也就是包会自动引入的,如果出现多个包,那么就需要自己手动引入,引入方式也很简单,用鼠标点到代码位置处,然后Atl+Enter,选择指定的包就可以了。虽然java中没有属性这个传说,C#中属性其实就是像java中一样是通过一个get方法和一个set方法实现的,只是C#进行了封装,而java需要自己写,不过IDEA中有快捷键可以自动生成字段的属性:Alt+Insert。
不管使用什么样的IDE,熟记各种快捷键都是必须的,为啥?效率!效率!还是效率!
第一个spring boot web 程序
what's spring boot?
我的理解是:spring boot=spring+spring mvc+一堆java技术栈的相关框架+约定大于配置的思想。
spring boot 并不是一项新的技术,就像ajax一样,而是各种已有技术的一个组合。它的出现,将极大地提高java应用的开发效率。同时,它的出现,彻底颠覆了以往我对java的认识(除了配置,TMD还是配置)。轻量级、可插拔、微服务。
File——New——Project
关于https://start.spring.io/,我们打开看下这是个啥
这不正是生成项目jar包的界面吗,直接在这个界面生成jar包,然后用eclipse打开也是一样的呀。
注意:通过这种方式来创建spring boot项目,会联网,从网站下载一些jar包。如果你想要通过离线的方式创建项目,可以选择Maven。
由于是web项目,那么我们这里选择web,关于spring boot版本,最新版本是2.1.0,我这里用它的上一个稳定版1.5.14。我们看到有些版本后面有SNAPSHOT字样,表明那是抢鲜版。
一直点击下一步,最终项目结果目录如下:
我们先来看下pom.xml,它是maven来管理各种jar包依赖的一个配置文件,maven相当于.net中的nuget,是一个包管理工具。
<?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.yujie</groupId> <artifactId>firstdemo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>firstdemo</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.14.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
我们看到<parent>节点中申明了版本号,而且它是作为一个父节点,那么也就意味着它的子节点可以继承这个父节点的版本依赖。哪些是它的子节点,就是<dependencies>下面groupId和<parent>中groupId一致的依赖。这个pom.xml中的文件,正是我们之前可视化配置之后的产物,里面的一些信息就是我们之前填写的。那么后续,我们需要扩展的时候,只要直接修改这个配置文件就可以了。
关于pom.xml详解,请参考:pom.xml详解
如果你在pom.xml中添加代码的时候,没有智能提示,那么你需要更新一下。
接下来,我们看下FirstdemoApplication这个类
package com.yujie; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class FirstdemoApplication { public static void main(String[] args) { SpringApplication.run(FirstdemoApplication.class, args); } }
我们看到有一个@SpringBootApplication注解,我们查看一下它的源码如下:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
// // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) // package org.springframework.boot.autoconfigure; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.context.TypeExcludeFilter; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.FilterType; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.core.annotation.AliasFor; @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan( excludeFilters = {@Filter( type = FilterType.CUSTOM, classes = {TypeExcludeFilter.class} ), @Filter( type = FilterType.CUSTOM, classes = {AutoConfigurationExcludeFilter.class} )} ) public @interface SpringBootApplication { @AliasFor( annotation = EnableAutoConfiguration.class, attribute = "exclude" ) Class<?>[] exclude() default {}; @AliasFor( annotation = EnableAutoConfiguration.class, attribute = "excludeName" ) String[] excludeName() default {}; @AliasFor( annotation = ComponentScan.class, attribute = "basePackages" ) String[] scanBasePackages() default {}; @AliasFor( annotation = ComponentScan.class, attribute = "basePackageClasses" ) Class<?>[] scanBasePackageClasses() default {}; }
从源码中可以看出,其实@SpringBootApplication = (默认属性)@Configuration + @EnableAutoConfiguration + @ComponentScan。
我们依次再分别来看下这三个注解是什么意思。
@Configuration 是一个类级注释,指示对象是一个bean定义的源。@Configuration 类通过 @bean 注解的公共方法声明bean。 @Configuration的注解类标识这个类可以使用Spring。
@Bean 注释是用来表示一个方法实例化,配置和初始化是由 Spring IoC 容器管理的一个新的对象。
@Configuration 一般与 @Bean 注解配合使用,用 @Configuration 注解类等价与 XML 中配置 beans,用 @Bean 注解方法等价于 XML 中配置 bean。
@EnableAutoConfiguration 注解的类所在的包有特定的意义,并且作为默认配置使用。
@ComponentScan 注解会自动扫描指定包下的全部标有 @Component注解 的类,并注册成bean,当然包括@Component下的子注解@Service,@Repository,@Controller。
application.properties
这是应用的配置文件,跟.net项目中的web.config差不多。但是我个人更习惯于使用application.yml这个文件来替代application.properties
修改application.properties,命名为application.properties-bak,其实就是让这个配置文件失效,但是我又不想直接删除它。
然后在添加一个文件application.yml,注意要和application.properties在同一级目录下面。
添加配置项:
server:
port: 8082
我这里修改tomcat服务器的启动端口为8082,由于IDEA srping boot项目中自带了tomcat,所以我们不需要配置外部的tomcat。
新建一个控制器TestController,它这个控制器的命名规范和.net mvc中规范一致,都是Controller结尾。代码如下:
package com.yujie; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @RestController public class TestController { // @RequestMapping("/hello") // @RequestMapping(value = "/hello") @RequestMapping(value = "/hello",method =RequestMethod.GET) // @GetMapping("/hello") public String hello(){ return "hello spring boot!"; } }
@RequestMapping("/hello")和@RequestMapping(value = "/hello"是等价的。
@RequestMapping(value = "/hello",method =RequestMethod.GET)和 @GetMapping("/hello")是等价的。
@RestController注解相当于@ResponseBody + @Controller。
如果需要返回到指定页面,则需要用 @Controller配合视图解析器InternalResourceViewResolver才行。
如果需要返回JSON,XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解。
注意:@RestController注解,相当于@Controller+@ResponseBody两个注解的结合,返回json数据不需要在方法前面加@ResponseBody注解了,但使用@RestController这个注解,就不能返回jsp,html页面,视图解析器无法解析jsp,html页面
运行程序:
热部署
在这之前,如果我们每次修改了代码,都必须重启一下服务器,并重新运行代码,那么有了热部署之后,修改了代码,我们只需要在IDEA中点击一下Build,就可以直接看到效果了,不需要重启服务器。
pom.xml文件中添加如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
添加依赖之后,在IDEA的右下角会弹出如下提示框
点击“Import Changes"将会自动下载j所依赖的jar包。
修改pom.xml,
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <fork>true</fork> </configuration> </plugin> </plugins> </build>
如果不想每次修改后都要手动去Build,可以在IDEA中配置自动Build
然后按组合键:Shift+ALT+Ctrl+/ ,选择“Registry”,回车,找到“complier.automake.allow.when.app.running”,点击勾选即可。
优点:简单,支持Spring-boot项目,支持成员级别的修改热部署。
缺点:只支持spring-boot项目。
读取配置文件
修改配置文件application.yml,添加如下代码:
server:
port: 8082
website:
name: 网站名称
domain: www.yujie.com
msg: 我这是一个博客网站
新建配置文件类WebSiteConfig,字段名称和配置项中的名称保持一致。
package com.yujie.config; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; @Configuration @ConfigurationProperties(prefix = "website") public class WebSiteConfig { private String name; private String domain; private String msg; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDomain() { return domain; } public void setDomain(String domain) { this.domain = domain; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } @Override public String toString() { return "WebSiteConfig{" + "name='" + name + '\'' + ", domain='" + domain + '\'' + ", msg='" + msg + '\'' + '}'; } }
在控制器类TestController中修改代码:
@RestController public class TestController { @Autowired private WebSiteConfig webSiteConfig; // @RequestMapping("/hello") // @RequestMapping(value = "/hello") @RequestMapping(value = "/hello",method =RequestMethod.GET) // @GetMapping("/hello") public String hello(){ return "hello spring boot!1"; } @GetMapping("/config") public String getConfig(){ return webSiteConfig.toString(); } }
是不是感觉像使用vs开发asp.net mvc项目一样那么简单?甚至比.net 操作配置文件还方便吧
参考: