springboot学习资料分析(中/英PDF)
父节点:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>###</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
子依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
</dependencies>
Spring-Boot 项目构建是 pom文件中会继承父节点spring-boot-starter-parent(这是项目自动构建时所继承的,当然根据公司需要可自定义父节点文件), 此父节点文件中继承了spring-boot-dependencies节点(其中根据spring-boot构建版本的不同指定了相关jar依赖,plugin依赖以及其对应的兼容版本)。 spring-boot-starter-parent节点中定义了maven默认的配置:
<resource>
<filtering>true</filtering>
<directory>${basedir}/src/main/resources</directory>
<includes>
<include>**/application*.yml</include>
<include>**/application*.yaml</include>
<include>**/application*.properties</include>
</includes>
</resource>
<configuration>
<verbose>true</verbose>
<dateFormat>yyyy-MM-dd'T'HH:mm:ssZ</dateFormat>
<generateGitPropertiesFile>true</generateGitPropertiesFile>
<generateGitPropertiesFilename>${project.build.outputDirectory}/git.properties</generateGitPropertiesFilename>
</configuration>
UTF-8
...
(注:通常不需要使用application事件,但在某些场合除外,如在Spring Boot内部处理各种任务。SkrSkrSkr...)
除了常见的Spring事件(ContextRefreshedEvent),SpringApplication也会发送其它的Application事件。
这些事件有些是在ApplicationContext创建之前触发的,因此这些事件不能通过@Bean来注册监听器,只能通过SpringApplication.assListeners(...)或SpringApplicationBuilder.listeners(...)方法去注册。
如果想让监听器去自动注册而不去关心应用的创建方式,可以在工程中添加META-INFO/spring.factories文件,并使用org.springframework.context.ApplicationListener作为Key指向监听器,如:
org.springframework.context.ApplicationListener=com.example.project.MyListener
应用运行时,事件会按照以下次序来执行:
- 在运行开始,但除了监听器注册和初始化之外的任何处理之前,会发送一个ApplicationStartedEvent。
- 在Environment将被用于已知的上下文,但在上下文被创建之前,会发送一个ApplicationEnvironmentPreparedEvent。
- 在refresh开始之前,但在Bean加载后会发送一个ApplicationPreparedEvent。
- 在refresh开始之后,相关的回调处理完,会发送一个ApplicationReadyEvent,表示应用准备好接受请求。
- 如果启动过程中出现异常,则会发送一个ApplicationFailedEvent。
JPA(Java Persistent API):Java持久化API,它是一种Java持久化的规范 JPA统一已有的ORM框架,给开发者提供了统一、相对简单的持久化工具,降低了程序与ORM产品之间的耦合度,提供程序的可移植性。 JPA本身不可以直接在程序中使用,需要依赖实现了JPA规范的产品,如Hibernate。 JPA产品,包括:
- ORM映射元数据
- Java持久化API(CRUD)
- 查询语言JPQL
在Spring Boot中JPA从技术层面上来讲,其实是一个spring-boot-starter-data-jpa模块,包括:
Hibernate
Spring Data JPA基于JPA进一步简化了数据访问层的实现,提供了类似一种声明式编程方式,开发者访问数据层不需要重复的模板代码,只需要编写Repository接口,他就根据方法名自动生成实现
Spring ORM是Spring Framework对ORM的核心支撑。
使用时,只需在pom.xml文件中引入spring-boot-starter-data-jpa依赖即可:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
部分注解解析 -----> 详细点此处
@RestController:这是SpringMVC中的注解,是@Responsebody和@Controller的结合。注明这是一个Controller类
用于URL请求所访问和映射的类,是一个支持REST的注解,且指明返回体为字符串类型。
@ResquestMapping:此注解指明路由信息,任何请求都会根据路由地址映射到对应的方法上。
@EnableAutoConfiguration:这个注解告诉Spring Boot根据添加的jar依赖猜测你想如何配置Spring。由于 spring-boot-starter-web 添加了Tomcat和Spring MVC,所以auto-configuration将假定你正在开发一个web应用,并对Spring进行相应地设置。
@Entity:用于标注在数据库表映射的实体类上,表明该实体类被JPA所管理.
@Table:应用于实体类,通过name属性指定对应该实体类映射表的名称.
@Id:应用于实体类的属性或者属性所对应的getter方法上,表明该属性映射为数据表的主键。
@GeneratedValue:与@Id一起使用,表明主键的生成策略,可以通过strategy属性指定。
### 生成策略:
+ AUTO : JPA自动选择的策略,是默认选项。
+ IDENTITY : 采用数据库<kbd>ID</kbd>自增长的方式生成主键值,Oracle不支持此策略。
+ SEQUENCE : 通过序列产生主键,通过<kbd>@SequenceGenerator</kbd>注解指定序列名,Mysql不支持此策略。
+ TABLE : 采用表生成方式来生成主键值,这种方式比较通用,但是效率较低。
@Basic:应用于属性,表示该属性映射到数据库表,@Entity标注的实体类的所有属性,默认即为@Basic.其有两个属性:
- fetch:属性的读取策略,有EAGER和LAZY两种取值。分别表示主动抓取策略和延迟加载策略,默认为EAGER。
- optional:表示该属性是否允许为NULL,默认为TRUE。
@Basic(fetch = FetchType.LAZY)标注某属性时,表示只有调用Hibernate对象的该属性的get方法时,才会从数据库表中查找对应该属性的字段值。
@Column:应用于实体类的属性,可以指定该数据库表字段的名字和其他属性。其属性包括:
- name: 表示数据库表中该字段的名称,默认情形属性名称一致。
- nullable: 表示该字段是否允许为null,默认为true .
- unique: 表示该字段是否为唯一标识,默认为false。
- insertable: 表示在ORM框架执行插入操作时,该字段是否应出现INSERT语句中,默认为true。
- length:表示该字段的大小,仅对String类型的字段有效。
- updateable:表示在ORM框架执行更新操作时,该字段是否应该出现在UPDATE语句中,默认为true。对于已经创建就不能更改的字段,该属性非常有用,比如email属性。
- columnDefinition:表示该字段在数据库表中的实际类型。通常ORM框架可以根据属性类型自动判断数据库中字段的类型,但是有例外:
- Date 类型无法确定数据库中字段类型究竟是DATE、TIME还是TIMESTAMP。
- String 的默认映射类型是VARCHAR,如果希望将String类型映射到特定数据库的BLOB或TEXT字段类型,则需要进行设置。
@Transient: 应用在实体类属性上,表示该属性不映射到数据库表,JPA会自动忽略该属性。
@Temporal: 应用到实体类属性上,表示该属性映射到数据库是一个时间类型,具体定义为:
- @Temporal(TemporalType.DATE)映射为日期date(只有日期)
- @Temporal(TemporalType.TIME)映射为日期time(只有时间)
- @Temporal(TemporalType.TIMESTAMP)映射为日期datetime(日期+时间)
日志级别优先级由低到高分为:
TRACE、DEBUG、INFO、WARN、ERROR、FETAL、OFF
Spring Boot的默认日志配置会在写日志消息时回显到控制台,级别为INFO、WARN、ERROR的消息会被记录。启动应用时,通过 '--debug' 标识开启控制台的DEBUG级别日志记录,也可以在 'application.properties' 中配置指定。当DEBUG模式启用时,一系列核心loggers(内嵌容器、Hibernate、Spring Boot等)记录的日志会变多,但不会输出所有的信息。
相应的,可以通过指定 '--trace' 启动trace模式来追踪核心loggers(内嵌容器、Hibernate生成的Schema、Spring全部的portfolio )的所有日志信息。
默认情况,Spring Boot只会讲日志信息打印到控制台而不会输出到日志文件中。但是可以通过logging.file或logging.path属性来设置。日志文件每达到10M就会被分割。
- Spring MVC使用HttpMessageConverter接口转换 HTTP 请求和响应,其默认配置可以将对象转换为JSON(使用Jackson库)或XML文件,字符串默认使用UTF-8编码。
- 可以使用Spring Boot的HttpMessageConverters类添加或自定义转换类。
@Configuration
public class MyConfiguration {
@Bean
public HttpMessageConverters customConverters() {
HttpMessageConverter<?> additional = ...
HttpMessageConverter<?> another = ...
return new HttpMessageConverters(additional, another);
}
}
如上程序中,上下文出现的所有HttpMessageConverter bean都会被添加到converters列表中,因此可以使用这种方式来覆盖默认的转换器。
- 如果使用Jackson序列化,反序列化Json数据,可以自定义JsonSerializer和JsonDeserializer类。
- 自定义序列化器(serializers)通常使用Module注册到Jackson,但是Spring Boot提供了@JsonComponent注解这个替代方式,将序列化器Spring Beans。
Spring Boot 默认提供一个/error映射用来已合适的方式处理所有的错误,并将它注册为servlet容器中全局的错误页面。为了完全替代默认的行为,可以实现ErrorController,并注册一个该类型的bean定义,或简单添加一个ErrotAttributes类型的bean以使用现存的机制,只是替代了显示的内容。
注:BasicErrorController可以作为自定义ErrorController的基类,如果想添加对新的context type的处理(默认处理text/html),这个方式会很有帮助。
只需继承 BasicErrorController,添加一个public方法,并注解带有produces属性的@RequestMapping,然后创建该新类型的bean。
@ControllerAdvice(basePackageClasses = FooController.class)
public class FooControllerAdvice extends ResponseEntityExceptionHandler {
@ExceptionHandler(YourException.class)
@ResponseBody
ResponseEntity<?> handleControllerException(HttpServletRequest request, Throwable ex) {
HttpStatus status = getStatus(request);
return new ResponseEntity<>(new CustomErrorType(status.v
alue(), ex.getMessage()), status);
}
private HttpStatus getStatus(HttpServletRequest request) {
Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
if (statusCode == null) {
return HttpStatus.INTERNAL_SERVER_ERROR;
}
return HttpStatus.valueOf(statusCode);
}
}
跨域资源共享(CORS)是一个大多数浏览器都实现了的W3C标准,它允许以任何灵活的方式指定跨域请求如何被授权,而不是采用不安全、性能低的方式,如IFRAME和JSONP。
从4.2版本后,Spring MVC对CORS提供了开箱即用的支持。无需添加任何特殊配置,只需在Spring Boot应用的Controller方法上注解@CrossOrigin,并添加CORS配置。通过注册一个自定义的addCorsMappings(CorsRegistry)方法的WebMvcConfigurer bean可以指定全局CORS配置:
@Configuration
public class MyConfiguration {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**");
}
};
}
}
当使用内嵌Servlet容器启动Spring Boot应用时,容器对JSP的支持有一些限制:
1.Tomcat只支持war的打包形式,不支持可执行jar 2.Jetty只支持war的打包形式 3.Undertow不支持JSP 4.创建自定义的err.jsp页面不会覆盖默认的error handing视图。
Redis是一个缓冲,消息中间件以及具有丰富特性的键值存储系统。Spring Boot为Jedis客户端library提供基本的自动配置,Spring Data Redis提供了在他之上的抽象,spring-boot-starter-redis 收集了需要的相关依赖。
你可以注入一个自动配置的RedisConnectionFactory,StringRedisTemplate或普通的RedisTemplate实例,或任何其他Spring Bean。默认情况下,这个实例将尝试使用localhost:6379连接Redis服务器:
@Component
public class MyBean {
private StringRedisTemplate template;
@Autowired
public MyBean(StringRedisTemplate template) {
this.template = template;
}
// ...
}
如果添加一个自定义或其他自动配置类型的@Bean,他将替代默认实例(除了RedisTemplate的情况,它是根据bean的名字‘redisTemplate’,而不是类型进行排除的。)如果在classpath路径下存在commons-pool2,默认你会获得一个连接池工厂。