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')")
}

posted on 2022-01-08 16:40  kaiker  阅读(12)  评论(0)    收藏  举报