Skip to content

FRookie/Spring-Boot-Learning

Repository files navigation

Spring-Boot-Learning

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事件和监听器

(注:通常不需要使用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

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 添加了TomcatSpring 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.其有两个属性:

  1. fetch:属性的读取策略,有EAGERLAZY两种取值。分别表示主动抓取策略和延迟加载策略,默认为EAGER
  1. 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框架可以根据属性类型自动判断数据库中字段的类型,但是有例外:
    1. Date 类型无法确定数据库中字段类型究竟是DATE、TIME还是TIMESTAMP。
    1. String 的默认映射类型是VARCHAR,如果希望将String类型映射到特定数据库的BLOB或TEXT字段类型,则需要进行设置。

@Transient: 应用在实体类属性上,表示该属性不映射到数据库表,JPA会自动忽略该属性。

@Temporal: 应用到实体类属性上,表示该属性映射到数据库是一个时间类型,具体定义为:

  • @Temporal(TemporalType.DATE)映射为日期date(只有日期)
  • @Temporal(TemporalType.TIME)映射为日期time(只有时间)
  • @Temporal(TemporalType.TIMESTAMP)映射为日期datetime(日期+时间)

Logging

日志级别优先级由低到高分为:

TRACEDEBUGINFOWARNERRORFETALOFF

   Spring Boot的默认日志配置会在写日志消息时回显到控制台,级别为INFOWARNERROR的消息会被记录。启动应用时,通过 '--debug' 标识开启控制台的DEBUG级别日志记录,也可以在 'application.properties' 中配置指定。当DEBUG模式启用时,一系列核心loggers(内嵌容器、Hibernate、Spring Boot等)记录的日志会变多,但不会输出所有的信息。
相应的,可以通过指定 '--trace' 启动trace模式来追踪核心loggers(内嵌容器、Hibernate生成的Schema、Spring全部的portfolio )的所有日志信息。

文件输出

默认情况,Spring Boot只会讲日志信息打印到控制台而不会输出到日志文件中。但是可以通过logging.filelogging.path属性来设置。日志文件每达到10M就会被分割。

HttpMessageConverters

  • Spring MVC使用HttpMessageConverter接口转换 HTTP 请求和响应,其默认配置可以将对象转换为JSON(使用Jackson库)或XML文件,字符串默认使用UTF-8编码。
  • 可以使用Spring BootHttpMessageConverters类添加或自定义转换类。
@Configuration
public class MyConfiguration {
    @Bean
    public HttpMessageConverters customConverters() {
        HttpMessageConverter<?> additional = ...
        HttpMessageConverter<?> another = ...
    return new HttpMessageConverters(additional, another);
    }
}

    如上程序中,上下文出现的所有HttpMessageConverter bean都会被添加到converters列表中,因此可以使用这种方式来覆盖默认的转换器。

自定义JSON序列化和反序列化

  • 如果使用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支持

    跨域资源共享(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/**");
            }
        };
    }
  }

JSP的限制

    当使用内嵌Servlet容器启动Spring Boot应用时,容器对JSP的支持有一些限制:

1.Tomcat只支持war的打包形式,不支持可执行jar 2.Jetty只支持war的打包形式 3.Undertow不支持JSP 4.创建自定义的err.jsp页面不会覆盖默认的error handing视图。


Spring Boot --- Redis

    Redis是一个缓冲,消息中间件以及具有丰富特性的键值存储系统。Spring Boot为Jedis客户端library提供基本的自动配置,Spring Data Redis提供了在他之上的抽象,spring-boot-starter-redis 收集了需要的相关依赖。

连接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,默认你会获得一个连接池工厂。

About

springboot学习资料分析(中/英PDF)

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published