前言
此文只是记录自己简单学习spring boot的笔记。所以,文章很多只是初步理解,可能存在严重错误。
一、Spring boot的初步理解
- 为所有的Spring开发提供一个从根本上更快的和广泛使用的入门经验。
- 开箱即用,但你可以通过不采用默认设置来摆脱这种方式。
- 提供一系列大型项目常用的非功能性特征(比如,内嵌服务器,安全,指标,健康检测,外部化配置)。
- 绝对不需要代码生成及XML配置。
2、spring boot代替了什么,Spring、SpringMVC/Struts2、hibernate/Mybatis?
个人理解:代替了spring。用代替/取代来解释貌似都不好,更准确的可能是封装了spring,使搭建SSH/SSM更快捷。
传统的spring有很多xml配置,例如:dataSource、transactionManager、AOP、bean等等xml的配置。即便用注解,也要在xml中配置component-scan等。
约定大于配置”,所以尽可能的避免了xml配置。
3、spring boot避免了哪些xml?
主要是spring的application.xml、context等xml。但例如:mybatis.xml、log4j.xml等还是要的。
4、什么是Starter POMs?
Starter POMs是可以包含到应用中的一个方便的依赖关系描述符集合。你可以获取所有Spring及相关技术的一站式服务,
而不需要翻阅示例代码,拷贝粘贴大量的依赖描述符。例如,如果你想使用Spring和JPA进行数据库访问,
只需要在你的项目中包含 spring-boot-starter-data-jpa 依赖,然后你就可以开始了。
参考参考指南13.4,pdf页数56/420。
二、Sping boot的建议
1、推荐使用jdk1.8+。(虽然可以在1.6-1.7中使用)
2、servlet容器。
3、Spring Boot兼容Apache Maven 3.2或更高版本;
Spring Boot兼容Gradle 1.12或更高版本。
不建议使用jsp(虽然可以配置jsp支持)。
三、demo
1、代码结构(idea)
2、解释
application.java:入口
GreetingController.java:controller层代码。
index.html:默认首页。localhost:8080访问的页面即index.html。
greeting.html:请求页面。
(1、为什么html是在resources中。2、为什么结构是static、templates。3、如何修改此“约定”,把html放到webapp/WEB-INF下。
这些问题在以后学习,此文不讨论。)
3、source code
<?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>VergiLyn</groupId>
<artifactId>Spring boot</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.3.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- 模版框架thymeleaf -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<!-- spring boot 单元测试依赖 BEGIN-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- spring boot 单元测试依赖 END-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
pom.xml
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@Controller
//@RestController
public class GreetingController {
@RequestMapping("/greeting")
public String greeting(@RequestParam(value="name", required=false, defaultValue="VergiLyn") String name
, Model model) {
model.addAttribute("name", name);
return "greeting";
}
}
index.html
<!DOCTYPE HTML>
<html>
<head>
<title>Getting Started: Serving Web Content</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<p>Get your greeting <a href="/greeting">here</a></p>
</body>
</html>
greeting.xml
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Getting Started: Serving Web Content</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<p th:text="'Hello, ' + ${name} + '!'" />
</body>
</html>
spring boot的单元测试模版
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class TestOfficialDemo {
@LocalServerPort
private int port;
@Autowired
private TestRestTemplate restTemplate;
@Test
public void testGreetingDefault() throws Exception {
assertThat(this.restTemplate.getForObject("http://localhost:" + port + "/greeting",String.class))
.contains("VergiLyn");
}
}
4、测试
运行application.java的main()方法,控制台打印:
请求访问localhost:8080
点击超链接“here”:可以看到用的是defaultValue。
自定义请求greeting:localhost:8080/greeting?name=VergiLyn淡无欲
四、部分解释
1、@Controller、@RestController、@RequestMapping、@RequestParam是spring的注解,而非spring boot提供的注解。
2、@Controller与@RestController的区别
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
String value() default "";
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
String value() default "";
}
通过sourceCode的定义可以看出:@RestController在@Controller的基础上多了@ResponseBody。简单理解就是:@RestController不能返回html、jsp。
(Rest即webservice中RESTful的rest,可以理解成@RestController主要用来返回json等数据,而非页面)
3、@SpringBootApplication
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(type = FilterType.CUSTOM,classes = {TypeExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
Class<?>[] exclude() default {};
String[] excludeName() default {};
@AliasFor(
annotation = ComponentScan.class,
attribute = "basePackages"
)
String[] scanBasePackages() default {};
@AliasFor(
annotation = ComponentScan.class,
attribute = "basePackageClasses"
)
Class<?>[] scanBasePackageClasses() default
摘自:参考指南
很多Spring Boot开发者总是使用 @Configuration , @EnableAutoConfiguration 和 @ComponentScan 注解他们的main类。由于这些
注解被如此频繁地一块使用(特别是你遵循以上最佳实践时),Spring Boot提供一个方便的 @SpringBootApplication 选择。
该 @SpringBootApplication 注解等价于以默认属性使用 @Configuration , @EnableAutoConfiguration 和 @ComponentScan 。