沉淀再出发:spring boot的理解

一、前言

关于spring boot,我们肯定听过了很多遍了,其实最本质的东西就是COC(convention over configuration),将各种框架组装起来,省去了我们配置各种框架的时间,是一种更高层次的封装和抽象,正如maven整合了很多的jar包一样,spring boot整合了很多的框架和操作,我们只需要简单的加载进来就可以使用了,这极大地方便了我们的程序开发效率。

二、spring boot的使用

2.1、Spring Boot核心功能:

     独立运行的Spring项目:可以以jar包形式独立运行,通过java -jar xx.jar即可运行
内嵌Servlet容器:可以选择内嵌Tomcat、Jetty等
提供starter简化maven配置:一个maven项目,使用了spring-boot-starter-web时,会自动加载Spring Boot的依赖包
自动配置Spring:Spring Boot会根据在类路径中的jar包、类,为jar包中的类自动配置Bean
准生产的应用监控:提供基于http、ssh、telnet对运行时的项目进行监控
无代码生成和xml配置:主要通过条件注解来实现

2.2、Spring Boot项目搭建

  这里使用maven进行项目搭建,有几种搭建方式:

1、http://start.spring.io/,填写相关的项目信息、jdk版本,需要的组件等,就会生成一个maven项目的压缩包,下载解压导入IDE(比如IntelliJ IDEA)就可以。
2、IDE下直接创建,IntelliJ IDEA均支持直接搭建,Spring Tool Suite:新建Spring Initializr项目,填写项目信息和选择技术,将项目设置成maven项目;IntelliJ IDEA:新建Spring Starter project,填写项目信息和选择技术完成maven工程创建。
3、Spring Boot CLI工具,使用命令创建。
4、手工构建maven项目,任意IDE新建空maven项目,修改pom.xml添加Spring Boot的父级依赖Spring-boot-starter-parent,添加之后这个项目就是一个Spring Boot项目了,这也是其他方式生成的本质,引入依赖。

下面我们通过前两种方式来创建工程,首先是第一种,从网址:http://start.spring.io/ 获取工程压缩文件:

选择使用更多的配置“switch to the full version”,我们可以进行更灵活的配置:

    其中我们自己定义工程的名字,以及各种配置,最后我们可以加一点组件进去,比如我们加入web项目:

  然后我们点击生成按钮即可,将生成的工程下载下来,然后解压到磁盘上:

   然后打开intellij IDEA,导入工程,这一步非常的重要,一定要选择pom.xml文件来打开:

    选择作为工程文件打开,之后就能自动生成工程了:

   然后我们看到之前已经生成了一个以项目名大写的文件“XXXApplication.java”,这个文件就是程序执行的入口点,我们可以在这个文件下面加一点简单的映射:

 package com.springboot.zyrboot;

 import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; 8 @SpringBootApplication
9 @RestController
public class ZyrbootApplication {
@RequestMapping(path = {"/helloSpringBoot"})
public String HelloSpring (){
System.out.println("hello spring boot");
return "hello spring boot";
}
@RequestMapping("/index")
public String index (){
System.out.println("欢迎使用springboot");
return "欢迎使用springboot";
}
public static void main(String[] args) {
SpringApplication.run(ZyrbootApplication.class, args);
}
}

  然后运行main函数,就这样Tomcat就开始运行了,我们根本就没有配置呢,全靠spring boot帮我们做好了这些繁琐的工作:

  我们在浏览器上访问,发现已经成功运行了,非常的方便:

 下面讲一下第二种创建工程的方法:

   可以看到本质上也是从spring的网址上面得到信息的:

   然后一直确定就生成了我们的spring boot工程:

   剩下的两种方式其实本质上和上面的两种一样的,最后都落实到了pom.xml文件的某些配置上。

 2.3、Spring boot工程解析

   让我们看看自动生成的pom.xml文件吧,可以看到我们选择的web组件已经加载了,最重要的是<parent>标签里面的东西,这个标签是在配置 Spring Boot 的父级依赖,有了这个当前的项目才是 Spring Boot 项目,spring-boot-starter-parent 是一个特殊的 starter ,它用来提供相关的 Maven 默认依赖,使用它之后,常用的包依赖就可以省去 version 标签。

 <?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.example</groupId>
<artifactId>zyrdemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging> <name>zyrdemo</name>
<description>Demo project for Spring Boot</description> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.0.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依赖和我们简单的web,test和maven插件配置之后,我们可以看到系统自动导入了非常多的外置包:

应用入口类

Spring Boot 项目通常有一个名为 *Application 的入口类,入口类里有一个 main 方法, 这个 main 方法其实就是一个标准的 Java 应用的入口方法。
@SpringBootApplication 是 Spring Boot 的核心注解,它是一个组合注解,该注解组合了:@Configuration、@EnableAutoConfiguration、@ComponentScan; 若不是用 @SpringBootApplication 注解也可以使用这三个注解代替。其中,@EnableAutoConfiguration 让 Spring Boot 根据类路径中的 jar 包依赖为当前项目进行自动配置,例如,添加了 spring-boot-starter-web 依赖,会自动添加 Tomcat 和 Spring MVC 的依赖,那么 Spring Boot 会对 Tomcat 和 Spring MVC 进行自动配置。Spring Boot 还会自动扫描 @SpringBootApplication 所在类的同级包以及下级包里的 Bean ,所以入口类建议就配置在 grounpID + arctifactID 组合的包名下。

Spring Boot 的配置文件

Spring Boot 使用一个全局的配置文件 application.properties 或 application.yml,放置在src/main/resources目录下。Spring Boot 不仅支持常规的 properties 配置文件,还支持 yaml 语言的配置文件。yaml 是以数据为中心的语言,在配置数据的时候具有面向对象的特征。Spring Boot 的全局配置文件的作用是对一些默认配置的配置值进行修改。比如我们对Tomcat的配置进行更改,然后运行:

 server.port=8081
server.servlet.context-path=/hello

  程序如下:

 package com.example.zyrdemo;

 import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
@SpringBootApplication
public class ZyrdemoApplication {
@RequestMapping("/hello")
public String hello() {
return "Hello Spring Boot,I am zyr!";
}
public static void main(String[] args) {
SpringApplication.run(ZyrdemoApplication.class, args);
}
}

  需要这样才能访问我们的程序了:

    另外,难道我们的程序,必须要写道这个“XXXApplication.java”的文件里面吗?肯定不是的,我们在同一包下再加一个文件:

 package com.example.zyrdemo;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
public class OtherController {
@RequestMapping("/hello1")
public String hello1() {
return "Hello Spring Boot,I am zyr!OtherController is running";
}
}

  然后运行一下,发现同样的可以访问了:

  但是,如果我们新建一个包,在这个里面放入相应的文件就不能执行了,这一点我们要非常的注意,因为需要我们配置beans扫描了:

三、总结

    通过对spring boot的学习和理解,我们发现一些理念和工具是深深结合的,并且随着工具的多样化,就会进行整合,从而得到更大程度的可用性,减少不必要的配置,通过统一配置的方式,我们可以更加快速地将工作重点转移到实际的业务逻辑之中。

沉淀再出发:spring boot的理解的更多相关文章

  1. 沉淀再出发:Spring的架构理解

    沉淀再出发:Spring的架构理解 一.前言 在Spring之前使用的EJB框架太庞大和重量级了,开发成本很高,由此spring应运而生.关于Spring,学过java的人基本上都会慢慢接触到,并且在 ...

  2. 沉淀再出发:关于java中的AQS理解

    沉淀再出发:关于java中的AQS理解 一.前言 在java中有很多锁结构都继承自AQS(AbstractQueuedSynchronizer)这个抽象类如果我们仔细了解可以发现AQS的作用是非常大的 ...

  3. 沉淀再出发:关于netty的一些理解和使用

    沉淀再出发:关于netty的一些理解和使用 一.前言 Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务 ...

  4. 沉淀,再出发:XPath的理解和使用

    沉淀,再出发:XPath的理解和使用 一.前言   在很多查找的场合之下,我们需要使用正则表达式和其他的查找工具来进行内容的匹配和查找,特别是对于xml文件,我们可以使用xpath等工具来进行查找,通 ...

  5. 沉淀再出发:IoC和AOP的本质

    沉淀再出发:IoC和AOP的本质 一.前言 关于IoC和AOP这两个概念,如果我们没有深入的理解可以说是根本就不理解Spring这个架构的,同样的由Spring演变出来的Spring Boot和Spr ...

  6. 沉淀再出发:jetty的架构和本质

    沉淀再出发:jetty的架构和本质 一.前言 我们在使用Tomcat的时候,总是会想到jetty,这两者的合理选用是和我们项目的类型和大小息息相关的,Tomcat属于比较重量级的容器,通过很多的容器层 ...

  7. 沉淀再出发:dubbo的基本原理和应用实例

    沉淀再出发:dubbo的基本原理和应用实例 一.前言 阿里开发的dubbo作为服务治理的工具,在分布式开发中有着重要的意义,这里我们主要专注于dubbo的架构,基本原理以及在Windows下面开发出来 ...

  8. 沉淀再出发:Bean,JavaBean,POJO,VO,PO,EJB等名词的异同

    沉淀再出发:Bean,JavaBean,POJO,VO,PO,EJB等名词的异同 一.前言 想必大家都有这样的困惑,接触的东西越多却越来越混乱了,这个时候就要进行对比和深入的探讨了,抓住每一个概念背后 ...

  9. 沉淀再出发:在python3中导入自定义的包

    沉淀再出发:在python3中导入自定义的包 一.前言 在python中如果要使用自己的定义的包,还是有一些需要注意的事项的,这里简单记录一下. 二.在python3中导入自定义的包 2.1.什么是模 ...

随机推荐

  1. 看过ruby相关书籍

    <ruby编程语言> <crafting rails applications> <agile web developemnt> <build awesome ...

  2. 如何调用npm已经安装在全局位置的模块

    参考链接  https://nodejs.org/api/modules.html#modules_loading_from_the_global_folders npm install xxx -g ...

  3. MYSQL中数据类型介绍

    一.MySQL的数据类型 主要包括以下五大类: 主要包括以下五大类: 整数类型:bit.  int . bit int . small int . tiny int . medium int .boo ...

  4. linux进程间的网络通信

    一.进程是如何进行网络通信的?socket通信的过程? 同一机器上的不同进程之间的通信方式有很多种,主要使用消息传递或共享内存.而跨网络的进程是几乎都是使用socket通信,例如web服务器,QQ. ...

  5. 【WAN】PPPOE宽带上网功能详解

    1.mac地址克隆 某些地方的运营商会把宽带账号和用户电脑的mac地址绑定起来,运营商的账号只能让当前的电脑去上网,限制路由器上网,这时候路由器可以复制用户电脑的mac伪装成这台电脑去上网,实现路由器 ...

  6. ajax 传递数组给后台.net MVC 控制器

    数组结构为: [ "5ae92c2786f3591b2cff1be5", "5ae91bb7ca673569a8d23a6e" ] 前台代码: $.ajax({ ...

  7. Oracle数据库基本操作(三) —— DQL相关内容说明及应用

    本文所使用的查询表来源于oracle数据中scott用户中的emp员工表和dept部门表. 一.基本语法 SQL语句的编写顺序: select 输出的列 from 表名 where 条件 group ...

  8. 匿名内部类中关于new Runnable()的使用

    匿名内部类也就是没有名字的内部类,正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写. 但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口 1.继承一个父类的匿名内部类实现 ...

  9. 图像去噪算法:NL-Means和BM3D

    图像去噪是非常基础也是非常必要的研究,去噪常常在更高级的图像处理之前进行,是图像处理的基础.可惜的是,目前去噪算法并没有很好的解决方案,实际应用中,更多的是在效果和运算复杂度之间求得一个平衡,再一次验 ...

  10. IPtables中SNAT和MASQUERADE的区别

    问题 iptables中snat和MASQUERADE的区别 解决方案 iptables中可以灵活的做各种网络地址转换(NAT) 网络地址转换主要有两种:snat和DNAT snat是source n ...