aa
SpringBoot简介
微服务
第一个SpringBoot例子
1、maven的一些配置:
指定镜像;
指定本地库路径;
指定编译运行的jdk版本:
<profile>
<id>jdk‐1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion> </properties>
</profile>
2、创建一个maven工程(jar形式):
不指定骨架;要指定JDK版本;
3、pom.xml中加入相关依赖;
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
4、编写一个主程序;
/**
* @SpringBootApplication 标注一个主程序类,说明这是一个Spring Boot应用
*/
@SpringBootApplication
public class HelloWorldMainApplication {
public static void main(String[] args) {
/**
* 将Spring Boot应用启动起来
* 已经内嵌了tomcat,不需要再进行指定了;
*/
SpringApplication.run(HelloWorldMainApplication.class,args);
}
}
5、编写业务逻辑代码;
@Controller
public class HelloController {
@ResponseBody // 要想将数据返回给客户端,就要加这个注解,SpringMVC的注解
@RequestMapping("/hello")
public String hello(){
return "Hello World!";
}
}
6、运行测试验证:
不需要加项目名;
7、简化部署:
以前需要加应用打成war包,放到tomcat服务器上,如果目标环境没有tomcat,还需要进行安装配置一下等其他操作;
SpringBoot应用不需要打成war包,打成可执行的jar包直接运行;
7.1、pom.xml中添加如下 spring boot maven 插件:
<build>
<plugins>
<!-- 这个插件,可以将应用打包成一个可执行的jar包;-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
7.2、执行打包命令:
上面是打成jar包之后所在的路径;
7.3、进入到jar包所在路径:
空白处输入快捷键:win+R,然后输入cmd进入命令窗口;
切换到对应路径,然后使用java -jar 命令执行:
再在浏览器里面输入之前的请求地址,可以看到请求成功得到响应;
ctrl + c:退出应用;
第一个例子Hello World 探究
1、先看 pom.xml 文件:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
</parent>
所有的Spring Boot应用的pom.xml文件中,都引用这个父项目;
进入这个父项目,发现此父项目依赖另一个父项目,如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath>../../spring-boot-dependencies</relativePath>
</parent>
再进入这个父项目看看:
可以看到,这里面定义了每一个依赖的版本;此父项目才是真正管理Spring Boot应用里面的所有依赖版本;可
以将它称为Spring Boot的版本仲裁中心;以后我们导入依赖默认是不需要写版本的,当然没有在dependencies里
面管理的依赖自然需要声明版本号;
2、再看一下启动器:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
将 spring-boot-starter-web 分成两部分来看:spring-boot-starter 和 web;
spring-boot-starter:spring-boot场景启动器;帮我们导入了web模块正常运行所依赖的组件(依赖的版本都受到父项目进行仲裁);
Spring Boot有很多这样的场景启动器;Spring Boot将所有功能都抽取成一个个分开的功能场景(starter 启动器),你想使用哪个功能,就引入哪个功能对应的场景启动器,然后相关场景的所有依赖都会被引入进来,而且版本由Spring Boot自己自动控制;比如上面的想使用web功能,就引入 spring-boot-starter-web 功能场景启动器;
使用Spring Initializer快速创建Spring Boot项目
根据需要来选择对应的功能服务;
这五个没用可以删掉;
配置嵌入式Servlet容器
SpringBoot默认使用Tomcat作为嵌入式的Servlet容器;
如何修改和定制Servlet容器相关的配置
方法1、修改和 server 相关的配置((ServerProperties【应该也是WebServerFactoryCustomizer
server:
servlet:
context-path: /curd
// 通用的Servlet容器设置
server.xxx
// Tomcat的设置
server.tomcat.xxx
方法2:编写一个EmbeddedServletContainerCustomizer:嵌入式的Servlet容器的定制器;来修改Servlet容器的 配置:
EmbeddedServletContainerCustomizer 在Spring Boot2.0以上不支持了,使用 WebServerFactoryCustomizer 来代替;
// 定制嵌入式的Servlet容器相关规则
@Bean
public WebServerFactoryCustomizer<ConfigurableWebServerFactory> webServerFactoryCustomizer() {
return new WebServerFactoryCustomizer<ConfigurableWebServerFactory>() {
@Override
public void customize(ConfigurableWebServerFactory factory) {
factory.setPort(8081);
}
};
}
在Spring Boot中会有很多的xxxCustomizer帮助我们进行定制配置;
注册 Servlet 三大组建【Servlet、Filter、Listener】
由于创建的SpringBoot应用默认是以jar包的方式启动嵌入式的Servlet容器来启动SpringBoot的web应用,不是标准的web应用目录结构(有/webapp/WEB-INF/web.xml,可以将三大组件注册在web.xml中),没有web.xml文 件;
ServletRegistrationBean:
// 注册一个Servlet
@Bean
public ServletRegistrationBean myServlet(){
ServletRegistrationBean registrationBean = new ServletRegistrationBean(new MyServlet(),"/myServlet");
registrationBean.setLoadOnStartup(1);
return registrationBean;
}
FilterRegistrationBean:
// 注册一个Filter
@Bean
public FilterRegistrationBean myFilter(){
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
registrationBean.setFilter(new MyFilter());
registrationBean.setUrlPatterns(Arrays.asList("/filter1","/filter2"));
return registrationBean;
}
ServletListenerRegistrationBean:
// 注册一个Listener
@Bean
public ServletListenerRegistrationBean myListener(){
ServletListenerRegistrationBean<MyListener> registrationBean = new ServletListenerRegistrationBean<>(new MyListener());
return registrationBean;
}
替换为其他嵌入式Servlet容器
默认支持三种Servlet容器:
Tomcat:默认使用、Jetty、Undertow
引入Jetty容器:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-tomcat</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- 引用其他的Servlet容器:Jetty -->
<dependency>
<artifactId>spring-boot-starter-jetty</artifactId>
<groupId>org.springframework.boot</groupId>
</dependency>
使用外置的Servlet容器
嵌入式Servlet容器:
应用直接打成可执行的jar包执行;
有点:简单、便携;
缺点:默认不支持JSP、优化和定制比较复杂(使用定制器【ServerProperties、自定义
EmbeddedServletContainerCustomizer】,自己编写嵌入式Servlet容器的创建工厂
【EmbeddedServletContainerFactory】);
外置的Servlet容器:
外面安装一个Servlet容器,以Tomcat为例,应用以war包的方式打包;
创建一个war包形式(需要有webapp相关目录)的SpringBoot应用:
以之前的方式创建Spring Boot应用,只是这里的Packing选为War;
生成的应用的完整目录结构是这样的,还没有webapp相关目录,需要手动创建;
双击;
直接点击OK;
点击Yes,就会创建webapp目录;
点击+号;
将此路径改为:D:\project\sgg_springboot\springboot_14\src\main\webapp\WEB-INF\web.xml;然后点击OK,这样就创建了web.xml文件;
点击Apply后,就可以看到完整的webapp目录;
运行war包形式的Spring Boot项目
可以将应用打成war包放到服务器上运行;也可以把服务器整合进idea里面来启动,这样更方便,本地开发的时候都是这样使用,见下面;
点击+号;
点击+号;
选第一个;
选第二个;
将这里的根路径改一下,只要/即可;
一些配置如上;
创建一个jsp页面;
启动项目;
访问成功;
JDBC:
idea中连接mysql时报了一个错,错误描述和解决方法如下:
https://blog.csdn.net/sikefeng/article/details/80200540
上面的错误解决完之后还是没有连接成功,是因为连接属性的字段名选错了:
这里选的时 username 和 password,而不是 data-username 和 password;
启动时可以执行建表sql和插入数据sql,默认只需要将文件命名为:
schema‐*.sql、data‐*.sql
默认规则:
schema.sql,schema‐all.sql;
可以使用
schema:
‐ classpath:department.sql
指定位置
Spring Boot2.x 和 Spring Boot1.x 在启动时执行sql语句上的区别:
https://blog.csdn.net/hyunbar/article/details/82967658