[关闭]
@zero1036 2019-02-01T10:41:17.000000Z 字数 10655 阅读 4670

Spring-Boot基础汇总

Java-Spring


一、搭建

1.1 Maven pom

如果项目中需要访问资源时,Springboot必须通过插件spring-boot-maven-plugin运行

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>1.4.1.RELEASE</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>springboot-1</artifactId>
  12. <dependencies>
  13. <!--必要依赖项-->
  14. <dependency>
  15. <groupId>org.springframework.boot</groupId>
  16. <artifactId>spring-boot-starter-web</artifactId>
  17. </dependency>
  18. </dependencies>
  19. <build>
  20. <plugins>
  21. <!--以插件spring-boot-maven-plugin启动-->
  22. <plugin>
  23. <groupId>org.springframework.boot</groupId>
  24. <artifactId>spring-boot-maven-plugin</artifactId>
  25. <version>1.4.1.RELEASE</version>
  26. </plugin>
  27. </plugins>
  28. </build>
  29. </project>

1.2 项目结构

项目基础结构如下:

  1. user-service:
  2. user-contract:
  3. com.tg.user.contract: contract包】
  4. com.tg.user.contract.User Model or Contract类】
  5. user-dao:
  6. com.tg.user.dao: dao包】
  7. com.tg.user.dao.mapper.RuleMapper Mapper类】
  8. com.tg.user.dao.mapper.RuleDAOImpl DAO实现类】
  9. user-api:
  10. com.tg.user: api包】
  11. com.tg.user.service.AdminService controller or service类】
  12. com.tg.user.Application Application入口】

示例代码:

  1. package com.tg.user.dao.mapper
  2. //注意区分@Repository、@Service、@Controller@Component之间的应用场景
  3. @Repository //用于将数据访问层 (DAO 层 ) 的类标识为 Spring Bean
  4. public class RuleDAOImpl{
  5. public String getRule(){}
  6. }
  1. package com.tg.user.service
  2. public class AdminService{
  3. @Autowire //自动注入
  4. private RuleDAOImpl ruleDAO;
  5. }

注意事项


二、配置

2.3 自动装配

博文:https://rensanning.iteye.com/blog/2363467

彻底关闭自动装配的方法:spring.boot.enableautoconfiguration=false

类注解 @SpringBootApplication = @EnableAutoConfiguration + @ComponentScan + @Configuration

  1. @SpringBootConfiguration
  2. @EnableAutoConfiguration
  3. @ComponentScan(excludeFilters = {
  4. @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
  5. @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
  6. public @interface SpringBootApplication {
  7. // ...
  8. }
  9. @Configuration
  10. public @interface SpringBootConfiguration {
  11. // ...
  12. }
  13. @AutoConfigurationPackage
  14. @Import(EnableAutoConfigurationImportSelector.class)
  15. public @interface EnableAutoConfiguration {
  16. // ...
  17. }

可以执行自动导入配置类:@EnableAutoConfiguration可以通过@Import实现自定义导入

  1. @Configuration
  2. @Import({
  3. DispatcherServletAutoConfiguration.class,
  4. EmbeddedServletContainerAutoConfiguration.class,
  5. ErrorMvcAutoConfiguration.class,
  6. HttpEncodingAutoConfiguration.class,
  7. HttpMessageConvertersAutoConfiguration.class,
  8. JacksonAutoConfiguration.class,
  9. MultipartAutoConfiguration.class,
  10. ServerPropertiesAutoConfiguration.class,
  11. WebMvcAutoConfiguration.class
  12. })
  13. @ComponentScan
  14. public class SpringBootDemoApplication {
  15. public static void main(String[] args) {
  16. SpringApplication.run(SpringBootDemoApplication.class, args);
  17. }
  18. }

2.2 自定义配置类

配置类也可自行导入

  1. @Configuration
  2. @Import({
  3. DispatcherServletAutoConfiguration.class,
  4. EmbeddedServletContainerAutoConfiguration.class,
  5. ErrorMvcAutoConfiguration.class,
  6. HttpEncodingAutoConfiguration.class,
  7. HttpMessageConvertersAutoConfiguration.class,
  8. JacksonAutoConfiguration.class,
  9. MultipartAutoConfiguration.class,
  10. ServerPropertiesAutoConfiguration.class,
  11. WebMvcAutoConfiguration.class
  12. })
  13. @ComponentScan
  14. public class SpringBootDemoApplication {
  15. public static void main(String[] args) {
  16. SpringApplication.run(SpringBootDemoApplication.class, args);
  17. }
  18. }

编写配置类的方法:举例:WebMvcAutoConfiguration

  1. @Configuration
  2. @ConditionalOnWebApplication(type = Type.SERVLET)
  3. @ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurerAdapter.class })
  4. @ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
  5. @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
  6. @AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, ValidationAutoConfiguration.class })
  7. public class WebMvcAutoConfiguration {
  8. @Bean
  9. @ConditionalOnMissingBean(HiddenHttpMethodFilter.class)
  10. public OrderedHiddenHttpMethodFilter hiddenHttpMethodFilter() {
  11. return new OrderedHiddenHttpMethodFilter();
  12. }
  13. // ...
  14. }

2.3 自定义配置类配置条件

2.5 @Value注解

最简单方法,不过要注意以下三点:

1、输入方式不是缺${},否则会报错如下:

  1. #Properties Config:
  2. jedis.pool.config.maxTotal=100
  3. #Code:
  4. @Value("jedis.pool.config.maxTotal")
  5. private int maxTotal;
  6. #Error
  7. Error: Unsatisfied dependency expressed through field 'maxTotal'; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'int'; nested exception is java.lang.NumberFormatException: For input string: "jedis.pool.config.maxTotal"

2、检查Properties配置是否正确,不要忘了要添加到application.properties

  1. #Properties Config:
  2. jedis.pool.config.maxTotal=${jedis.pool.config.maxTotal}

否则报错:

  1. nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'jedis.pool.config.maxTotal' in string value "${jedis.pool.config.maxTotal}"

3、注解变量不要以static与final修饰


三、日志

3.1 关于SLF4J与Logback简介

SLF4J——Simple Logging Facade For Java,它是一个针对于各类Java日志框架的统一Facade抽象。Java日志框架众多——常用的有java.util.logging, log4j, logback,commons-logging, Spring框架使用的是Jakarta Commons Logging API (JCL)。而SLF4J定义了统一的日志抽象接口,而真正的日志实现则是在运行时决定的——它提供了各类日志框架的binding。

Logback是log4j框架的作者开发的新一代日志框架,它效率更高、能够适应诸多的运行环境,同时天然支持SLF4J。同时也是Spring Boot自带的日志系统。

3.2 常见配置示例

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration>
  3. <jmxConfigurator/>
  4. <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
  5. <!-- 典型的日志pattern -->
  6. <encoder>
  7. <pattern>%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
  8. </encoder>
  9. </appender>
  10. <appender name="serverAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
  11. <file>logs/server.log</file>
  12. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  13. <!-- 以日期切分日志,同理,可以使用%d{yyyy-MM-dd_HH-mm}来定义精确到分的日志切分方式。 -->
  14. <fileNamePattern>logs/server.%d{yyyy-MM-dd}.log</fileNamePattern>
  15. <!-- 保留 30天数据,默认无限-->
  16. <maxHistory>30</maxHistory>
  17. </rollingPolicy>
  18. <encoder>
  19. <pattern>[%date{ISO8601}] [%X{PtxId}] %logger{80} %thread [%level] - %msg%n</pattern>
  20. </encoder>
  21. </appender>
  22. <!-- 这些日志不要打印debug,不然数量太多 -->
  23. <logger name="org.springframework" level="WARN"/>
  24. <logger name="org.spring" level="WARN"/>
  25. <logger name="io.grpc.netty" level="WARN"/>
  26. <logger name="org.eclipse.jetty" level="WARN"/>
  27. <logger name="jndi" level="WARN"/>
  28. <logger name="redis.clients" level="WARN"/>
  29. <logger name="application" level="WARN"/>
  30. <logger name="org.apache" level="WARN"/>
  31. <!-- root -->
  32. <root level="INFO">
  33. <appender-ref ref="console"/>
  34. <appender-ref ref="serverAppender"/>
  35. </root>
  36. </configuration>

3.3 Pattern模式选项说明

示例日志:

  1. [2017-04-23 16:41:37,178] [INFO] c.w.p.s.r.CodeConsumer SimpleAsyncTaskExecutor-1 - 正在处理发奖确认消息,请求流水号:null;客户Id148;发奖成功:false

3.4 日志文件切分及保留期限

示例:

  1. <configuration>
  2. <jmxConfigurator />
  3. <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
  4. <!-- 典型的日志pattern -->
  5. <encoder>
  6. <pattern>%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
  7. </encoder>
  8. </appender>
  9. <appender name="serverAppender" class="ch.qos.logback.core.rolling.RollingFileAppender" >
  10. <file>logs/server.log</file>
  11. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  12. <fileNamePattern>logs/server.%d{yyyy-MM-dd}.log</fileNamePattern>
  13. <!-- 保留 30天数据,默认无限-->
  14. <maxHistory>30</maxHistory>
  15. </rollingPolicy>
  16. <encoder>
  17. <pattern>[%date{ISO8601}] [%X{PtxId}] %logger{80} %thread appName [%level] - %msg%n</pattern>
  18. </encoder>
  19. </appender>
  20. <!-- 这些日志不要打印debug,不然数量太多 -->
  21. <logger name="org.springframework" level="WARN" />
  22. <logger name="org.spring" level="WARN" />
  23. <logger name="io.grpc.netty" level="WARN" />
  24. <logger name="org.eclipse.jetty" level="WARN" />
  25. <logger name="jndi" level="WARN" />
  26. <logger name="redis.clients" level="WARN" />
  27. <logger name="application" level="WARN" />
  28. <logger name="com.whtr.dolphin.scenter" level="DEBUG"/>
  29. <logger name="io.grpc.internal.SerializingExecutor" level="OFF"/>
  30. <logger name="org.apache" level="WARN" />
  31. <!-- root -->
  32. <root level="INFO">
  33. <appender-ref ref="console" />
  34. <appender-ref ref="serverAppender" />
  35. </root>
  36. </configuration>

四、MVC

4.1 日期格式转换

Spring boot默认使用jackson序列化与反序列化请求与回复。契约bean可以使用Date类型,并通过@JsonFormat处理日期格式转换问题。如下:注意需要增加入参timezone=GMT+8设置时区,否则会少两个小时。

  1. @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
  2. public Date getCreateDate() {
  3. return createDate;
  4. }

4.2 跨域访问

通过WebMvcConfigurerAdapter增加授权域名:allowedOrigins()

  1. @Configuration
  2. public class CustomCorsConfiguration extends WebMvcConfigurerAdapter {
  3. @Override
  4. public void addCorsMappings(CorsRegistry registry) {
  5. super.addCorsMappings(registry);
  6. registry.addMapping("/redPacketAdminService/active").allowedOrigins("http://almonds-yingxiao-port80-wm-sit.k8s.ppmoney.io");
  7. registry.addMapping("/test/foot").allowedOrigins("http://almonds-yingxiao-port80-wm-sit.k8s.ppmoney.io");
  8. }
  9. }

附录

Spring Boot 推荐的基础 POM 文件

名称 说明
spring-boot-starter 核心 POM,包含自动配置支持、日志库和对 YAML 配置文件的支持。
spring-boot-starter-amqp 通过 spring-rabbit 支持 AMQP。
spring-boot-starter-aop 包含 spring-aop 和 AspectJ 来支持面向切面编程(AOP)。
spring-boot-starter-batch 支持 Spring Batch,包含 HSQLDB。
spring-boot-starter-data-jpa 包含 spring-data-jpa、spring-orm 和 Hibernate 来支持 JPA。
spring-boot-starter-data-mongodb 包含 spring-data-mongodb 来支持 MongoDB。
spring-boot-starter-data-rest 通过 spring-data-rest-webmvc 支持以 REST 方式暴露 Spring Data 仓库。
spring-boot-starter-jdbc 支持使用 JDBC 访问数据库
spring-boot-starter-security 包含 spring-security
spring-boot-starter-test 包含常用的测试所需的依赖,如 JUnit、Hamcrest、Mockito 和 spring-test 等
spring-boot-starter-velocity 支持使用 Velocity 作为模板引擎
spring-boot-starter-web 支持 Web 应用开发,包含 Tomcat 和 spring-mvc
spring-boot-starter-websocket 支持使用 Tomcat 开发 WebSocket 应用
spring-boot-starter-ws 支持 Spring Web Services
spring-boot-starter-actuator 添加适用于生产环境的功能,如性能指标和监测等功能
spring-boot-starter-remote-shell 添加远程 SSH 支持
spring-boot-starter-jetty 使用 Jetty 而不是默认的 Tomcat 作为应用服务器
spring-boot-starter-log4j 添加 Log4j 的支持
spring-boot-starter-logging 使用 Spring Boot 默认的日志框架 Logback
spring-boot-starter-tomcat 使用 Spring Boot 默认的 Tomcat 作为应用服务器

参考自:此处输入链接的描述

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注