SpringBoot实战
第一章 入门
1.1 Spring风云再起
1.1.2 Spring Boot精要
自动配置
针对Spring应用程序常见应用功能,Spring Boot能自动提供相关配置。
如果Spring Boot在应用程序的Classpath里发现H2数据库的库,则会自动配置一个嵌入式H2数据库。
起步依赖
告诉Spring Boot需要什么功能,它就能引入需要的库。
此前依赖多个包,但是依靠依赖传递,Spring Boot可以只依赖spring-boot-starter。
命令行界面
只需要写代码就能完成完整应用程序,无需传统项目构建。
CLI能检测到你使用了哪些类,它知道Classpath中添加哪些起步依赖能让他运转起来。
Actuator
监控运行时信息
1.1.3 Spring Boot不是什么
- 不是应用服务器。但是它在应用程序里嵌入了一个Servlet容器以实现这一功能。
- 没有实现JPA JMS等,但是它自动配置了某个JPA实现。
- 没有引入任何形式的代码生成,利用了Spring4条件化配置特性。
- 从本质上说,Spring Boot就是Spring,它做了那些没有它你自己也会去做的Spring Bean配置。
1.2 Spring Boot入门

- Application.java 一个带有main()方法的类,用于引导启动应用程序。
- application.properties 一个配置文件,可以根据需求添加配置属性。
第二章 开发第一个应用程序
2.1 运用Spring Boot
2.2.1 查看初始化Spriong Boot新项目
@SpringBootApplication
public class ReadingListApplication {
public static void main(String[] args) {
SpringApplication.run(ReadingListApplication.class, args);
}
}
@SpringBootApplication将@Configuration、@ComponentScan、@EnableAutoConfiguration(Spring Boot自动配置注解)
这里的main方法可以让你在命令行中把该应用程序当做一个可执行JAR文件来运行
不用告诉Spring Boot为你加载application.properties,只要存在就会被加载
2.2 使用起步依赖
2.2.1 指定基于功能的依赖
起步依赖本质上是一个Maven对象模型,定义了对其他库的传递依赖。
Maven总是会用最近的依赖。
2.3 使用自动配置
Spring Boot的自动配置是一个运行时过程,考虑了众多因素。
- 在向应用程序加入Spring Boot时,有个名为spring-boot-autoconfigure的文件,其中包含了很多配置类。每个配置类都在应用程序的Classpath里。
- 利用了Spring的条件化配置。
public class JdbcTemplateCondition implements Condition {
@Override
public boolean matches(CondtionContext context, AnnotatedTypeMetadata meta data) {
try {
context.getClassLoader().loadClass("org.springframework.jdbc.core.JdbcTemplate");
return true;
} catch (Exception e) {
return false;
}
}
}
- 这个例子里,只有当JdbcTemplateCondition类的条件成立时才会创建MyService Bean,需要Classpath里有JdbcTemplate
@Conditional(JdbcTemplateCondition.class)
public MyService myService() {
}

- 还有很多可能的自动化配置,比如Classpath里有H2,就会创建嵌入式的H2数据库Bean;有Hibernate,就会配置相关Bean;有SPring MVC,就会配置DispatcherServlet并启用。
第三章 自定义配置
3.1 覆盖Spring Boot自动配置
3.1.3 掀开自动配置的神秘面纱
@ConditionOnMissingBean注解是覆盖自动配置的关键
@Bean
@ConditionOnMissingBean(JdbcOperation.class)
public JdbcTemplate jdbcTemplate() {
return new JdbcTemplate(this.dataSource);
}
Spring Boot的设计是加载应用级配置,随后再考虑自动配置类。
3.2 通过属性文件外置配置
Spring Boot自动配置的Bean提供了300多个用于微调的属性,可以在application.properties文件中设置
3.2.2 应用程序Bean的配置外置
@Controller
@RequestMapping("/")
@ConfigurationProperties(prefix="amazon")
public class ReadingListController {
private String associateId;
public void setAssociateId(String associateId) {}
@RequestMapping(method = RequestMethod.GET)
public String readerBooks() {
...
model.addAttribute("amazonId", associateId);
}
}
- @ConfigurationProperties注解,说明该Bean的属性应该是通过setter从配置属性值注入的。这个属性可以填在application.properties里
3.2.3 使用profile进行配置
- 遵循application-{profile}.properties这种命名格式,就可以提供特定于Profile的属性了。
第四章 测试
4.1 集成测试自动配置
SpringJUnit4ClassRunner,一个JUnit类运行器,会为测试加载Spring应用程序上下文,并为测试类自动织入所需Bean
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = AddressBookConfiguration.class)
public class AddressServiceTests {
@Autowired
private AddressService addressService;
@Test
public void testService() {
xxxx
}
}
- @Runwith开启集成测试支持。
- @ContextConfiguration指定如何加载应用程序上下文。
4.2 测试Web应用程序
4.2.1 模拟Spring MVC
- standaloneSetup() 构建一个MockMVC,提供一个或多个手工创建并配置的控制器。
- webAppContextSetup() 使用Spring应用程序上下文来构建Mock MVC,该上下文里可以包含一个或多个配置好的控制器。
@Runwith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = ReadingListApplication.class)
@WebAppConfiguration
public class MockMvcWebTests {
@Autowired
private WebApplicationContext webContext;
private MockMvc mockMvc;
@Before
public void setupMockMvc() {
mockMvc = MockMvcBuilders.webAppContextSetup(webContext).build();
}
}

4.2.2 测试Web安全
- 在MockMvc实例时运用Spring Security配置器
@Before
public void setupMockMVC() {
mockMvc = MockMvcBuilders.webAppContextSetup(webContext).apply(springSecurity()).build();
}
- 需要身份验证的请求,Spring Security提供了两个注解@WithMockUser、@WithUserDetails
- @WithMockUser是可以不对UserDetails对象查询,直接创建一个UserDetails对象
@Test
@WithUserDetails("craig")
public void homePage_authenticatedUser() throws Exception {
Reader expectReader = new Reader();
expectedReader.setUsername("");
}
4.3 测试运行中的应用程序
@WebIntegrationTest 可以启动一个嵌入式Servlet容器,可以发起真实的Http请求
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = ReadingListApplication.class)
@WebIntegrationTest
public class SimpleWebTest {
@Test(expected=HttpClientErrorException.class)
public void pageNotFound() {
try {
RestTemplate rest = new RestTemplate();
rest.getForObject("http://localhost:8080/bogousPage", String.class);
fail("Should result in HTTP 404");
}
}
}
第七章 Actuator
7.1 Actuator端点
Spring Boot Actuator的关键特性时在应用程序里提供众多Web端点,通过他们了解应用程序运行时的内部情况。
比如这样请求 http://localhost:8080/beans
7.4 定制Actutor
计数有CounterService实例可以使用;GaugeService可以把值记录到特定的名称中。
完全自定义的度量可实现PublicMetrics接口
public interface PublicMetrics {
Collection<Metric<?>> metrics();
}

- 通过TraceRepository可以将trace信息保存至外部存储
public interface TraceRepository {
List<Trace> findAll();
void add(Map<String, Object> traceInfo);
}
7.5 保护Actuator端点
@Override
protected void configure(HttppSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/shutdown").access("hasRole('ADMIN')")
}


浙公网安备 33010602011771号