从.Net到Java学习第一篇——开篇

  所谓工欲善其事,必先利其器,做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注解,我们查看一下它的源码如下:

//
// 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 操作配置文件还方便吧

参考:

Intellij IDEA 4种配置热部署的方法

从.Net到Java学习第二篇——IDEA and start spring boot的更多相关文章

  1. Java 学习 第二篇;面向对象 定义类的简单语法:

    1:基本知识 [public / protected / private] class 类名 { 零个到多个构造器定义; 零个到多个属性; 零个到多个方法; } 其中类中各个成员之间的顺序没有关系,且 ...

  2. Java学习第二篇:类,对象,成员属性,成员方法,构造方法,类变量,类方法

    一.类的定义 一个全面的类定义是比较复杂的,  定义如下:

  3. Java学习第二篇 — 时间类的使用

    package DateTest; import java.util.Date; public class Date1 { public static void main(String[] args) ...

  4. java 学习第二篇关系运算符和布尔值

    关系运算符,顾名思义.用来看什么关系.(也就是用来比较) 看下表 JAVA 关系运算符 a=6,b=5 关系运算符 举例 值 解释 > a>b true a大于b < a<b ...

  5. 从.Net到Java学习第一篇——开篇

    以前我常说,公司用什么技术我就学什么.可是对于java,我曾经一度以为“学java是不可能的,这辈子不可能学java的.”结果,一遇到公司转java,我就不得不跑路了,于是乎,回头一看N家公司交过社保 ...

  6. Java并发包下锁学习第二篇Java并发基础框架-队列同步器介绍

    Java并发包下锁学习第二篇队列同步器 还记得在第一篇文章中,讲到的locks包下的类结果图吗?如下图: ​ 从图中,我们可以看到AbstractQueuedSynchronizer这个类很重要(在本 ...

  7. Java SE 第二篇

    二.  Java SE 第二篇 1.  Arrays 数组 // 声明一维数组,[]内不允许有值 int[] arr; int arr[]; // 创建一维数组对象,[]内必须有值 arr = new ...

  8. Spring boot学习1 构建微服务:Spring boot 入门篇

    Spring boot学习1 构建微服务:Spring boot 入门篇 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框 ...

  9. 57. Spring 自定义properties升级篇【从零开始学Spring Boot】

    之前在两篇文章中都有简单介绍或者提到过 自定义属性的用法: 25.Spring Boot使用自定义的properties[从零开始学Spring Boot] 51. spring boot属性文件之多 ...

随机推荐

  1. MonggoDB(二)

    分组聚合 如果你有数据存储在MongoDB中,你想做的可能就不仅仅是将数据提取出来这么简单,可能需要对数据进行分析并加以利用. 聚合框架:可以使用多个构件创建一个管道,上一个构件的结果传给下一个构件. ...

  2. VS2017无法发现单元测试,不能运行单元测试的解决方案

    问题: 在VS2017中新建空的单元测试后,无法运行测试,即右键菜单的"运行测试"和"调试测试" 不能运行,在测试资源管理中也无法列出这个测试. 解决方案: 1 ...

  3. oracle之序列用法

    序列用于生成唯一.连续序号的对象序列是可以升序.降序的使用create sequence语句创建序列SQL>CREATE SEQUENCE stu_seq    START WITH 1     ...

  4. [LeetCode] Find And Replace in String 在字符串中查找和替换

    To some string S, we will perform some replacement operations that replace groups of letters with ne ...

  5. Index API

    Index API 用于在指定索引中添加或更新类型化的JSON文档,使其成为可搜索的. 以下示例将JSON文档插入“twitter”索引中,类型名为“_doc”,ID为1: PUT twitter/_ ...

  6. 解决Android Studio 将String类型保存为.txt文件,按下button跳转到文件管理器(解决了保存txt文件到文件管理后,手机打开是乱码的问题)

    不知道为什么保存文件后之前打开一直都OK,就突然打开看到变成乱码了,最后解决了 关键:outStream.write(finalContent.getBytes("gbk")); ...

  7. 让MEF插上AOP的翅膀

    什么是MEF Git:https://github.com/MicrosoftArchive/mef MEF也是一款ioc框架,貌似历史比较悠久了. 这里有一篇.net阵容里面主流ioc比较. htt ...

  8. FCC(ES6写法) Validate US Telephone Numbers

    如果传入字符串是一个有效的美国电话号码,则返回 true. 思路:用正则,参考网上资料和js高级程序设计(5.4RegExp类型). let telephoneCheck = str => /^ ...

  9. .NET 应用架构电子书中文版

    <.NET 微服务:容器化 .NET 应用架构指南> 本书主要介绍了基于容器和微服务的应用架构和设计原则,以及基于 .NET Core 和 Docker 容器的应用程序开发实践.为了让大家 ...

  10. Android APK 瘦身 - JOOX Music项目实战

    导语 JOOX Music是腾讯海外布局的一个音乐产品,2014年发布以来已经成为5个国家和地区排名第一的音乐App.东南亚是JOOX Music的主要发行地区,由于JOOX Music所面对的市场存 ...