Spring-boot 简介

Spring Boot提供了一种新的编程范式,能在最小的阻力下开发Spring应用程序。有了它, 你可以更加敏捷地开发Spring应用程序,专注于应用程序的功能,不用在Spring的配置上多花功夫,甚至完全不用配置。以前配置都是复杂并且模板化,而在springboot中这些都自动为我们做好了,让开发人员更加专注于业务需求的开发。

优点:

1.去除了大量的xml配置文件

  2.简化复杂的依赖管理

  3.配合各种starter使用,基本上可以做到自动化配置

  4.快速启动容器

  5.配合Maven或Gradle等构件工具打成Jar包后,Java -jar 进行部署运行还是蛮简单的,
   创建独立Spring应用程序,嵌入式Tomcat,Jetty容器,无需部署WAR包,简化Maven及Gradle配置,
   尽可能的自动化配置Spring,直接植入产品环境下的实用功能,比如度量指标、健康检查及扩展配置等,
   无需代码生成及XML配置。

缺点:

1.从原来的xml配置方式转换到JAVA配置方式变化有点大,不太适应
   2.感觉Spring Boot 比较适合做微服务,不适合做比较大型的项目。

一 . 如何在idea中搭建一个简单的springboot

idea 配置springboot 项目 springboot在idea的配置_springboot


idea 配置springboot 项目 springboot在idea的配置_字符串_02


idea 配置springboot 项目 springboot在idea的配置_springboot_03


idea 配置springboot 项目 springboot在idea的配置_字符串_04


idea 配置springboot 项目 springboot在idea的配置_springboot_05

二. 结构:

  • controller(控制层负责页面访问级传值)
  • service/biz(负责业务逻辑)
  • pojo/domain(实体类)
  • utils(工具类,一些公共的类)
  • main/resources
  • static(目录存放web访问的静态资源,js,css,图片等)
  • templates(目录存放页面模板)
  • application.properties(项目的配置信息)
  • banner.txt(可替换项目启动时的图画)

三. pom.xml中依赖的jar

//支持web模块
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
	//项目核心模块,包括自动配置支持,日志和YAML
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.1.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	//springboot 启动项目插件
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

注:

  • 问题: springboot中包结构没有在Application类同级而导致404找不到
  • 解决:需要在Application类上添加@ComponentScan(“扫描的位置包”)
@SpringBootApplication
//@ComponentScan("com")    // 添加注解 规定要扫描的包结构
public class BootApplication {
	public static void main(String[] args) {
		SpringApplication.run(BootApplication.class, args);
	}

}

四. 启动方式:

1.spring-boot 中内嵌的tomcat

idea 配置springboot 项目 springboot在idea的配置_mvc_06

2.pom.xml 中依赖的插件

idea 配置springboot 项目 springboot在idea的配置_字符串_07

五. 写一个简单的controller 测试

/**
 * Created by Administrator on 2019/1/11.
 *
 *  @RestController  代表返回的是json字符串 可以省略不写@ResponseBody
 * 也可以写springmvc 中 @Controller  在方法上仍然加上@ResponseBody
 */

@RestController
public class TestController {

    @RequestMapping("test1")
    /**
     *  @ResponseBody
     */
    public String test1(){
        return "success";
    }

    @RequestMapping("test2")
    public String test2(){
        return "error";
    }
}

六. 如何改变项目启动时的图画

注:

问题:在访问的时候肯定加上了项目名称,结果肯定是404

解决:SpringMVC的运行方式是将打成的war包放到tomcat中运行,这种情况下访问需要在url中加入项目名。SpringBoot同样可以打成war包部署,但也提供了另一种方式:直接执行public static void main()函数并启动一个内嵌的应用服务器(取决于类路径上的依赖是Tomcat还是jetty)来处理应用请求,这时是不需要添加项目名的。

1.创建banner.txt

idea 配置springboot 项目 springboot在idea的配置_springboot_08


2.在文件中添加自己想要的效果

idea 配置springboot 项目 springboot在idea的配置_字符串_09

七. application.properties 配置 (第一种)

  1. 修改访问项目的端口(tomcat端口号)
    server.port=8082 (端口号)
  2. 修改访问项目的路径
    server.servlet.context-path=/xf(自定义项目名)
  3. 修改编码
    server.tomcat.uri-encoding=UTF-8(编码格式)
  4. session 失效时间
    server.servlet.session.timeout=30(时间)
  5. 自定义配置

1) application.properties 中添加自定义的配置

idea 配置springboot 项目 springboot在idea的配置_字符串_10


2)Controller 层

idea 配置springboot 项目 springboot在idea的配置_spring_11


3)页面显示

idea 配置springboot 项目 springboot在idea的配置_mvc_12

application.yml (第二种)

注:springboot官方推荐使用这种文件,树状结构,层次感强,少写了很多代码,
在使用是 : 后必须跟一个空格,不然会认为是自动以配置,而不是文件本有的配置

idea 配置springboot 项目 springboot在idea的配置_字符串_13

八. 数据验证

注: 在公司用到数据验证的, 一般都需要前后台验证两次
注:注解要对应相应的属性

1. springboot 注解验证参数

注解

作用类型

解释

@NotNull

任何类型

属性不能为null

@NotEmpty

集合

集合不能为null,且size大于0

@NotBlanck

字符串、字符

字符类不能为null,且去掉空格之后长度大于0

@AssertTrue

Boolean、boolean

布尔属性必须是true

@Min

数字类型(原子和包装)

限定数字的最小值(整型)

@Max

同@Min

限定数字的最大值(整型)

@DecimalMin

同@Min

限定数字的最小值(字符串,可以是小数)

@DecimalMax

同@Min

限定数字的最大值(字符串,可以是小数)

@Range

数字类型(原子和包装)

限定数字范围(长整型)

@Length

字符串

限定字符串长度

@Size

集合

限定集合大小

@Past

时间、日期

必须是一个过去的时间或日期

@Future

时期、时间

必须是一个未来的时间或日期

@Email

字符串

必须是一个邮箱格式

@Pattern

字符串、字符

正则匹配字符串

  1. 简单验证效果
    1)创建一个实体类,添加相对应的注解
@Data
public class Student {
    @NotNull(message = "ID不能为空")
    private Integer stuId;
    @Max(value = 25,message = "不能超过25")
    @Min(value = 18,message = "不能小于18")
    private Integer stuAge;
    @NotEmpty(message = "用户名不能为空")
    private String stuName;
}

2)Controller层

@RequestMapping("valid")
    public String valid(@Valid Student stu, BindingResult result){
        System.out.println(stu);
        if(result.hasErrors()){   //验证有错误
            List<ObjectError> errors = result.getAllErrors(); //获取一个错误的集合
            for (ObjectError error : errors) {  // 循环错误信息 并打印在控制台  (foreach循环在idea中快捷键 iter)
                System.out.println("错误信息为-->"+error.getDefaultMessage()+"错误码-->"+error.getCode());
            }
        }
        return "ok";
    }

3)客户端访问

注:访问不传递参数 可能会导致错误信息不全

idea 配置springboot 项目 springboot在idea的配置_spring_14


4)控制台信息

idea 配置springboot 项目 springboot在idea的配置_mvc_15

5)客服端传参的情况:

idea 配置springboot 项目 springboot在idea的配置_springboot_16


6)对应控制台信息:

idea 配置springboot 项目 springboot在idea的配置_spring_17

九. springboot junit4 单选测试(ApplicationTests)

/**
 * SpringBoot1.4版本之前用的是SpringJUnit4ClassRunner.class
 */
@RunWith(SpringRunner.class)
/**
 * SpringBoot1.4版本之前用的是@SpringApplicationConfiguration(classes = Application.class)
 */
@SpringBootTest
/**
 * 测试环境使用,用来表示测试环境使用的ApplicationContext将是WebApplicationContext类型的
 */
@WebAppConfiguration
public class BootApplicationTests {
	private MockMvc mvc = null;
	@Before
	public void before(){
		mvc= MockMvcBuilders.standaloneSetup(new TestController()).build();
	}
	@Test
	public void test() throws Exception{
		/**
		 * 1、mockMvc.perform执行一个请求。
		 * 2、MockMvcRequestBuilders.get("XXX")构造一个请求。
		 * 3、ResultActions.param添加请求传值
		 * 4、ResultActions.accept(MediaType.TEXT_HTML_VALUE))设置返回类型
		 * 5、ResultActions.andExpect添加执行完成后的断言。
		 * 6、ResultActions.andDo添加一个结果处理器,表示要对结果做点什么事情
		 *   比如此处使用MockMvcResultHandlers.print()输出整个响应结果信息。
		 * 5、ResultActions.andReturn表示执行完成后返回相应的结果。
		 */
		MvcResult mvcResult= mvc.perform(MockMvcRequestBuilders.get("/valid")
				.param("name","zxf")
				.accept(MediaType.TEXT_HTML_VALUE))
				.andExpect(MockMvcResultMatchers.status().isOk())             //等同于Assert.assertEquals(200,status);
				// .andExpect(MockMvcResultMatchers.content().string("hello lvgang"))    //等同于 Assert.assertEquals("hello lvgang",content);
				.andDo(MockMvcResultHandlers.print())
				.andReturn();
		/**int status=mvcResult.getResponse().getStatus();                 //得到返回代码
		String content=mvcResult.getResponse().getContentAsString();    //得到返回结果

		Assert.assertEquals(200,status);                        //断言,判断返回代码是否正确
		Assert.assertEquals("hello lvgang",content);            //断言,判断返回的值是否正确*/
	}
	
	@Test
	@Ignore // 忽略测试方法
	public void contextLoads() {
	}

}