springInAction读书笔记1

spring in action

读了这本书的半本,感觉是一本不错的扫盲书,不是深入的书,没有深入的带你分析spring源码和设计模式.

spring在日常应用过程中大家都有使用,但是因为spring历经了多个版本,在不熟悉spring的时候,有些解决方案都是百度直接过来的,百度到的代码只是帮你解决了问题,但是并没有帮你正确的解决问题.spring的版本是向下兼容的,很多老版本的spring代码依然可以在新版本上运行,但是很多老代码的解决方案会显得臃肿和笨拙,不但影响代码的可读性,通常也会附带很多鸡肋一样的注释.而新版本的优化可能让你更优雅的使用spring,但是你并不知道这些新的解决方案.这本书就可以帮你了解spring那些新的,coooooooool的解决方案.

Spring基础

关于启动类

  • @SpringBootApplication包含了如下三个注解

    • @SpringBootConfig:生命该类是配置类.这个注解实际上是@configuation的特殊形式.
    • @EnableAutoConfiguration:启用Spring boot的自动配置.
    • @ComponentScan:启动组件扫描.
  • Main方法:

    这个main方法会调用SpringApplication中的静态的run()方法,后者会真正的执行应用的引导过程,也就是创建spring的应用上下文.在传递给run的两个参数中,一个是配置类,另一个是命令行参数.

  • 对大多数应用来说,最好还是为没有实现自动配置的功能创建一个单独的配置类.

Controller的单元测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@RunWith(SpringRunner.class)
@WebMvcTest(HomeController.class)//针对HomeController的web测试
public class HomeControllerTestTest{
@Autowired
private MockMvc mockMvc

@Test
public void testHomePage() throws Exxception{
this.mockMvc.perform("/") //发起对"/"的Get
.addExpect(status().isOk()) //期望得到HTTP200
.addExpect(view().name("home")) //期望得到home视图
.addExpect(content().string(containsString("welcome to ..."))) //期望包含"welcome to"
}
}

Spring DevTools

  • 热部署

    DevTool运行的时候,应用程序会加载到JVM两个独立的类加载器中.其中一个类加载器会加载你的Java代码/属性文件以及项目中”src/main/“路径下的几乎所有内容.另一个类加载器加载依赖的库.

  • 面向浏览器的资源(模板,JS,css等)发生变化时自动刷新浏览器

  • 自动禁用模板缓存

    需要浏览器的LiveReload插件

  • 内置了H2控制台

Spring构成

  • spirng核心框架
  • Spring Boot
  • Spring Data
  • Spring Security
  • Spring Integration和Spring Batch
  • Spring cloud

领域

应用的领域指的是他所要解决的主体范围:也就是会影响到应用理解的理念和概念.(深入了解看<领域驱动设计>)

Thymeleaf

  • 展示校验错误
1
2
3
<span class="validationError"
th:if="${#fields.hasEorrors('ccnumber')}"
th:errors="*{ccNumber}">CC Number Error</span>
  • 模板缓存

    | 模板 | 配置项 |
    | —————- | —————————- |
    | FreeMaker | spring.freemaker.cache |
    | Groovy Templates | spring.groovy.template.cache |
    | Mustache | spring.mustache.cache |
    | Thymeleaf | spring.thymeleaf.cache |

    true为启用,false为禁止

spring Data

  • spring data 替换jpa实现库 (P73,只是一个maven配置)
  • @PrePersist标注一个方法,对象在持久化之前,会调用这个方法,给某些字段加默认值.
1
2
3
4
@Prepersist
void createAt(){
this.createAt=new Date();
}
  • repository方法由一个动词,一个可选的主题(subject)/关键词by以及一个断言所组成的
  • repository方法的操作符,见P79.例如IsAfter/After等等..

Spring Security

  • 配置和加密
1
2
3
4
5
6
7
8
9
10
11
12
13
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter(){
@Override
protected void configure (AuthenticationManagerBuilder auth){
auth.jdbcAuthentication()
.dataSource(dataSource)
.userByUserNameQuery(
"select userName,.....")
.authoritiesByUsernameQuery("select ...")
.passwordEncoder(new StandaardPasswordEncoder("111111"))
}
}

passwordEncoder()方法可以接受Spring Security中PasswordEncoder接口的任意实现.Spring Security的加密模块包括了多个这样的实现.

  • BCryptPasswordEncoder:使用bcrypt强哈希加密
  • NoOpPasswordEncoder:不进行任何转码
  • Pbkdf2PasswordEncoder:使用PBKDF2加密
  • ScryptPasswordEncoder:使用scrypt哈希加密
  • StandardPasswordEncoder:使用SHA-256哈希加密

spring的配置

  • 属性源:
    • JVM系统属性
    • 操作系统环境变量
    • 命令行参数
    • application.properties
    • application.yml
  • @ConfigurationProperties (prefix=”taco.orders”),比如要给A类的pageSize配置属性,配置文件中需要是taco.orders.pageSize