spring in action5按目录有五部分,每个部分又分若干小节,准备按每个小节为一篇做笔记
PART1 Foundation Spring----------1 get started with spring
1.1 spring是什么
概念
大型应用由许多组件组成,各负其责,协作分工,程序运行时,这些组件被创建,互相引用管理生命周期。
spring提供一个容器,也叫应用上下文,负责创建和管理app组件,这些组件或者beans被装配在容器中,联结在一起形成一个完整的app.
把beans装配在一起的行为基于依赖注入模式,不使用spring时,组件或者beans的生命周期由别的组件创建和管理,使用spring后,全部由容器创建和管理,包括注入bean,注入bean的方式由构造函数和属性访问方法。
总结:使用spring框架和不使用的不同点在于组件的创建和管理方式,spring统一使用容器管理,组件调用的行为通过注入bean实现,注入bean的方式通常使用2种
关键字 容器 应用上下文 装配 依赖注入 组件或者bean
装配方式,过去使用xml描述bean和注入bean,现在版本的spring中,使用称为 a java-based configuration
<bean id="inventoryService"
class="com.example.InventoryService" />
<bean id="productService"
class="com.example.ProductService" />
<constructor-arg ref="inventoryService" />
</bean>
@Configuration
public class ServiceConfiguration {
@Bean
public InventoryService inventoryService() {
return new InventoryService();
}
@Bean
public ProductService productService() {
return new ProductService(inventoryService());
}
}
@Configuration告诉spring这是个配置类,作用是提供beans给spring应用上下文
@Bean表示方法返回的对象将作为beans放入应用上下文中
使用配置类不使用xml的好处:类型安全,利于重构,只有在必要情况下才使用java配置类或者xml,因为spring通常自动配置组件
自动配置技术
- 自动配置技术源于自动装配和组件扫描
- 组件扫描能够利用类路径发现组件并且在应用上下文中创建他们
- 自动装配能够自动注入依赖的bean
自动配置技术的代表:spring boot,spring boot大量减少了显式配置的数量
1.2初始化一个spring app
方式
- 使用 web http://start.spring.io
- 使用命令行:curl
- 使用spring boot 命令行界面
- 使用spring tool suite
- 使用idea
- 使用netbeans
###书中推荐使用spring tool suite
- 创建项目
- 项目结构解析
- mvnw and mvnw.cmd:Maven的包装脚本,用来构建项目
- pom.xml:Maven配置文件
- TacoCloudApplication.java:两个注解的意思
- application.properties:项目配置文件,作为注入bean的快捷配置存在
- static 存放静态内容(图片,样式、脚本等)
- templates:存放模板文件
- TacoCloudApplicationTests.java:测试类
- 测试类
package tacos;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class TacoCloudApplicationTests {
@Test
public void contextLoads() {
}
}
注解@RunWith(SpringRunner.class),这是一个JUnit注解,提供一个测试运行器,用来创建应用上下文,这个注解名是SpringJUnit4ClassRunner的别名
@SpringBootTest表示使用spring引导功能引导测试
空方法用来提示注解工作
1.3写一个应用
使用模板定义页面,使用控制器处理请求
处理请求
- 控制器响应请求,并把模型数据和请求转发给视图,然后生成html字符串给浏览器
@Controller
public class HomeController {
@GetMapping("/")
public String home() {
return "home";
}
}
@Controller使类能够被组件自动扫描发现,并在应用上下文创建实例,包括@Component,@Service,@Repository都和@Controller一样作用,换用也可
@GetMapping表示http get请求,路径为/,home()方法处理此请求
返回值为字符串,表示为一个视图的逻辑名,此demo引入了Thymeleaf,所以视图为同名模板,放在/templates/home.html
- 定义视图模板,用来渲染视图
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
<title>Taco Cloud</title>
</head>
<body>
<h1>Welcome to...</h1>
<img th:src="@{/images/TacoCloud.png}"/>
</body>
</html>
- 测试控制器,理解注解
package tacos.controller;
import static org.hamcrest.Matchers.containsString;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
@RunWith(SpringRunner.class)
@WebMvcTest(HomeController.class)
public class HomeControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testHomePage() throws Exception {
mockMvc.perform(get("/"))
.andExpect(status().isOk())
.andExpect(view().name("home"))
.andExpect(content().string(
containsString("welcome to ...")
));
}
}
使用@WebMvcTest而不是@SpringBootTest:@WebMvcTest专门用来在spring mvc应用中进行测试
- 构建、运行应用
书上用的是spring tool suite,这里用的是idea
springboot应用不需要部署到应用服务器,tomcat已经被嵌入了,当在pom.xml中引入web后就嵌入了tomcat - DevTools的好处:方便开发
- 代码改变,应用自动重启
原理:使用DevTools后,应用被2个独立的类加载器加载,一个放java code,property files,src/main下的,一个放依赖库,当由改变时,DevTools重载前一个和重启应用上下文,另一个不动
缺点:因为不重载依赖库,所以当改变依赖库时,还要手动重启应用- 自动刷新浏览器
需要浏览器插件支持,如LiveReload
- 自动关闭模板缓存
- 内建h2数据库的控制台
1.4Spring相关技术
the core Spring Framework是spring的基础,包括
- 核心容器和依赖注入框架
- spring web 框架:Spring MVC
- 数据持久性支持:template-based JDBC
- 支持响应式:spring webflux:spring mvc的变种
spring boot,优点太多
- 起步依赖
- 自动配置
- 内置监控,Actuator
spring data
- 核心框架提供的是基本的数据持久性支持,spring data更加强大
spring security
- 重量级安全框架,包括认证 授权 api安全
spring integration and spring batch
- 与其他应用相关集成等问题
spring cloud
- 用来做微服务开发